在 STM32 上实现两小时延时,咱完全不用碰 RTC、定时器那些麻烦玩意儿,更不用死等延时函数卡 CPU—— 就照着你在 STC 上的路子来,全局变量累加搞定,几行代码的事,还特省资源,宝贵的中断留着干那些要精确响应的活多好。
先定义个全局浮点数变量,比如 g_delay_cnt = 0.0; 不用搞复杂类型,跟你之前 STC 上用的一样顺手。然后在大循环里该干啥干啥,比如读个传感器状态、控个风扇转速,等所有活儿都干完了,在循环末尾给 g_delay_cnt 加个小数值 —— 比如每次加 0.001,假设你大循环跑一圈大概 1ms,那这 0.001 就对应 1ms 的时间推进,简单好算。
接下来判断也直白,两小时总共是 7200 秒,要是每次加 0.001(1ms),那只要看 g_delay_cnt 超过 7200.0 了没,一旦超了,就说明两小时到了,该执行后续动作比如关设备、复位状态了,完了把 g_delay_cnt 清回 0.0,下次定时接着用。想调时长也跟你给电风扇改半小时一档似的,不用改逻辑,要么调每次加的数,比如想让定时快点儿就加 0.002,要么改判断的阈值,比如想延时一小时就把 7200.0 改成 3600.0,怎么方便怎么来。
这么干的好处太实在了:不用花时间配 RTC 的时钟校准、不用写定时器中断服务函数占通道 ——STM32 的中断资源虽说比 STC 多,但也不能随便浪费,留着给按键消抖、串口实时接收这种要快速反应的场景才对。而且代码简单到不行,定义变量、循环加值、判断阈值,三两步就搞定,调试也省事,要是实际跑下来差个几分钟,说明大循环周期不是预估的 1ms,稍微调下每次加的数值,比如改成 0.0011,很快就能准。
总之,STM32 做这种长时长、不用特别精确的延时,这法子最对味 —— 跟你在 STC 上的玩法一脉相承,不用折腾复杂外设,代码少还灵活,资源都省下来给其他功能用,比啥都强。
https://www.tjc1688.com/

先定义个全局浮点数变量,比如 g_delay_cnt = 0.0; 不用搞复杂类型,跟你之前 STC 上用的一样顺手。然后在大循环里该干啥干啥,比如读个传感器状态、控个风扇转速,等所有活儿都干完了,在循环末尾给 g_delay_cnt 加个小数值 —— 比如每次加 0.001,假设你大循环跑一圈大概 1ms,那这 0.001 就对应 1ms 的时间推进,简单好算。
接下来判断也直白,两小时总共是 7200 秒,要是每次加 0.001(1ms),那只要看 g_delay_cnt 超过 7200.0 了没,一旦超了,就说明两小时到了,该执行后续动作比如关设备、复位状态了,完了把 g_delay_cnt 清回 0.0,下次定时接着用。想调时长也跟你给电风扇改半小时一档似的,不用改逻辑,要么调每次加的数,比如想让定时快点儿就加 0.002,要么改判断的阈值,比如想延时一小时就把 7200.0 改成 3600.0,怎么方便怎么来。
这么干的好处太实在了:不用花时间配 RTC 的时钟校准、不用写定时器中断服务函数占通道 ——STM32 的中断资源虽说比 STC 多,但也不能随便浪费,留着给按键消抖、串口实时接收这种要快速反应的场景才对。而且代码简单到不行,定义变量、循环加值、判断阈值,三两步就搞定,调试也省事,要是实际跑下来差个几分钟,说明大循环周期不是预估的 1ms,稍微调下每次加的数值,比如改成 0.0011,很快就能准。
总之,STM32 做这种长时长、不用特别精确的延时,这法子最对味 —— 跟你在 STC 上的玩法一脉相承,不用折腾复杂外设,代码少还灵活,资源都省下来给其他功能用,比啥都强。
https://www.tjc1688.com/
