本节是延续上一节定时器的计时功能而做的扩展应用,利用计时功能设计一个电子时钟。

    开发环境:CubeMX+MDK5.27
    芯片型号:STM32F103ZET6
    时间:2020/07/13

    简介:上一节我们配置基本定时器TIM6实现了10ms闪烁的LED灯,本节我们配置基本定时器实现一个电子时钟
    电子时钟的最小单位是秒钟,也就是我们需要定时器每秒钟产生一个更新中断。根据上一节提出的公式
    T = (Prescaler + 1) * (Counter Period + 1)/ TIM_Clock = 1s
    现在已知TIM_Clock = 72MHz,所以我们让Prescaler = 7200-1,Counter Period = 10000 - 1即可使T=1s

    实现步骤
    第一步,在CubeMX中配置TIM7,具体配置如图
    tim7.png
    TIM7.0.png

    第二步,编写代码,在USER CODE BEGIN PTD下定义结构体clock

    1. typedef struct
    2. {
    3. uint8_t hour;
    4. uint8_t min;
    5. uint8_t sec;
    6. }Clock_param;

    在USER CODE BEGIN PV下定义结构体变量

    1. Clock_Param clock = {0};

    在USER CODE BEGIN 2下添加如下代码

    1. __HAL_TIM_CLEAR_IT(&hitm7,TIM_IT_UPDATE);
    2. HAL_TIM_Base_Start_IT(&htim7);

    在USER CODE BEGIN 3下添加如下代码

    1. printf("Time:%2d:%2d:%2d\r\n",clock.hour,clock.min,clock.sec);

    在USER CODE BEGIN 4下编写定时器中断回调函数

    1. void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
    2. {
    3. if(htim->Instance == TIM7)
    4. {
    5. clock.sec++;
    6. if(clock.sec == 60)
    7. {
    8. clock.sec = 0;
    9. clock.min++;
    10. if(clock.min == 60)
    11. {
    12. clock.min = 0;
    13. clock.hour++;
    14. if(clock.hour == 24)
    15. {
    16. clock.hour = 0;
    17. }
    18. }
    19. }
    20. }
    21. }

    实验结果:
    res.png