历史上的今天
今天是:2025年08月08日(星期五)
2019年08月08日 | 【STM32CUBEMX】HAL 库的 Timeout=1 异常分析
2019-08-08 来源:eefocus
背景
STM32CUBEMX 在生成的库函数,基本上都有输入参数 Timeout。
比如说:
HAL_StatusTypeDef HAL_SPI_Transmit(SPI_HandleTypeDef *hspi, uint8_t *pData, uint16_t Size, uint32_t Timeout);
HAL_StatusTypeDef HAL_SPI_Receive(SPI_HandleTypeDef *hspi, uint8_t *pData, uint16_t Size, uint32_t Timeout);
HAL_StatusTypeDef HAL_SPI_TransmitReceive(SPI_HandleTypeDef *hspi, uint8_t *pTxData, uint8_t *pRxData, uint16_t Size, uint32_t Timeout);
这几天就吃了这个 Timeout 的哑巴亏。。。怎么说~
我把这个 Timeout 设成 1 了,1 这个值是万万使不得的一个值,咱们分析下。
分析 Timeout = 1 为什么不能用
我们以HAL_StatusTypeDef HAL_SPI_Transmit(SPI_HandleTypeDef *hspi, uint8_t *pData, uint16_t Size, uint32_t Timeout),先来看看 Timeout 这个值是怎么用的。
在进入 函数后,咱们可以看到这个语句:tickstart = HAL_GetTick();
语句的作用:获取进入函数时的时间。
提取HAL_GetTick的源码:
__weak uint32_t HAL_GetTick(void)
{
return uwTick;
}
接儿,找到 uwTick 赋值的位置。
__weak void HAL_IncTick(void)
{
uwTick++;
}
最后定位HAL_IncTick函数应用位置。
void SysTick_Handler(void)
{
/* USER CODE BEGIN SysTick_IRQn 0 */
/* USER CODE END SysTick_IRQn 0 */
HAL_IncTick();
HAL_SYSTICK_IRQHandler();
/* USER CODE BEGIN SysTick_IRQn 1 */
/* USER CODE END SysTick_IRQn 1 */
}
咱们来屡下思路:
滴答时钟在每次中断时会更新 uwTick,以供各个HAL函数计算超时使用。
再回到HAL_StatusTypeDef HAL_SPI_Transmit(SPI_HandleTypeDef *hspi, uint8_t *pData, uint16_t Size, uint32_t Timeout)函数,看 tickstart 和 TImeout 是怎么用的。
/* Timeout management */
if((Timeout == 0U) || ((Timeout != HAL_MAX_DELAY) && ((HAL_GetTick()-tickstart) >= Timeout)))
{
errorcode = HAL_TIMEOUT;
goto error;
}
当 HAL_GetTick() - tickstart) >= Timeout 时,就会认为是 Timeout。这么看着没有任何问题。
那咱们假定 SysTick_Handler 的中断周期是 1ms。看下图,当tickstart在红色点上赋值,若操作在 SysTick_Handler 中断前未完成,SysTick_Handler 中断先执行了 uTick++,那么 HAL_GetTick() - tickstart) >= 1 就为真了。也就意味着,实际上,咱们的 Timeout 并不为 1 个 SysTick_Handler 中断周期。尤其是当 tickstart 赋值越向右靠近,越容易出现 Timeout,因此在调用HAL 库时,必须使 Timeout 设置大于1!

史海拾趣
|
1.长假,预祝大家双节快乐 2.大家【晒电路】,才是真的【晒电路】,晒 完我就回家了 3.正题 在许多应用场合,需要随时通过调整马达的转速实现调整风量、流量等目的。过去通常采用通过调整串入马达的电感量来实现对马达转速的控制,这种方法存在 ...… 查看全部问答> |
|
1.精通C++或C语言,能熟练使用EVC或VS2005等工具开发应用软件. 2.有多媒体,GPRS网络应用开发经验者优先. 3.有游戏软件编程经验着优先. 4.熟悉windows ce 系统优先. 5.有较强的团队合作精神,富有责任心. 6.待遇面议. 请把您的简历和作品发送到s ...… 查看全部问答> |
|
我的工程程序改自IAR自带的,它里面只有Debug的脚本,我填加了个Release,用debug in flash的脚本,结果发现生成的 ...… 查看全部问答> |
|
怀着对ARM的好奇和学习的冲动参加了这个活动。只会一点点51的我显然是低估了ARM的复杂程度。 因为没有接触过ARM,加上自己擅长的是结构设计。以为只有设计个外壳和内部结构还有面板就可以了。没想到项目只是做个板子就结束了。并不是以搞个成型的 ...… 查看全部问答> |
|
本帖最后由 dontium 于 2014-12-30 20:36 编辑 TI的网站,设计得还是很不错的,器件的查找也非常方便。-------这都得益于TI搞搞活动、搞调查问卷的结果,---- 集大家智慧帮TI赚钱。 第一,记住TI主页 ...… 查看全部问答> |
|
MSP430F5529LP+CC3000学习心得(一)——与AP的连接 设备:MSP430F5529LP+CC3000 BoosterPack EVMSDK:CC3000 SDK_V1.11 、android下smart Config APPPatch:PatchProgrammerMSP430F5529LP-7.11.7.13.19开发环境:CCS 5.4.0第一步:硬件连接。第二步:对F5529LP进行Patch programmer。导入C:\\ti\\Pat ...… 查看全部问答> |




