I have clock drift issue, should I calibrate anything? I test this simple code to get 1second or 100ms signal both of them are inaccurate.
here is my code for 100ms; I tested it with a 16mhz timer clock but the result was similar.
I am measuring with a simple logic analyzer and I also tested a 1-second signal with a stopwatch, it drifts 1 second for every 2 minutes.
#include <stdbool.h> #include <stdint.h> #include "nrf.h" #include "nrf_gpiote.h" #include "nrf_gpio.h" #include "boards.h" #include "nrf_drv_ppi.h" #include "nrf_drv_timer.h" #include "nrf_drv_gpiote.h" #include "app_error.h" #ifdef BSP_LED_0 #define GPIO_OUTPUT_PIN_NUMBER 15 //BSP_LED_0 /**< Pin number for output. */ #endif #ifndef GPIO_OUTPUT_PIN_NUMBER #error "Please indicate output pin" #endif static nrf_drv_timer_t timer = NRF_DRV_TIMER_INSTANCE(0); void timer_dummy_handler(nrf_timer_event_t event_type, void * p_context){} static void led_blinking_setup() { uint32_t compare_evt_addr; uint32_t gpiote_task_addr; nrf_ppi_channel_t ppi_channel; ret_code_t err_code; nrf_drv_gpiote_out_config_t config = GPIOTE_CONFIG_OUT_TASK_TOGGLE(false); err_code = nrf_drv_gpiote_out_init(GPIO_OUTPUT_PIN_NUMBER, &config); APP_ERROR_CHECK(err_code); nrf_drv_timer_config_t timer_cfg = NRF_DRV_TIMER_DEFAULT_CONFIG; timer_cfg.frequency = NRF_TIMER_FREQ_31250Hz; timer_cfg.bit_width = NRF_TIMER_BIT_WIDTH_32; err_code = nrf_drv_timer_init(&timer, &timer_cfg, timer_dummy_handler); APP_ERROR_CHECK(err_code); nrf_drv_timer_extended_compare(&timer, (nrf_timer_cc_channel_t)0,3125, NRF_TIMER_SHORT_COMPARE0_CLEAR_MASK, false); err_code = nrf_drv_ppi_channel_alloc(&ppi_channel); APP_ERROR_CHECK(err_code); compare_evt_addr = nrf_drv_timer_event_address_get(&timer, NRF_TIMER_EVENT_COMPARE0); gpiote_task_addr = nrf_drv_gpiote_out_task_addr_get(GPIO_OUTPUT_PIN_NUMBER); err_code = nrf_drv_ppi_channel_assign(ppi_channel, compare_evt_addr, gpiote_task_addr); APP_ERROR_CHECK(err_code); err_code = nrf_drv_gpiote_out_init(BSP_LED_1, &config); APP_ERROR_CHECK(err_code); gpiote_task_addr = nrf_drv_gpiote_out_task_addr_get(BSP_LED_1); err_code = nrfx_ppi_channel_fork_assign(ppi_channel, gpiote_task_addr); APP_ERROR_CHECK(err_code); err_code = nrf_drv_ppi_channel_enable(ppi_channel); APP_ERROR_CHECK(err_code); nrf_drv_gpiote_out_task_enable(GPIO_OUTPUT_PIN_NUMBER); nrf_drv_gpiote_out_task_enable(BSP_LED_1); } /** * @brief Function for application main entry. */ int main(void) { ret_code_t err_code; err_code = nrf_drv_ppi_init(); APP_ERROR_CHECK(err_code); err_code = nrf_drv_gpiote_init(); APP_ERROR_CHECK(err_code); led_blinking_setup(); nrf_drv_timer_enable(&timer); while (true) {} }