Timer Wakeup
Timer Wakeup的示例工程实现了以Dual Timer的中断方式定时唤醒系统。
Timer Wakeup示例的源代码和工程文件位于SDK_Folder\projects\peripheral\timer\timer_wakeup,其中工程文件在文件夹Keil_5下。
代码理解
示例工程流程图如图 41所示:
- 配置Dual Timer模块。
g_dual_tim0_handle.p_instance = DUAL_TIMER0; g_dual_tim0_handle.init.prescaler = DUAL_TIM_PRESCALER_DIV0; g_dual_tim0_handle.init.counter_mode = DUAL_TIM_COUNTERMODE_LOOP; g_dual_tim0_handle.init.auto_reload = SystemCoreClock - 1; hal_dual_timer_base_init(&g_dual_tim0_handle);Dual Timer详细配置参数请参考Dual Timer。
- 调用hal_dual_timer_base_start_it()启用中断方式唤醒系统,auto_reload定时时间到时唤醒系统并通过接口hal_dual_timer_period_elapsed_callback()返回结果。代码如下:
void hal_dual_timer_period_elapsed_callback(dual_timer_handle_t *hdtim) { if (hdtim->p_instance == DUAL_TIMER0) { g_dtim0_cnt++; } } hal_dual_timer_base_start_it(&g_dual_tim0_handle); - 系统进入睡眠状态。代码如下:
while (g_dtim0_cnt < 10) { printf("\r\nEnter sleep at timer counter = %d\r\n", g_dtim0_cnt); SCB->SCR |= 0x04; __WFI(); printf("Wakeup from sleep at timer counter = %d\r\n", g_dtim0_cnt); } - 调用hal_dual_timer_base_stop_it()结束中断方式计时。代码如下:
hal_dual_timer_base_stop_it(&g_dual_tim0_handle);
测试验证
- 用GProgrammer下载timer_wakeup.bin至开发板。
- 将开发板串口连接至PC端,打开并配置GRUart。
- 在GRUart窗口中程序每秒打印一次调试信息,打印10次后程序运行结束。