CN / EN
文档反馈
感谢关注汇顶文档,期待您的宝贵建议!
感谢您的反馈,祝您愉快!

Dual Timer

Dual Timer的示例工程实现了以Dual Timer的中断方式定时打印程序中相关信息。

Dual Timer示例的源代码和工程文件位于SDK_Folder\projects\peripheral\timer\dual_timer,其中工程文件在文件夹Keil_5下。

代码理解

示例工程流程图如图 39所示:

图 39 Dual Timer工程流程图
  1. 配置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加载一次。
  2. 调用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);
    
  3. 调用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);
    

测试验证

  1. 用GProgrammer下载dual_timer.bin至开发板。
  2. 将开发板串口连接至PC端,打开并配置GRUart。
  3. 在GRUart的Receive Data窗口中程序每秒打印一次调试信息,打印10次后程序运行结束。

扫描关注

打开微信,使用“扫一扫”即可关注。