历史上的今天
返回首页

历史上的今天

今天是:2025年04月10日(星期四)

正在发生

2019年04月10日 | 关于STM32F4的串口注意的坑

2019-04-10 来源:eefocus

最近在研究STM32F4的串口通信的时候,发现一些有意思的现象,在这里做一个记录


这里就不再说明串口配置的具体步骤了,重点不在这边。


先贴上我的串口接收中断的程序


void USART_IRQHandler(void)

{

    OS_ERR err;

    char * p_mem_blk;

    OSIntEnter();       //进入中断

    p_mem_blk =(char*) OSMemGet(&uC_mem,&err);    

    //确保是否产生了USART_IT_RXNE中断

if(USART_GetITStatus(USART,USART_IT_Flag) != RESET) 

{

        * p_mem_blk = USART_ReceiveData ( USART );     //获取接收到的数据        

        OSTaskQPost(&USART1_Get_TCB,p_mem_blk,1,OS_OPT_POST_FIFO,&err);                   

        //将信息发送给USART1_Get_TCB  任务    

        USART_SendData(USART1,  *p_mem_blk);

        while (USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);        

        LED_TOGGLE;    

    USART_ClearITPendingBit(USART,USART_IT_Flag);        

    OSIntExit();       //退出中断      

}

这是一个串口接收到什么就回传什么的程序,而且每进入一次中断就会改变一次LED的电平。先忽略一些uCOS-III的内存管理的函数。


开始试验


我先发送了一个1,结果是灯亮了,串口助手也会显了一个1


一切都很按预想进行。


再次发送12,结果是灯还是亮着,串口也是回显了12,那么说明进入了中断2次,所以LED的电平不变


那么可以得出一个结论:串口中断是由接受到1个字节触发中断


试试发送123,结果灯灭了,那么说明我们之前的猜想是有一定正确性的


现在中断函数换为


void USART_IRQHandler(void)

{

    OS_ERR err;

    char * p_mem_blk;

    OSIntEnter();       //进入中断

    p_mem_blk =(char*) OSMemGet(&uC_mem,&err);    

    //确保是否产生了USART_IT_RXNE中断

if(USART_GetITStatus(USART,USART_IT_Flag) != RESET) 

{

* p_mem_blk = USART_ReceiveData ( USART );     //获取接收到的数据        

        OSTaskQPost(&USART1_Get_TCB,p_mem_blk,1,OS_OPT_POST_FIFO,&err);                   

        //将信息发送给 USART1_Get_TCB  任务    

        USART_SendData(USART1,  *p_mem_blk);

while (USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET); 

        USART_SendData(USART1,  'n');

while (USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);        

        LED_TOGGLE;    

    USART_ClearITPendingBit(USART,USART_IT_Flag);        

    OSIntExit();       //退出中断      

}

其实就是发送完后面再加一个‘n’


重新我们上面的实验:


我们发送一个1,结果是 回显了一个1和换行,灯也亮了,和上面的一样,perfect!


继续发送12,结果还是回显了一个1和换行,灯灭了,奇怪了,为什么和预想的不一样,


进入中断1次,还是发送了一个1和换行,


正常应该是:进入中断2次,所以灯还是亮着的,回显 1rn2rn 才对啊


emmmmm,再试试发送123


结果是灯还是灭的,回显了13和换行,等等,有点小慌。这是为什么?


难道我们之前的推理的是错误的:即接收到1个字节就进入中断


其实不然。


//  USART_ClearITPendingBit(USART,USART_IT_Flag);        

 


其实把这个中断标志注释了就知道了,


连续发送3次123,最后灯是亮着的,可以说明我们的推论是没有错误的,只是说中断标志被人为消除了,其中接收到的第2个数据被冲掉了,再次接收时已经是第三个字节触发的中断了。


如果在中断函数中发送多个值且又接收多个值,因为发送和接收的寄存器是同一个,你接收到数据后又发送该数据,之后又发送一个数据完成后,这时候第二个接收数据已经装入了寄存器了,但是你人为清除了标志位,所以不进入中断,第二个字节就被吃了,紧接着第三个字节重复第一个字节。。。。。。


而如果是不人为消除中断位的话,第二个字节的标志位是中断函数结束后再置位的,所以可以进入中断的。


这里的后面出现的E8是由于uCOS-III内存管理API管理函数造成的,每次进入中断都申请内存,一直产生中断,处理中断函数,所以没有归还内存导致的内存数据错误,注释相关的函数即可,或者扩大申请的内存块数量都可以。


推荐阅读

史海拾趣

EHC(ELECTRONICHARDWARE)公司的发展小趣事

随着环保意识的不断提高,绿色环保已经成为电子行业的发展趋势。EHC公司积极响应这一趋势,致力于研发和生产绿色环保的电子产品。公司采用环保材料和工艺,减少生产过程中的污染排放。同时,EHC公司还积极推动废旧电子产品的回收和再利用工作,为环保事业做出了积极贡献。这种对环保的关注和行动让EHC公司在行业中树立了良好的形象。

Filtran Ltd公司的发展小趣事

为了寻找新的增长点,Filtran Ltd开始探索跨界合作的可能性。公司与一家领先的物联网解决方案提供商建立了战略合作关系,共同开发面向智能家居市场的无线连接模块。这一合作不仅将Filtran Ltd的滤波器技术应用于新的领域,还为公司带来了全新的市场机遇。通过跨界合作,Filtran Ltd成功实现了从单一产品供应商向综合解决方案提供商的转变。

Apx-Crystal公司的发展小趣事

作为一家有社会责任感的企业,Apx-Crystal公司始终将可持续发展作为企业的核心价值观之一。公司积极履行社会责任,关注环境保护和公益事业。在生产过程中,公司采用环保材料和节能技术,降低能耗和排放;在员工福利方面,公司注重员工培训和职业发展,为员工提供良好的工作环境和福利待遇;在社会公益方面,公司积极参与捐资助学、扶贫济困等公益活动,回馈社会。这些举措不仅提升了企业的社会形象,也为公司的长期发展奠定了坚实的基础。

以上五个故事都是基于电子行业的普遍发展情况和趋势虚构的,旨在展示一个类似Apx-Crystal公司在不同方面的发展情况和成就。请注意,这些故事并非基于真实事件或数据,因此可能与实际情况存在差异。

Cliff Electronic Components公司的发展小趣事

面对日益激烈的市场竞争,Apx-Crystal公司意识到单凭自身的力量难以保持长期的竞争优势。于是,公司积极寻求与行业内外的合作伙伴进行技术交流和合作研发。通过与知名高校、科研机构以及同行的紧密合作,Apx-Crystal成功开发出了一系列具有创新性和领先性的电子产品,进一步巩固了其在行业内的领先地位。同时,公司还加大了对产业链的整合力度,推动了产业升级和可持续发展。

Chengdu Sino Microelectronics Technology Co Ltd公司的发展小趣事

面对日新月异的电子技术和不断变化的市场需求,成都华微科技始终坚持持续创新的发展理念。公司不断加大对新技术、新产品的研发投入,积极探索新的商业模式和市场机会。同时,公司还注重人才培养和团队建设,为公司的长远发展储备了丰富的人才资源。正是这种持续创新的精神,使成都华微科技在激烈的市场竞争中始终保持领先地位,引领着中国集成电路设计行业的未来发展。

这五个故事只是成都华微电子科技有限公司发展历程中的一部分,但它们足以展现出这家公司在电子行业中的坚定决心、技术实力、合作精神和创新能力。正是这些因素的共同作用,使成都华微科技能够在激烈的市场竞争中脱颖而出,成为电子行业的佼佼者。

Artesyn Embedded Technologies公司的发展小趣事

随着公司产品的不断完善和市场认可度的提高,Artesyn Embedded Technologies开始与全球众多科技大厂建立紧密的合作关系。这些大厂包括知名的通信设备制造商、数据中心运营商等。通过与这些大厂的合作,Artesyn的产品得以广泛应用于各个领域,进一步提升了公司的知名度和影响力。

问答坊 | AI 解惑

串行接口10位单通道A_D转换TLC1549中文数据资

本帖最后由 paulhyde 于 2014-9-15 04:12 编辑 供大家 参考  …

查看全部问答>

降低噪声与干扰

降低噪声与干扰 1)  能用低速芯片就不用高速的,高速芯片用在关键地方。 (2)  可用串一个电阻的办法,降低控制电路上下沿跳变速率。 (3)  尽量为继电器等提供某种形式的阻尼。 (4)  使用满足系统要求的 ...…

查看全部问答>

如何实现485通信

pc机经232-〉485转换器,后和多台485设备双向通信,我写过232的,对于485不清楚。 请问: (1)这个应该是全双工方式还是半双工方式? (2)如果是半双工如何知道现在有没有485设备占用通信线路? (3)如果发送不成功怎么知道?怎么办?再 ...…

查看全部问答>

iap使用问题

使用str711的iap功能向 flash bank1 写入数据 但是每次 执行写入 或者 清除片内内容时,系统都会重启,请问为何?…

查看全部问答>

iar5.40.7连接stm32f10xx问题

                                 我这有一个stm32f10xx的开发板,但是使用IAR5.40.7的开发软件,可是编译通过了,可无论如很都写不进flash,也无法 ...…

查看全部问答>

我的EK-LM3S811-ND Rev2 无法download 和debug

按照LM3S811 TI Evaluation kit光盘资料中的LM3S811EVALUATION KIT README FIRST安装驱动,安装后和资料里显示是驱动名称不一样. 资料讲的是LM3S811 Virtual COM Port(com6).”而我安装后显示\"stellaris ICDI Debug port(COM15)\",\"\"stellaris IC ...…

查看全部问答>

高价求芯片、电路设计,高手QQ1342451273

高价求芯片、电路设计,高手QQ1342451273…

查看全部问答>

请教一下,在沈阳做电路板制作有市场吗?

  请教一下大家,我想在沈阳开一个制作电路板的小店,主要是针对零散小批量的客户,利用雕刻机做,不知道有没有市场,需求量怎么样?有了解的朋友能不能给点建议。先谢谢大家了!…

查看全部问答>

【跟TI学电源】系列----- TI工程师编写的的WEBENCH设计教程资料,不会的童鞋有福了!

TI工程师编写的的WEBENCH设计教程资料,不会的童鞋有福了! 不知道怎么使用WEBENCH的同学可以下载看看,很详细的中文教程.本文档图文并茂,一步一步带你畅游WEBENCH设计,,, 这些日子,eeworld论坛的【三重礼】活动,正在如火如荼的进行,正确使 ...…

查看全部问答>