systick与hal_delay的关系与注意事项
本文将介绍systick与hal_delay()函数之间的关系,以及使用hal_delay()函数的注意事项;
一.hal_delay()函数实现的原理、与systick的关系
下面我们先看一下hal_delay函数的源码
__weak void hal_delay(uint32_t delay){ uint32_t tickstart = hal_gettick(); uint32_t wait = delay; /* add a freq to guarantee minimum wait */ if (wait < hal_max_delay) { wait += (uint32_t)(uwtickfreq); } while((hal_gettick() - tickstart) < wait) { }}从源码可以看出该函数将我们传入的参数与hal_gettick()-tickstart比较,若不满足条件则退出while、若满足
接下来我们追一下hal_gettick()的源代码:
__weak uint32_t hal_gettick(void){return uwtick;}接着追一下uwtick ,发现在下面这个函数中对它的值进行了操作:
__weak void hal_inctick(void){uwtick += uwtickfreq;}接着追一下uwtickfreq 发现uwtickfreq = 1,接着追一下hal_inctick(void)函数:
发现hal_inctick(void)函数是在systick的中断回调函数内调用的;
综上可知hal_delay与systick的关系:hal_delay函数的执行、最终是依赖于systick的每触发一次systick的中断耗时1ms,hal_gettick()-tickstart会增大1、知道差值等于hal_delay的传入参数。
二、由systick与hal_delay之间的关系可知,我们在使用hal_delay的时候需要注意:当在中断中使用了hal_delay函数,则该中断的抢占优先级必须低于systick中断的优先级,否则会导致systick中断不能抢占该中断函数、最终导致hal_gettick()-tickstart的值不会变,从而陷入死循环中。
现在什么手机好用些?2018手机各价格区间畅销机型排行榜告诉你答案
晶体管和三极管有什么区别
联想拯救者Y9000K 2020款信息披露,将会搭载15.6英寸屏幕
湖南3亿美元建造集成电路产业“航母”
【服务器数据恢复】Linux环境下RAID6数据恢复案例
SysTick与HAL_Delay的关系与注意事项
RTX2070Super显卡外观照曝光 依然是公版煤气灶风格的散热系统
准备买平板的快快住手!苹果10.5英寸新iPad Pro无边框将闪耀登场
现代温湿度传感器的原理与结构分析
可以用Micro bit DIY制作智能小风扇
pcb油墨特性
fireflyAIO-3288J主板LED介绍
基于FPGA与ARM进行遥测数据网络转发的流程剖析
中国敦促英国不要在5G建设方面歧视华为 抵制他国的压力
未来教育发展趋势是怎样的
红外线光电开关的原理_红外线光电开关分类
元戎启行发布L4级自动驾驶传感解决方案
康佳集团2019年一季报给投资者留下的第一印象
路由器的无线传输速率有多重要,主要影响的是什么
适用消费电子的三电平H桥输出D类放大器