之前也遇到过这个问题后来把HAL_Delay 去掉了. 然后发现不行, 还是得有它.不然发串口数据发的太快会乱掉. 得慢点发. 然后调试到HAL_Delay()方法的内部发现 HAL_GetTick( )函数一直返回 __weak void HAL_Delay(uint32_t Delay) { uint32_t tickstart = HAL_GetTick(); uint32_t wait = Delay; /* A...
HAL_Delay(1000); //延时1000ms 2 非堵塞式等待 借用系统的开机时间,可以边等待边完成其它任务,不占用CPU,比较推荐这种方式。 需要用到函数 HAL_GetTick() 1uint32_t startTime,now;23startTime=HAL_GetTick();45while(1){//循环开始6now=HAL_GetTick();78if((now-startTime)>1000)//等待时间到9{10br...
系统时间一方面用于HAL库自身调用,另一方面用户也可以使用,为开发带来便利。(本文提到的相关使用主要应用于未使用OS(操作系统)的情况下。) 基础使用 一般的系统时间使用方面常用到两个函数: __weak uint32_t HAL_GetTick(void) 返回从系统运行开始经过的时间,默认情况下单位为ms; __weak void HAL_Delay(uint32_t...
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) { } } 注意事项说到,计时器的时基来自SysTick定时器,且在固定时...
使用HAL库时,不能在中断里调用HAL_GetTick(),不然会一直循环出不来 比如使用在定时器中断里使用阻塞的串口发送/接收函数 不要在中断函数里使用阻塞的串口、I2C、SPI发送/接收函数 会卡在如图所示的地方一直while 2023.7.1 发现是中断优先级问题 Timebase source的中断优先级一定要高于其他,这样才能在中断里使用delay...
当程序进入延时函数时,就调用HAL_GetTick()获取当前uwTick的值。接着判断wait的值,若不大于可以延时的最大值,则wait自加1,最后不断的获取HAl_GetTick的值,直到这个值和初始值的差不小于等待的时间。所以,当我们的Delay形参越大,wait也越大,也就需要更长的时间来调出while循环。 综上所述,我们只要改变中断的频...
HAL_GetTick:这个函数用于获取当前的SysTick定时器计数值。它返回的是自系统启动以来经过的SysTick定时器计数器的值。 HAL_SYSTICK_GetCurrentState: 这个函数用于获取SysTick定时器当前的状态。 HAL_SYSTICK_GetCounter: 这个函数用于获取SysTick定时器的当前计数值。
minimum wait */if(wait<HAL_MAX_DELAY){wait+=(uint32_t)(uwTickFreq);}while((HAL_GetTick()...
函数HAL_Delay()的输入参数Delay是以毫秒为单位的延时时间。延时的原理就是先读取嘀嗒信号的当前计数值保存到变量tickstart,计算在此基础上延时所需要的计数值差量wait,然后在while循环中不断用函数HAL_GetTick()读取滴答信号当前技术值,计算相对于tickstart的差量,当差量超过wait时就达到了延时时间。
12__weak void HAL_Delay(uint32_t Delay)13{ 14 uint32_t tickstart = HAL_GetTick();15 ...