This discussion has been locked.
You can no longer post new replies to this discussion. If you have a question you can start a new discussion

use ppi and set usb sof as rtc1 source

To the kind attention of Nordic support team,

I have got a freertos project and usb is enabled (usb enumeration is done and usb interrupts are correctly working before even starting the scheduler).

In FreeRTOSConfig.h other than having:

#define FREERTOS_USE_RTC 0 and #define FREERTOS_USE_SYSTICK 1 

I'd like to add a third custom option:

#define FREERTOS_USE_USB_SOF 2

and change vPortSetupTimerInterrupt initialization (in case FREERTOS_USE_USB_SOF is set), so that usb sof event is triggering rtc1 overflow interrupt

(RTC1_IRQHandler == xPortSysTickHandler).

I was trying to modify like this, but something is missing it seems doesn't work. Could you please give me a hand if is not too much trouble, at least in how should theoretically be? (I'll update

if I have any news):

void vPortSetupTimerInterrupt( void )
{

nrf_drv_clock_lfclk_request(NULL); // assume that usb sof is triggering 0x00FFFFF0, then lfck is needed to do the actual overflow?

nrf_rtc_prescaler_set(portNRF_RTC_REG, portNRF_RTC_PRESCALER);

nrf_rtc_int_enable (portNRF_RTC_REG, RTC_INTENSET_OVRFLW_Msk); // enable overflow interrupt

nrf_rtc_task_trigger (portNRF_RTC_REG, NRF_RTC_TASK_CLEAR); //

// ppi re routing events_sof ---> tasks_trigovrflw

NRF_PPI->CH[0].EEP = (uint32_t)&NRF_USBD->EVENTS_SOF;
NRF_PPI->CH[0].TEP = (uint32_t)&NRF_RTC1->TASKS_TRIGOVRFLW;
NRF_PPI->CHENSET = (1 << 0);

NRF_RTC1->EVTEN = 2;

NRF_RTC1->TASKS_START = 1; // to enable counting

NVIC_SetPriority(portNRF_RTC_IRQn, configKERNEL_INTERRUPT_PRIORITY);
NVIC_EnableIRQ(portNRF_RTC_IRQn);

/*

working code

nrf_drv_clock_lfclk_request(NULL);

nrf_rtc_prescaler_set(portNRF_RTC_REG, portNRF_RTC_PRESCALER);
nrf_rtc_int_enable (portNRF_RTC_REG, RTC_INTENSET_TICK_Msk);
nrf_rtc_task_trigger (portNRF_RTC_REG, NRF_RTC_TASK_CLEAR);
nrf_rtc_task_trigger (portNRF_RTC_REG, NRF_RTC_TASK_START);
nrf_rtc_event_enable(portNRF_RTC_REG, RTC_EVTEN_OVRFLW_Msk);

NVIC_SetPriority(portNRF_RTC_IRQn, configKERNEL_INTERRUPT_PRIORITY);
NVIC_EnableIRQ(portNRF_RTC_IRQn);*/
}

Parents
  • Not sure if I understand what you want to achieve here, but why not just use the timer in counter mode, and connect SOF event to the COUNTER task of the timer?

    Kenneth

  • Hi Kenneth, yes you got my meaning, thank you. Latest question, what you are suggesting wouldn't be possible for rtc1, thought, would it? I mean it seems not to have a counter mode, or am I wrong. Should be the case we should use another hardware timer, that is ok for us, as we don't have power issue, in this particular project. Thank you 

Reply
  • Hi Kenneth, yes you got my meaning, thank you. Latest question, what you are suggesting wouldn't be possible for rtc1, thought, would it? I mean it seems not to have a counter mode, or am I wrong. Should be the case we should use another hardware timer, that is ok for us, as we don't have power issue, in this particular project. Thank you 

Children
Related