nrf52-添加定时任务

nrf52832学习    添加自己的定时任务,  由于nrf52的协议栈是基于事件触发的,所以定时器使用的是外部32,.768k的晶振分频的RTC1软件定时,因为进入睡眠模式后,32MHz晶振会停止工作,此时只有32.768khz的晶振在工作,所以定时任务使用此晶振分频。


先看demo中的main函数入口:


int main(void)
{
    uint32_t err_code;
    bool erase_bonds;

    // Initialize.
    timers_init();
    ble_stack_init();
    gap_params_init();
    advertising_init();
    services_init();
    conn_params_init();

    // Start execution.
    application_timers_start();
    err_code = ble_advertising_start(BLE_ADV_MODE_FAST);
    APP_ERROR_CHECK(err_code);


    // Enter main loop.
    for (;;)
    {
        power_manage();
    }


可见一般的从机包含以上初始化内容,其中    timers_init();       application_timers_start();   是跟定时器任务相关的初始化函数。


 在 timers_init(); 中添加自己的定时任务创建函数:

static void timers_init(void)
{
    uint32_t err_code;

    // Initialize timer module.
    APP_TIMER_INIT(APP_TIMER_PRESCALER, APP_TIMER_MAX_TIMERS, APP_TIMER_OP_QUEUE_SIZE, false);

    // Create timers.
    err_code = app_timer_create(&m_battery_timer_id,
                                APP_TIMER_MODE_REPEATED,
                                battery_level_meas_timeout_handler);
    
    APP_ERROR_CHECK(err_code);

	err_code = app_timer_create(&m_led_flash_timer_id,
                                APP_TIMER_MODE_REPEATED,
                                my_led_flash_timeout_handler);
    APP_ERROR_CHECK(err_code);
}


上述初始化中:

一、APP_TIMER_INIT()中第二个参数 APP_TIMER_MAX_TIMERS为定时器的最大个数,添加一个定时器就要增大这个值

二、app_timer_create()函数中三个参数:

1、m_led_flash_timer_id为自己添加的定时时钟

static app_timer_id_t                    m_led_flash_timer_id; 

2、APP_TIMER_MODE_REPEATED为多次定时,直到调用uint32_t app_timer_stop(app_timer_id_t timer_id)停止定时器,参数定义如下:

typedef enum
{
    APP_TIMER_MODE_SINGLE_SHOT,                 /**< The timer will expire only once. */
    APP_TIMER_MODE_REPEATED                     /**< The timer will restart each time it expires. */
} app_timer_mode_t;

3、my_led_flash_timeout_handler为定时任务的处理函数,如下代码实现:


static void my_led_flash_timeout_handler(void * p_context)
{
    static bool led_flash = false;

    UNUSED_PARAMETER(p_context);

	if (led_flash)
	{
		LED_ON(MY_LED_MASK);
		led_flash = false;
	}
	else
	{
		LED_OFF(MY_LED_MASK);
		led_flash = true;
	}
}

完成上述步骤就能调用开启定时任务函数了,demo中在初始化函数  void application_timers_start(void)中启动的所有timer,可根据自己实际需求在合适地方添加,以下以demo为例:

static void application_timers_start(void)
{
    uint32_t err_code;

    // Start application timers.
    err_code = app_timer_start(m_battery_timer_id, BATTERY_LEVEL_MEAS_INTERVAL, NULL);
    APP_ERROR_CHECK(err_code);

   
    err_code = app_timer_start(m_led_flash_timer_id, MY_LED_FLASH_INTERVAL, NULL);
    APP_ERROR_CHECK(err_code);
}


代码中 app_timer_start(m_led_flash_timer_id, MY_LED_FLASH_INTERVAL, NULL);为定时任务开启函数,其中参数
MY_LED_FLASH_INTERVAL

 代码中app_timer_start(m_led_flash_timer_id, MY_LED_FLASH_INTERVAL, NULL);为定时任务开启函数,其中参数MY_LED_FLASH_INTERVAL为定时时间间隔,定义如下:

#define MY_LED_FLASH_INTERVAL 			 APP_TIMER_TICKS(1000, APP_TIMER_PRESCALER)




完成以上步骤,就可以看到定时任务已经成功开启了


你可能感兴趣的:(低功耗蓝牙)