打印
[其他ST产品]

利用单片机里的定时器模拟秒表计数器需注意的事项!

[复制链接]
399|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
LLGTR|  楼主 | 2022-9-13 13:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

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

        //每次进入定时器中断inter_**就会被置1  
        if (inter_**)//5ms扫描一次(这个注释是个误解)
        {
            inter_** = 0;//中断标志位清0
            timer_run();//控制秒、分、时、天、周、月、年
            DHMS_digit_to_char(day, hour, minute, second);
            key_value = scan_MatrixKey();//扫描矩阵键盘  
        }
        adjust_digit(key_value);//根据按键调整数据
        light_digit_to_char1(combine_digit(digit1_h, digit1_l));
        light_digit_to_char2(combine_digit(digit2_h, digit2_l));                 
        if (i >= 200)
        {  
            i = 0;
            screen_action();                     
        }
        i++;                     
    }                  
}
//注: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
没注意到慢不慢

可以实际操作一下试试哦!

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

69

主题

1634

帖子

2

粉丝