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(); 中添加自己的定时任务创建函数:
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;
}
}
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)