Dual Timer
Dual Timer的示例工程实现了以Dual Timer的中断方式定时打印程序中相关信息。
Dual Timer示例的源代码和工程文件位于SDK_Folder\projects\peripheral\timer\dual_timer,其中工程文件在文件夹Keil_5下。
代码理解
示例工程流程图如图 39所示:
- 配置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); g_dual_tim1_handle.p_instance = DUAL_TIMER1; g_dual_tim1_handle.init.prescaler = DUAL_TIM_PRESCALER_DIV0; g_dual_tim1_handle.init.counter_mode = DUAL_TIM_COUNTERMODE_LOOP; g_dual_tim1_handle.init.auto_reload = SystemCoreClock / 100 - 1;- prescaler:预分频器选择,可选择DUAL_TIM_PRESCALER_DIV0,DUAL_TIM_PRESCALER_DIV16,DUAL_TIM_PRESCALER_DIV256。
- counter_mode:计数器模式,可选择DUAL_TIM_COUNTERMODE_LOOP,DUAL_TIM_COUNTERMODE_ONESHOT。
- auto_reload:自动重载值,DUAL_TIMER0选择1s加载一次,DUAL_TIMER1选择10 ms加载一次。
- 调用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) { printf("\r\nThis is %dth call DUALTIM0.\r\n", g_dtim0_cnt++); } else { g_dtim1_cnt++; } } hal_dual_timer_base_start_it(&g_dual_tim1_handle); hal_dual_timer_base_start_it(&g_dual_tim0_handle); - 调用hal_dual_timer_base_stop_it()停止中断方式计时。代码如下:
hal_dual_timer_base_stop_it(&g_dual_tim1_handle); hal_dual_timer_base_stop_it(&g_dual_tim0_handle);
测试验证
- 用GProgrammer下载dual_timer.bin至开发板。
- 将开发板串口连接至PC端,打开并配置GRUart。
- 在GRUart的Receive Data窗口中程序每秒打印一次调试信息,打印10次后程序运行结束。