Hi,
I worked on the nrf51 for some years and recently moved over to the nrf52. PPI is a new interface I am exploring. I am having trouble restarting a RTC which was started by the CPU and Stopped by PPI.
If the RTC is started from PPI(say some GPIOTE event assigned to PPI), I have no trouble with the STOP, CLEAR, START task sequence.
If the RTC is first started from the CPU (say in main before the while loop), I use PPI to STOP the RTC, immediately clear the RTC CC0 event, then restart it later with RTC_START using PPI. It does not start, but I do see the counter get cleared. Is there something I am possibly missing?
This is non-soft device by the way. I'm working off the RTC example... although in the future I will introduce the softdevice
Hi,
Instead of using the driver APIs, I tried with just the HAL and still turn up with the same results. I also switched to RTC0 and RTC2... same behavior. Here is the example I am testing
void gpioConfig(void)
{
NRF_GPIOTE->CONFIG[0] = ( (GPIOTE_CONFIG_MODE_Task << GPIOTE_CONFIG_MODE_Pos) |
(22 << GPIOTE_CONFIG_PSEL_Pos) |
(GPIOTE_CONFIG_POLARITY_Toggle << GPIOTE_CONFIG_POLARITY_Pos) |
(GPIOTE_CONFIG_OUTINIT_High << GPIOTE_CONFIG_POLARITY_Pos) );
}
static void clock_config(void)
{
// Recommended by Nordic before using RTC
// See nRF52832_Rev_2_Errata_v1.0 | 3.3 [20] RTC: Register values are invalid
NRF_CLOCK->EVENTS_LFCLKSTARTED = 0;
NRF_CLOCK->TASKS_LFCLKSTART = 1;
while (NRF_CLOCK->EVENTS_LFCLKSTARTED == 0) {}
NRF_RTC2->TASKS_STOP = 0;
}
static void rtc_config(void)
{
NRF_RTC2->EVTENSET = RTC_EVTENSET_COMPARE0_Enabled <<RTC_EVTENSET_COMPARE0_Pos;
NRF_RTC2->PRESCALER = 2183;
NRF_RTC2->CC[0] = 1;
}
static void ppi_config(void)
{
ret_code_t err_code;
NRF_PPI->CH[0].EEP = (uint32_t) &NRF_RTC2->EVENTS_COMPARE[0];
NRF_PPI->CH[0].TEP = (uint32_t)&NRF_RTC2->TASKS_STOP;
NRF_PPI->FORK[0].TEP = (uint32_t)&NRF_RTC2->TASKS_CLEAR;
NRF_PPI->CHEN |= (PPI_CHEN_CH0_Enabled << PPI_CHEN_CH0_Pos);
NRF_PPI->CH[1].EEP = (uint32_t) &NRF_RTC2->EVENTS_COMPARE[0];
NRF_PPI->CH[1].TEP = (uint32_t)&NRF_RTC2->TASKS_START;
NRF_PPI->FORK[1].TEP = (uint32_t)&NRF_GPIOTE->TASKS_OUT[0];
NRF_PPI->CHEN |= (PPI_CHEN_CH1_Enabled << PPI_CHEN_CH1_Pos);
}
int main(void)
{
NRF_POWER->DCDCEN = 1;
gpioConfig();
rtc_config();
ppi_config();
clock_config();
NRF_RTC2->TASKS_START=1;
while(1)
{
__WFE();
}
}