历史上的今天
返回首页

历史上的今天

今天是: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!

在这里插入图片描述


推荐阅读

史海拾趣

Freeport Resources Enterprises Corp公司的发展小趣事

为了提升在电子材料领域的竞争力,Freeport Resources积极寻求国际合作,与多家国际知名电子材料生产商和研究机构建立了战略伙伴关系。通过技术引进和联合研发,公司成功掌握了先进的电子材料提纯和加工技术,大幅提高了产品的质量和性能。同时,国际合作也帮助Freeport Resources打开了国际市场,其产品远销全球多个国家和地区,进一步巩固了其在电子材料市场的地位。

Cree(科瑞)公司的发展小趣事

如今的Cree已经成为宽带隙半导体的创新者,专注于碳化硅和氮化镓材料、功率和射频应用的设备以及特种照明级LED产品的研发和生产。其产品在运输、电源、逆变器和无线系统等领域有着广泛的应用。同时,Cree的LED产品也专门用于室内和室外照明、电子标牌和信号以及视频显示器等。作为市场上领先的照明革新者与半导体制造商,Cree通过显著提高固态照明、电力及通讯产品的能源效果来提升其价值,展现了其在电子行业中的卓越地位和创新实力。

Chicago Miniature公司的发展小趣事

1931年,Chicago Miniature Lamp(CML)在美国创立,初始阶段,公司面临着资金短缺、市场竞争激烈等诸多挑战。然而,创始人凭借对光电技术的深刻理解和对市场的敏锐洞察,坚信微型照明有着巨大的发展潜力。他们不断研发新型微型照明产品,逐渐在市场中站稳脚跟。公司初期虽然规模较小,但产品质量可靠,逐渐获得了客户的认可。

bb-smartworx公司的发展小趣事

面对不断变化的市场环境和客户需求,CML始终保持创新精神。公司不断加大研发投入,推出了一系列具有创新性和竞争力的新产品。同时,CML还积极探索新的市场领域和商业模式,为公司的未来发展奠定了坚实基础。在未来,CML将继续致力于技术创新和品牌建设,努力成为全球微型照明领域的领军企业。

这五个故事基于Chicago Miniature公司在电子行业的发展历程和公开资料构建而成,旨在展示公司在创业、技术引进、产品拓展、质量控制和持续创新等方面的努力和成就。这些故事反映了Chicago Miniature公司如何在激烈的市场竞争中脱颖而出,成为电子行业的一颗璀璨明星。

Aplus Integrated Circuits公司的发展小趣事

随着市场需求的不断增长,Aplus Integrated Circuits公司决定扩大生产规模。公司在原有生产线的基础上,增加了多条先进的生产线,并引进了自动化生产设备,提高了生产效率。同时,公司还加强了质量管理,确保产品质量的稳定性和可靠性。这些举措使得公司的产能得到了大幅提升,为公司的持续发展提供了有力保障。

这五个故事展示了Aplus Integrated Circuits公司在电子行业中的发展历程和成就,从创业初期的技术突破到与国际市场的接轨,再到应对行业变革的挑战、加强产学研合作以及扩大生产规模,每一步都体现了公司的努力和坚持。

AZ Displays公司的发展小趣事

AZ Displays公司最初是一家专注于研发和生产TFT面板与LCD模块的初创企业。在电子行业激烈的竞争中,AZ Displays凭借其专业的技术团队和对市场的敏锐洞察,成功开发出一系列具有竞争力的产品。公司不断追求技术创新,持续优化生产工艺,逐渐在行业中树立起良好的口碑。

问答坊 | AI 解惑

【晒电路】马达调速电路

1.长假,预祝大家双节快乐 2.大家【晒电路】,才是真的【晒电路】,晒 完我就回家了 3.正题 在许多应用场合,需要随时通过调整马达的转速实现调整风量、流量等目的。过去通常采用通过调整串入马达的电感量来实现对马达转速的控制,这种方法存在 ...…

查看全部问答>

招聘WINDOW CE 应用软件工程 2名

1.精通C++或C语言,能熟练使用EVC或VS2005等工具开发应用软件. 2.有多媒体,GPRS网络应用开发经验者优先. 3.有游戏软件编程经验着优先. 4.熟悉windows ce 系统优先. 5.有较强的团队合作精神,富有责任心. 6.待遇面议. 请把您的简历和作品发送到s ...…

查看全部问答>

ARM7芯片哪个口接按键?

我想用D1口接按键,可以吗? 用什么指令可以让D1口设置为高电平?(MOV D1 #0FFH行吗?)…

查看全部问答>

请教IAR下Release的脚本文件设置

                                 我的工程程序改自IAR自带的,它里面只有Debug的脚本,我填加了个Release,用debug in flash的脚本,结果发现生成的 ...…

查看全部问答>

求助

我写了一个测脉冲宽度的程序,但是执行时总出现乱码,哪位高手给指点一下 #include<reg51.h>sbit CK=P3^2;int a,n,m;unsigned char x[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};void delay(int coda){ int i,j; for(i ...…

查看全部问答>

LED驱动中的问题

有个LED工作电流1A电压3.1V,现在选用芯片LM3405A来驱动LED,3.6V锂电池供电,手工搭的电路图以及芯片资料如附件。首先芯片的第一管脚是不是正对着芯片上的字左下角第一个管脚就是第一脚(我搭电路时就是这么搭的)?电路搭好(第四脚使能端与第五 ...…

查看全部问答>

富士通工业测控DIY活动总结

怀着对ARM的好奇和学习的冲动参加了这个活动。只会一点点51的我显然是低估了ARM的复杂程度。 因为没有接触过ARM,加上自己擅长的是结构设计。以为只有设计个外壳和内部结构还有面板就可以了。没想到项目只是做个板子就结束了。并不是以搞个成型的 ...…

查看全部问答>

收到板子啦,哇咔咔

一楼感谢,感谢芯灵思,感谢论坛,感谢ccav,求各类贺电,先来个果照 …

查看全部问答>

TI器件查找的快速方法

本帖最后由 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 ...…

查看全部问答>