打印
[APM32F1]

【小白篇】如何实现定时器的“死等”延时

[复制链接]
841|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
多云转晴|  楼主 | 2022-5-17 16:03 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
定时器是我们日常应用中必不可少的一部分,定时器的功能也多种多样,小到定时计数,大到捕获比较。今天来说说最基本的定时方法,常见的有两种,“死等”和“时间片”。今天讲的是“死等”延时,也就是说在延时的这段时间里,我什么都不干,就在那里计数,这种方法比较多的应用于一些日常调试和测试中。
下面以APM32F103XB为例,分十步对该过程进行分析。
//1.开启时钟
RCM_EnableAPB1PeriphClock(RCM_APB1_PERIPH_TMR2);
       
//2.定义结构体名称
TMR_BaseConfig_T TMR_BaseConfigDiedelay;
       
//3.配置结构体变量
TMR_BaseConfigDiedelay.clockDivision = TMR_CLOCK_DIV_1;
TMR_BaseConfigDiedelay.countMode = TMR_COUNTER_MODE_UP;
TMR_BaseConfigDiedelay.division = 7200 - 1;
TMR_BaseConfigDiedelay.period = 10 * nms;
TMR_ConfigTimeBase(TMR2, &TMR_BaseConfigDiedelay);
       
//4.使能自动装载与预装载寄存器的允许位
TMR_EnableAutoReload(TMR2);
       
//5.设置更新请求源只在计数器上溢或下溢时产生中断
TMR_ConfigUpdateRequest(TMR2,TMR_UPDATE_SOURCE_GLOBAL);
       
//6.先清除一次标志位
TMR_ClearStatusFlag(TMR2,TMR_FLAG_UPDATE);
       
//7.使能计数器
TMR_Enable(TMR2);
       
//8.等待标志位置起
while(TMR_ReadStatusFlag(TMR2,TMR_FLAG_UPDATE)!= 1);
       
//9.将计数器关闭
TMR_Disable(TMR2);
       
//10.清除标志位,清除计数
TMR_ClearStatusFlag(TMR2,TMR_FLAG_UPDATE);
TMR2->CNT = 0;
注:在使用这种方法时,要考虑好输入的值是否会超出重装载值的量程,可以根据自己的需求对预分频值和重装载值进行修改,否则,超出量程的话可能会导致计数不准(曾经在这里卡过很久)。每次使用时只要直接调用函数,并传入自己想要计数的时间即可实现。

180104105129-林烁文-自动化.pdf

1.4 MB

使用特权

评论回复
沙发
捉虫天师| | 2022-5-17 19:06 | 只看该作者
很有意思,有时候就是死等,有些程序是不死等。如果能做个框架一边是必须执行的,一边是可以死等的就完美了。

使用特权

评论回复
板凳
王栋春| | 2022-5-17 22:29 | 只看该作者
对这方面的知识不甚了解,围观一下先。                  

使用特权

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

本版积分规则

10

主题

17

帖子

0

粉丝