/** @brief Function for initializing the PPI peripheral. */ static void ppi_init(void) { uint32_t err_code = NRF_SUCCESS; err_code = nrf_drv_ppi_init(); APP_ERROR_CHECK(err_code); // Configure 1st available PPI channel to stop TIMER0 counter on TIMER1 COMPARE[0] match, which is every even number of seconds. err_code = nrf_drv_ppi_channel_alloc(&ppi_channel1); APP_ERROR_CHECK(err_code); err_code = nrf_drv_ppi_channel_assign(ppi_channel1, nrf_drv_timer_event_address_get(&timer1, NRF_TIMER_EVENT_COMPARE0), nrf_drv_timer_task_address_get(&timer0, NRF_TIMER_TASK_STOP)); APP_ERROR_CHECK(err_code); // Configure 2nd available PPI channel to start timer0 counter at TIMER2 COMPARE[0] match, which is every odd number of seconds. err_code = nrf_drv_ppi_channel_alloc(&ppi_channel2); APP_ERROR_CHECK(err_code); err_code = nrf_drv_ppi_channel_assign(ppi_channel2, nrf_drv_timer_event_address_get(&timer2, NRF_TIMER_EVENT_COMPARE0), nrf_drv_timer_task_address_get(&timer0, NRF_TIMER_TASK_START)); APP_ERROR_CHECK(err_code); // Enable both configured PPI channels err_code = nrf_drv_ppi_channel_enable(ppi_channel1); APP_ERROR_CHECK(err_code); err_code = nrf_drv_ppi_channel_enable(ppi_channel2); APP_ERROR_CHECK(err_code); }
/** * @brief Function for initializing and enabling PPI channels. * * @retval NRF_ERROR_INTERNAL If there were error initializing or enabling PPI channels. * @retval NRF_SUCCESS If PPI channels were initialized and enabled successfully. */ static ret_code_t ppi_init(void) { ret_code_t err_code; uint8_t i; err_code = nrf_drv_ppi_init(); if ((err_code != NRF_SUCCESS) && (err_code != NRF_ERROR_MODULE_ALREADY_INITIALIZED)) { return NRF_ERROR_INTERNAL; } for(i = 0; i < PPI_REQUIRED_CHANNELS ; i++) { err_code = nrf_drv_ppi_channel_alloc(&m_ppi_channels[i]); if (NRF_SUCCESS != err_code) { return NRF_ERROR_INTERNAL; } } err_code = nrf_drv_ppi_channel_assign(m_ppi_channels[0], nrf_drv_comp_event_address_get(NRF_COMP_EVENT_CROSS), nrf_drv_timer_task_address_get(&m_timer0, NRF_TIMER_TASK_COUNT)); if (NRF_SUCCESS != err_code) { return NRF_ERROR_INTERNAL; } err_code = nrf_drv_ppi_channel_assign(m_ppi_channels[1], nrf_drv_timer_event_address_get(&m_timer0, NRF_TIMER_EVENT_COMPARE0), nrf_drv_timer_task_address_get(&m_timer1, NRF_TIMER_TASK_CAPTURE1)); if (NRF_SUCCESS != err_code) { return NRF_ERROR_INTERNAL; } err_code = nrf_drv_ppi_channel_fork_assign(m_ppi_channels[1], nrf_drv_comp_task_address_get(NRF_COMP_TASK_STOP)); if (NRF_SUCCESS != err_code) { return NRF_ERROR_INTERNAL; } err_code = nrf_drv_ppi_channel_assign(m_ppi_channels[2], nrf_drv_comp_event_address_get(NRF_COMP_EVENT_READY), nrf_drv_timer_task_address_get(&m_timer0, NRF_TIMER_TASK_CLEAR)); if (NRF_SUCCESS != err_code) { return NRF_ERROR_INTERNAL; } err_code = nrf_drv_ppi_channel_fork_assign(m_ppi_channels[2], nrf_drv_timer_task_address_get(&m_timer1, NRF_TIMER_TASK_CLEAR)); if (NRF_SUCCESS != err_code) { return NRF_ERROR_INTERNAL; } for(i = 0; i < PPI_REQUIRED_CHANNELS ; i++) { err_code = nrf_drv_ppi_channel_enable(m_ppi_channels[i]); if (NRF_SUCCESS != err_code) { return NRF_ERROR_INTERNAL; } } return NRF_SUCCESS; }