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

Timer Wakeup

Timer Wakeup的示例工程实现了以Dual Timer的中断方式定时唤醒系统。

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

代码理解

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

图 41 Timer Wakeup工程流程图
  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);
    

    Dual Timer详细配置参数请参考Dual Timer

  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)
        {
            g_dtim0_cnt++;
        }
    }
    
    hal_dual_timer_base_start_it(&g_dual_tim0_handle);
    
  3. 系统进入睡眠状态。代码如下:
    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);
    }
    
  4. 调用hal_dual_timer_base_stop_it()结束中断方式计时。代码如下:
    hal_dual_timer_base_stop_it(&g_dual_tim0_handle);

测试验证

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

扫描关注

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