完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
__weak uint32_t HAL_Gettick(void)
{ return uwTick; } __weak void HAL_IncTick(void) { uwTick++; } __weak void HAL_Delay(__IO uint32_t Delay) { uint32_t tickstart = 0; tickstart = HAL_GetTick(); while((HAL_GetTick() - tickstart) < Delay) { } } 这里使用这个延时函数有没有这种情况,当HAL_GetTick()的计数正好要溢出时,是不是延时就不准了? |
|
相关推荐
1个回答
|
|
是的,您提到的问题是正确的。在STM32CubeMX的HAL_Delay()函数中,当HAL_GetTick()的计数正好要溢出时,延时可能会变得不准确。这是因为HAL_GetTick()函数返回的是一个无符号整数(uint32_t),当它达到最大值时会发生溢出,从而重新开始计数。
在您提供的代码中,HAL_Delay()函数的工作原理如下: 1. 首先,获取当前的系统滴答计数(tickstart = HAL_GetTick())。 2. 然后,进入一个while循环,直到从tickstart开始的延时时间(Delay)过去。 3. 在循环内部,计算当前滴答计数与tickstart之间的差值,并检查是否小于Delay。 当HAL_GetTick()的计数溢出时,会发生以下情况: 1. HAL_GetTick()返回的值突然变得非常小,导致while循环中的差值计算不准确。 2. 这可能导致HAL_Delay()函数提前退出,从而导致实际延时时间小于预期的Delay值。 为了解决这个问题,可以采用以下方法: 1. 在while循环中,检查HAL_GetTick()的当前值是否小于tickstart。如果是,则说明计数已经溢出,需要进行特殊处理。 2. 当计数溢出时,更新tickstart为当前的HAL_GetTick()值,并重新计算剩余的延时时间。 修改后的HAL_Delay()函数可能如下所示: ```c __weak void HAL_Delay(__IO uint32_t Delay) { uint32_t tickstart = 0; uint32_t wait = Delay; tickstart = HAL_GetTick(); while ((HAL_GetTick() - tickstart) < wait) { if (HAL_GetTick() < tickstart) { // 计数已经溢出,重新计算剩余延时 wait -= (tickstart - HAL_GetTick()); tickstart = HAL_GetTick(); } } } ``` 这样,即使在HAL_GetTick()计数溢出的情况下,HAL_Delay()函数也能准确地实现预期的延时。 |
|
|
|
只有小组成员才能发言,加入小组>>
调试STM32H750的FMC总线读写PSRAM遇到的问题求解?
2173 浏览 1 评论
X-NUCLEO-IHM08M1板文档中输出电流为15Arms,15Arms是怎么得出来的呢?
1837 浏览 1 评论
1327 浏览 2 评论
STM32F030F4 HSI时钟温度测试过不去是怎么回事?
869 浏览 2 评论
ST25R3916能否对ISO15693的标签芯片进行分区域写密码?
2206 浏览 2 评论
2111浏览 9评论
STM32仿真器是选择ST-LINK还是选择J-LINK?各有什么优势啊?
1024浏览 4评论
stm32f4下spi+dma读取数据不对是什么原因导致的?
397浏览 3评论
STM32F0_TIM2输出pwm2后OLED变暗或者系统重启是怎么回事?
723浏览 3评论
712浏览 3评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2025-4-10 22:03 , Processed in 1.297604 second(s), Total 80, Slave 63 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191