STM32利用SYSTICK实现的延时函数突然不准了

博主在编写模组开机时序时遇到开机失败的问题,经排查发现延迟函数存在异常。尽管串口波特率正常,但发现2.5秒的延迟实际只有不到1秒。通过手写I++测试确认问题在于延迟函数。进一步测试发现delay_us准确,但delay_ms在特定参数下失效,推测可能与装载值超出范围有关。最终,博主通过调整和封装延迟函数解决了问题,但仍不清楚具体原因。
摘要由CSDN通过智能技术生成

今天,写一个模组的开机时序时发现开不了机,各种查配置,最后定位到问题出现在延时函数

发现这个 延时2.5结果只延时了不到1S,而我模组的开机时序中这里最少需要2S所以一直无法开机,那就查延时函数吧

怀疑系统配置有问题,但是我串口的波特率都是OK的,疑惑........

手写了个2.5S左右的I++,模组成功开机,说明问题一定出在延时函数了,各种检查延时函数都没发现问题,烦死个人!

我就想找找其中的规律,我测试了一个delay_us(50000);是准确的50ms.......我懵逼了,因为delay_us和delay_ms的原理是一模一样......

于是我用us封装了一个ms延时,

 实测OK,虽然问题解决了,但是不知道原因,再研究研究.......

我仔细看了原delay_ms的代码,发现一个装载值 SysTick->LOAD=(u32)nms*fac_ms;

我猜测是不是我2500ms导致装载值超出了,我把fac_ms打到日志发现是9000,9000*2500< (u32)啊....

内核文件里也没规定范围,我还是怀疑这个问题,所以我试了 delay_ms(1000),结果时间是OK的!!!

最后我实验到1800是OK的,1900基本就是0了,所以我认为是这个装载值不能超过某个值

所以我重新包装了一个S级延时

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值