[其他ST产品] 利用单片机里的定时器模拟秒表计数器需注意的事项!

[复制链接]
586|2
 楼主| LLGTR 发表于 2022-9-13 13:57 | 显示全部楼层 |阅读模式

用stm32做项目时,需要用定时器做一个秒表计时,但发现秒表总是比实际慢,百思不得其解,最终求教高人,得以解决,现将心得整理如下,以警醒自己方便他人!
  1. int main(void)
  2. {   
  3.     u16 i;
  4.     s8 key_value;
  5.     Stm32_Clock_Init(9);//系统时钟设置(正常是9倍频)
  6.     delay_init(72);//延时初始化(正常值是72)
  7.     GPIO_init();
  8.     lcd12864_init();
  9.     LED_Init();
  10.     uart_init(72, 9600);//串口初始化为9600
  11.     Timerx_Init(200-1, 7199);//20ms中断一次(5000-1对应500ms)
  12.    
  13.     while (1)
  14.     {      

  15.         //每次进入定时器中断inter_**就会被置1  
  16.         if (inter_**)//5ms扫描一次(这个注释是个误解)
  17.         {
  18.             inter_** = 0;//中断标志位清0
  19.             timer_run();//控制秒、分、时、天、周、月、年
  20.             DHMS_digit_to_char(day, hour, minute, second);
  21.             key_value = scan_MatrixKey();//扫描矩阵键盘  
  22.         }
  23.         adjust_digit(key_value);//根据按键调整数据
  24.         light_digit_to_char1(combine_digit(digit1_h, digit1_l));
  25.         light_digit_to_char2(combine_digit(digit2_h, digit2_l));                 
  26.         if (i >= 200)
  27.         {  
  28.             i = 0;
  29.             screen_action();                     
  30.         }
  31.         i++;                     
  32.     }                  
  33. }
//注:if(inter_**)语句并不一定是定时器每中断一次就扫描一次
//因为在while(1)循环里若除if(inter_**)语句外的其它语句的执行时间过长
//(超过定时器的中断周期),那么if(inter_**)语句就得不到及时查询,
//导致timer_run()里的second就不能及时增加,如此就导致计数器秒表变慢。

Bowclad 发表于 2022-9-13 19:51 | 显示全部楼层
没注意到慢不慢
 楼主| LLGTR 发表于 2022-9-15 13:10 | 显示全部楼层
Bowclad 发表于 2022-9-13 19:51
没注意到慢不慢

可以实际操作一下试试哦!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

76

主题

1972

帖子

2

粉丝
快速回复 在线客服 返回列表 返回顶部