PPI Timer Mode w/ Divider of 3 Unexpected Frequency

Hello,

I am using an nRF5340dk to create a PPI Timer as shown in the following code block:

static void set_ppi_clock() {
	nrfx_gpiote_init(GPIOTE_INTERRUPT_PRIORITY);

	LOG_DBG("GPIOTE initialized.");

	nrfx_err_t err;
	nrfx_gpiote_out_config_t out_config = NRFX_GPIOTE_CONFIG_OUT_TASK_TOGGLE(false);
	
	// TODO :: update depricated function call of nrfx_gpio_out_init();
	// NOTE: This function is deprecated. Use nrfx_gpiote_output_configure preceded by nrfx_gpiote_channel_alloc 
	// (provided that GPIOTE task is to be utilized) instead.
	err = nrfx_gpiote_out_init(PIN, &out_config);

	nrf_gpio_cfg(
		PIN,
		NRF_GPIO_PIN_DIR_OUTPUT,
		NRF_GPIO_PIN_INPUT_DISCONNECT,
		NRF_GPIO_PIN_NOPULL,
		NRF_GPIO_PIN_H0H1,
		NRF_GPIO_PIN_NOSENSE
	);

	if( err != NRFX_SUCCESS )
	{
      LOG_ERR("err_code not 0 for nrf_drv_gpiote_in_init");
    }

	nrfx_timer_config_t timer_cfg = NRFX_TIMER_DEFAULT_CONFIG;
	timer_cfg.mode = NRF_TIMER_MODE_TIMER;
	timer_cfg.bit_width = NRF_TIMER_BIT_WIDTH_32;
	err = nrfx_timer_init(&m_timer, &timer_cfg, NULL);
	ERROR_STATUS_CHECK(err)

    nrfx_timer_extended_compare(&m_timer, NRF_TIMER_CC_CHANNEL0, CONFIG_MCLOCK_DIVIDER, NRF_TIMER_SHORT_COMPARE0_CLEAR_MASK, false);    

    uint8_t channel;
    err =  nrfx_dppi_channel_alloc(&channel);
    nrfx_gpiote_pin_t gpiote_mclk_sync_pin_out = PIN;

 	uint32_t gpiote_mclk_toggle_task_addr = nrfx_gpiote_out_task_addr_get(gpiote_mclk_sync_pin_out); 
	uint32_t timer_event_address = nrfx_timer_event_address_get(&m_timer, NRF_TIMER_EVENT_COMPARE0);
	LOG_DBG("%x %x", gpiote_mclk_sync_pin_out, timer_event_address);

	nrfx_gppi_channel_endpoints_setup(channel, timer_event_address, gpiote_mclk_toggle_task_addr);
	nrfx_gppi_channels_enable(BIT(channel));
	nrfx_gpiote_out_task_enable(PIN);
	nrfx_timer_enable(&m_timer);
}


This code behaves as expected when the clock divider is 1 or 2 (my PIN toggles at 16Mhz/2*divider, ~8.02Mhz and ~4.01Mhz, respectively), but when I change the clock divider to 3, I get a weird output frequency of 2.67Mhz, and I have no idea why this is. I read over section 7.1.36 TIMER - Timer/counter of the nRF5340 data sheet to try and understand better, but from my understanding, the PCLK16M should be used even at a divider of 3, so I don't understand why the output frequency is so far off from the expected ~2Mhz. I could maybe understand if the input clock to the prescaler changed from the 16M to the 1M but I don't see how that could be the case here. Please advise. 

Parents Reply Children
Related