Hello,
I am using NRF52840 DK to toggle led 3 and 4 back and forth (when LED 3 is ON, LED 4 should be OFF and so on). I have to toggle them in a small time interval of 10ms. I am using SDK 17.02. In order for the power consumption I am using GPIOTE with PPI and timer. Right now I am using a single timer to drive both the LEDs.
void timer_dummy_handler(nrf_timer_event_t event_type, void * p_context){} static void led_blinking_setup() { uint32_t compare_evt_addr_RED; uint32_t gpiote_task_addr_RED; uint32_t compare_evt_addr_IR; uint32_t gpiote_task_addr_IR; ret_code_t err_code; nrf_ppi_channel_t ppi_channel_RED; nrf_ppi_channel_t ppi_channel_IR; uint32_t ticks_RED = nrfx_timer_ms_to_ticks(&timer_gpio, 10); //same ticks for both IR and RED NRF_LOG_INFO("GPIO STARTED"); nrf_drv_gpiote_out_clear(GPIO_OUTPUT_PIN_NUMBER1); nrf_drv_gpiote_out_config_t config = GPIOTE_CONFIG_OUT_TASK_TOGGLE(false); nrf_drv_gpiote_out_config_t config1= { .action = NRF_GPIOTE_POLARITY_TOGGLE, \ .init_state = NRF_GPIOTE_INITIAL_VALUE_HIGH , \ .task_pin = true }; err_code = nrf_drv_gpiote_out_init(GPIO_OUTPUT_PIN_NUMBER, &config); APP_ERROR_CHECK(err_code); err_code = nrf_drv_gpiote_out_init(GPIO_OUTPUT_PIN_NUMBER1, &config1); nrf_drv_timer_extended_compare(&timer_gpio, NRF_TIMER_CC_CHANNEL0, ticks_RED, NRF_TIMER_SHORT_COMPARE0_CLEAR_MASK, false); err_code = nrf_drv_ppi_channel_alloc(&ppi_channel_RED); APP_ERROR_CHECK(err_code); err_code = nrf_drv_ppi_channel_alloc(&ppi_channel_IR); APP_ERROR_CHECK(err_code); compare_evt_addr_RED = nrf_drv_timer_event_address_get(&timer_gpio, NRF_TIMER_EVENT_COMPARE0); gpiote_task_addr_RED = nrf_drv_gpiote_out_task_addr_get(GPIO_OUTPUT_PIN_NUMBER); compare_evt_addr_IR = nrf_drv_timer_event_address_get(&timer_gpio, NRF_TIMER_EVENT_COMPARE0); gpiote_task_addr_IR = nrf_drv_gpiote_out_task_addr_get(GPIO_OUTPUT_PIN_NUMBER1); err_code = nrf_drv_ppi_channel_assign(ppi_channel_RED, compare_evt_addr_RED, gpiote_task_addr_RED); APP_ERROR_CHECK(err_code); err_code = nrf_drv_ppi_channel_assign(ppi_channel_IR, compare_evt_addr_IR, gpiote_task_addr_IR); APP_ERROR_CHECK(err_code); err_code = nrf_drv_ppi_channel_enable(ppi_channel_RED); APP_ERROR_CHECK(err_code); err_code = nrf_drv_ppi_channel_enable(ppi_channel_IR); APP_ERROR_CHECK(err_code); nrf_drv_gpiote_out_task_enable(GPIO_OUTPUT_PIN_NUMBER); nrf_drv_gpiote_out_task_enable(GPIO_OUTPUT_PIN_NUMBER1); }
The code works perfectly fine. But I believe there is a better way approach rather than this method. By using this method, one of the LED remains ON even after the required time of the activity ends. I need the signal to be precise and accurate and should not course any problem in the timing. They have to be synchronized perfectly. Is there any other better approach to this problem?
Would appreciate your help. Thank you.