
一.延时的3种方法 首先,先了解一下什么延时。顾名思义,延时即是延长一段时间。 1.循环延时 这是最简单的延时方法,让单片机做一些无关紧要的工作来打发时间,这里通过循环的方式实现。但是,这种方法想到做到精准延时是需要经过不断测试的。
2.定时器中断延时与非中断延时 在实际应用中,我们常采用的是定时器延时。定时器延时分为中断延时与非中断延时。两种方法在延时效果上是一样的,只是实现的过程不一样。 中断延时通过在中断中的计数值的不断递减来达到精确延时,而非中断则通过在循环里不停查询寄存器数值来达到精确延时。前者因为中断的存在,不利于在其他中断中调用延时函数。在很多延时教程中,都喜欢推荐非中断式的延时。不过对于非特殊情况,两者的效果是一样的。反而非中断延时需要操作寄存器,反而更难理解。 三.定时器中断式计时与延时 首先,需要用CubeMX配置一个定时器(以TIM4为例),配置如下: ![]() 步骤: 1. 打开TIM4,将分频系数设置为71(我使用的是STM32F103C8,高速外部晶振为72MHz,分频后所得频率即为1MHz,换句话说定时器每次计数的时间间隔为1us)。分频系数的需要视自己选择的芯片而定。 2. 重转载值设定为最大值65535,同时打开中断。定时器每次计数的时间间隔是1us,而计数到65536将会溢出产生中断,所以每一次中断的时间间隔为65535us。 3. 已知每次中断的时间间隔(65535us),同时记录下中断的次数(TimerCnt),再加上定时器当前计数值(CNT),便能得到系统的绝对时间了。即: SystemTimer=TimerCnt*65535+CNT 以上就是利用定时器计时的原理,他能够记录你的单片机从开机后每一刻的绝对时间。下面给出实现的代码:
下面是我测试时的效果,Stm32从定时器初始化后开始不停得计时,计时精度还是挺高的。 ![]() 计时记录的是单片机开机后的绝对时间,那么以此为时间轴,延时也就很容易完成了。只要记录下你延时开始的时间,然后在你预定的延时时间里用循环来阻塞就可以了。在上述的基础上加上如下代码;
二.定时器非中断式延时 以系统滴答计时器为例(代码来自网络,亲测有效)
四.代码例程 已经把我写好代码上传到CSDN上,已经调试好,亲测有效。 ———————————————— 版权声明:冬瓜~ 如有侵权请联系删除 |
经验分享 | STM32U5系列TIMER+DMA+DAC应用演示
经验分享 | STM32G4 UART+TIMER+DMA应用示例
经验分享 | STM32定时器同步启动示例及应用提醒
经验分享 | STM32 TIMER+DMA输出PWM异常二案例
经验分享 | 更改STM32定时器周期后的输出疑问分析
基于定时器捕获测量脉宽的应用示例
狂欢三】STM32C031使用TIM定时器DMA方式实现WS2812彩灯输出(三)
【狂欢三】STM32C031使用TIM定时器DMA方式实现PWM输出(二)
【狂欢三】STM32C031使用TIM定时器PWM输出
stm32使用定时器触发dma传输,启动dma没反应的几种情况的解决方法