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);为定时任务开启函数,其中参数<pre name="code" class="cpp">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)




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


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

路人 假

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值