之前也遇到过这个问题后来把HAL_Delay 去掉了. 然后发现不行, 还是得有它.不然发串口数据发的太快会乱掉. 得慢点发. 然后调试到HAL_Delay()方法的内部发现 HAL_GetTick( )函数一直返回 __weak void HAL_Delay(uint32_t Delay) { uint32_t tickstart = HAL_GetTick(); uint32_t wait = Delay; /* A...
系统时间一方面用于HAL库自身调用,另一方面用户也可以使用,为开发带来便利。(本文提到的相关使用主要应用于未使用OS(操作系统)的情况下。) 基础使用 一般的系统时间使用方面常用到两个函数: __weak uint32_t HAL_GetTick(void) 返回从系统运行开始经过的时间,默认情况下单位为ms; __weak void HAL_Delay(uint32_t...
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库硬件IIC工程移植到rtt操作系统中时,出现了一些错误,分享如下。 在使用hal库IIC的读函数HAL_I2C_Mem_Read时,发现程序一直卡在I2C_WaitOnFlagUntilTimeout函数里,原因是I2C_WaitOnFlagUntilTimeout函数里有这样一句 if (((HAL_GetTick() - Tickstart) > Timeout) ... ...
当程序进入延时函数时,就调用HAL_GetTick()获取当前uwTick的值。接着判断wait的值,若不大于可以延时的最大值,则wait自加1,最后不断的获取HAl_GetTick的值,直到这个值和初始值的差不小于等待的时间。所以,当我们的Delay形参越大,wait也越大,也就需要更长的时间来调出while循环。 综上所述,我们只要改变中断的频...
while((HAL_GetTick() - tickstart) < wait) { } } 注意事项说到,计时器的时基来自SysTick定时器,且在固定时间间隔产生(interrupt)中断 系统滴答定时器(System tick timer)的优先级默认为最低,外部中断处理的优先级比系统滴答定时器优先级高,具体流程如下 ...
// HAL_GetTick()函数功能只是返回uwTick值,uwTick是定义的全局变量,该值每次进入滴答定时中断自增1 uint32_t tickstart = HAL_GetTick(); //定义局部变量,等于需要延时的时间 uint32_t wait = Delay; /* Add a period to guaranty minimum wait */ ...
使用HAL库时,不能在中断里调用HAL_GetTick(),不然会一直循环出不来 比如使用在定时器中断里使用阻塞的串口发送/接收函数 不要在中断函数里使用阻塞的串口、I2C、SPI发送/接收函数 会卡在如图所示的地方一直while 2023.7.1 发现是中断优先级问题 Timebase source的中断优先级一定要高于其他,这样才能在中断里使用delay...
minimum wait */if(wait<HAL_MAX_DELAY){wait+=(uint32_t)(uwTickFreq);}while((HAL_GetTick()...
ISR中的HAL_IncTick()函数生成变量增量,并通过调用HAL_GetTick()函数检索此变量的值。当使用带有...