Dear,
I need to generate a pulse signal on one IO following this pattern:
HIGH for 12us ; LOW for 106us ; and so on...
I tried to use TIMER0 with NRF_TIMER_EVENT_COMPARE0 and NRF_TIMER_EVENT_COMPARE1 but the signal is often not respected (keeping one cycle the IO HIGH also during second period). So I assume I need to use dppi, but using the following code, I still not see anything happening on the io:
struct gpio_dt_spec mofset_ctrl_io = GPIO_DT_SPEC_GET(DT_NODELABEL(mofset_ctrl), gpios); #define TIMER_INSTANCE_NUMBER 0 const nrfx_timer_t timer_instance = NRFX_TIMER_INSTANCE(TIMER_INSTANCE_NUMBER); #define TOGGLE_INTERVAL_ON_US 12 #define TOGGLE_INTERVAL_OFF_US 106 static nrfx_gpiote_t const gpiote_inst = NRFX_GPIOTE_INSTANCE(0); static uint8_t dppi_channel; static void timer0_init(void) { nrfx_err_t err; nrfx_timer_config_t timer_config = NRFX_TIMER_DEFAULT_CONFIG(16000000); timer_config.bit_width = NRF_TIMER_BIT_WIDTH_16; err = nrfx_timer_init(&timer_instance, &timer_config, NULL); if (err != NRFX_SUCCESS) { LOG_ERR("nrfx_timer_init error: %08x", err); return; } uint32_t ticks1 = nrfx_timer_us_to_ticks(&timer_instance, TOGGLE_INTERVAL_ON_US); uint32_t ticks2 = nrfx_timer_us_to_ticks(&timer_instance, TOGGLE_INTERVAL_ON_US + TOGGLE_INTERVAL_OFF_US); LOG_INF("COMPARE0: %d ticks, COMPARE1: %d ticks", ticks1, ticks2); nrfx_timer_extended_compare( &timer_instance, NRF_TIMER_CC_CHANNEL0, ticks1, NRF_TIMER_SHORT_COMPARE1_CLEAR_MASK, // Efface le compteur après COMPARE1 true ); nrfx_timer_extended_compare( &timer_instance, NRF_TIMER_CC_CHANNEL1, ticks2, NRF_TIMER_SHORT_COMPARE1_CLEAR_MASK, // On efface à COMPARE1 true ); // Connexion de l'IRQ IRQ_DIRECT_CONNECT(TIMER0_IRQn, 0, nrfx_timer_0_irq_handler, 0); irq_enable(TIMER0_IRQn); nrfx_timer_enable(&timer_instance); LOG_INF("Timer started"); } static void gpiote_dppi_init(void) { nrfx_err_t err; err = nrfx_gpiote_init(&gpiote_inst, NRFX_GPIOTE_DEFAULT_CONFIG_IRQ_PRIORITY); if (err != NRFX_SUCCESS && err != NRFX_ERROR_ALREADY_INITIALIZED) { LOG_ERR("nrfx_gpiote_init error: %08x", err); return; } nrfx_gpiote_output_config_t gpiote_config = NRFX_GPIOTE_DEFAULT_OUTPUT_CONFIG; err = nrfx_gpiote_output_configure(&gpiote_inst, mofset_ctrl_io.pin, &gpiote_config, NULL); if (err != NRFX_SUCCESS) { LOG_ERR("nrfx_gpiote_output_configure error: %08x", err); return; } nrfx_gpiote_trigger_enable(&gpiote_inst, mofset_ctrl_io.pin, true); err = nrfx_dppi_channel_alloc(&dppi_channel); if (err != NRFX_SUCCESS) { LOG_ERR("nrfx_dppi_channel_alloc error: %08x", err); return; } nrfx_gppi_channel_endpoints_setup(dppi_channel, nrfx_timer_compare_event_address_get(&timer_instance, NRF_TIMER_CC_CHANNEL0), nrfx_gpiote_out_task_address_get(&gpiote_inst, mofset_ctrl_io.pin)); nrfx_gppi_channel_endpoints_setup(dppi_channel, nrfx_timer_compare_event_address_get(&timer_instance, NRF_TIMER_CC_CHANNEL1), nrfx_gpiote_out_task_address_get(&gpiote_inst, mofset_ctrl_io.pin)); err = nrfx_dppi_channel_enable(dppi_channel); if (err != NRFX_SUCCESS) { LOG_ERR("Failed to enable DPPI channel, error: %08x", err); return; } LOG_INF("GPIOTE + DPPI initialized"); }
Do you know why ? I confess it was difficult to setup this with all the API changes on that topic (add of nrfx_gpiote_t in prototypes and other changes), and I never found one full example working for nrf5340 and NCS 2.7.0 I am using.
Thanks in advance for your piece of advice!
Kind regards,
Michael