历史上的今天
返回首页

历史上的今天

今天是:2024年12月10日(星期二)

正在发生

2018年12月10日 | 关于stm32串口不定长数据接收(hal库)的若干问题

2018-12-10 来源:eefocus

使用串口空闲中断和DMA配合时出现的问题:


问题1.串口接收一旦溢出就会丢数据。

例如串口接收满了,稍等几秒再启动新的DMA接收函数HAL_UART_Receive_DMA时,就丢失数据了,而且是再也收不到串口数据。如果接满后马上启动就没这个问题。

看官方示例代码,停止DMA接收后似乎要DeInit后重新初始化Init和启动DMA接收


解答:


当接收DMA关闭后,此时串口还是激活的,若此时串口来数据,无法触发DMA传输,此时产生上溢错误(ORE),由于串口数据寄存器里的数据不能及时转移走,后面来的数据就进不来。一旦出现这种错误后,就不会再触发DMA请求,即使再开启DMA也不行。要恢复正常的话就只有Deinit后再重新初始化串口,或者直接将数据寄存器中的数据读走后,后面的数据才能正常进入,从而正常产生DMA请求,这个DMA请求是指硬件请求。

其实在STM32官网公众号有文章介绍了该问题,主要是先启动了串口再启动DMA就会容易引起该问题。因此为了防止该问题要不每次开DMA都清ORE寄存器;要不按规矩先开DMA再开串口,不用了先关串口再关DMA


2.接收不完全


空闲中断最大的一个问题,就是发送方的一帧数据不能被打断。不然stm32就会触发空闲中断,只接收到一帧的一部分数据。假如两个单片机通信,任意一个串口发送的过程被其他中断打断之后再回来继续发送就会导致帧被截断.


解答:


没有FIFO 无解

 

3.串口DMA接收不能单独停止。

例如串口同时在DMA发送和DMA接收,DMA接收到一半我要终止DMA的话,只能调用HAL_UART_DMAStop把接收DMA和串口DMA都停止。

换言之,不能单独停止DMA接收。

我理解的接收DMA和发送DMA是两个独立的操作,为什么不能单独停止?


解答:


HAL_UART_DMAStop()是同时关收发DMA,


只关闭接收的函数: HAL_UART_AbortReceive(); 该函数的两个工作内容:


1.先关闭接收DMA,HAL_DMA_Abort(huart->hdmarx);


2.置位RX ready状态,huart->RxState = HAL_UART_STATE_READY;

忽略了错误标志和IT标志处理,最保险的方式还是使用HAL_UART_AbortReceive()函数。

 

一种笨办法::直接利用stm32的RXNE和IDLE中断进行接收不定字节数据。 

基本知识: 

IDLE中断什么时候发生? 

IDLE就是串口收到一帧数据后,发生的中断。什么是一帧数据呢?比如说给单片机一次发来1个字节,或者一次发来8个字节,这些一次发来的数据,就称为一帧数据,也可以叫做一包数据。 

如何判断一帧数据结束,就是我们今天讨论的问题。因为很多项目中都要用到这个,因为只有接收到一帧数据以后,你才可以判断这次收了几个字节和每个字节的内容是否符合协议要求。 

看了前面IDLE中断的定义,你就会明白了,一帧数据结束后,就会产生IDLE中断。


如何配置好IDLE中断? 

下面我们就配置好串口IDLE中断吧。 


USART_CR


Bit4是 : IDLEIE      寄存器                 Bit5是: RXNEIE


对Bit4写1开启IDLE中断,对Bit5写1开启接收数据中断。(注意:不同系列的STM32,对应的寄存器位可能不同)


RXNE中断和IDLE中断的区别? 

当接收到1个字节,就会产生RXNE中断,当接收到一帧数据,就会产生IDLE中断。比如给单片机一次性发送了8个字节,就会产生8次RXNE中断,1次IDLE中断。 


USART_ISR 状态寄存器


Bit4是 : IDLE      寄存器                 Bit5是: RXNE


这是状态寄存器,当串口接收到数据时,bit5就会自动变成1,当接收完一帧数据后,bit4就会变成1. 

需要注意的是,在中断函数里面,需要把对应的位清0,否则会影响下一次数据的接收。


比如RXNE接收数据中断,只要把接收到的一个字节读出来,就会清除这个中断。


IDLE中断,如何是F0系列的单片机,需要用ICR寄存器来清除,如果是F1系列的单片机,清除方法是“先读SR寄存器,再读DR寄存器”。


串口初始化中开启两个中断:


USART_ITConfig(USART1, USART_IT_IDLE, ENABLE);


USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);


中断处理函数如下:


  

当然你也可以先不管各种问题,调试通了再说。


按照以下教程即可正常收发:

https://blog.csdn.net/xukao5671927/article/details/78605022


中断里的
//HAL_UART_DMAStop(&huart2);


更改为:

HAL_UART_AbortReceive(&huart2);


即可修复收取数据的时候关闭了DMA导致不能发送得问题。


推荐阅读

史海拾趣

格科微电子(GALAXYCORE)公司的发展小趣事

格科微电子(GALAXYCORE)公司的发展故事

故事一:创立与初期发展

格科微电子(GALAXYCORE)公司成立于2003年,由中国半导体行业的领军人物赵立新创立。赵立新曾在新加坡国立半导体公司和美国ESS公司积累了丰富的半导体设计经验,回国后,他凭借对CMOS图像传感器的深刻理解,创立了这家公司。初期,格科微电子专注于设计和开发具有成本优势的CMOS图像传感器,这些传感器主要用于功能手机和PC摄像头市场。随着技术的不断积累和产品线的扩展,格科微电子逐渐在市场上站稳了脚跟。

故事二:抓住智能手机市场机遇

进入2007年,随着国内智能手机市场的快速发展,格科微电子敏锐地捕捉到了这一机遇,迅速调整经营重点,将主要资源投入到智能手机图像传感器的研发和销售中。通过不断创新和优化产品设计,格科微电子的CMOS图像传感器在智能手机领域获得了广泛应用,逐渐在行业内崭露头角。这一转型不仅推动了公司的快速发展,也奠定了格科微电子在CMOS图像传感器领域的市场地位。

故事三:技术突破与市场份额提升

在持续的技术创新和研发投入下,格科微电子于2013年实现了重大技术突破,成为中国首家将背照技术应用于200万像素CMOS图像传感器并成功实现批量交付的国内企业。这一技术突破极大地提升了公司产品的性能和市场竞争力,使得格科微电子在全球CMOS图像传感器市场的份额迅速提升。到2014年,格科微电子已稳坐国内CMOS图像传感器出货量第一的宝座,并在全球市场占有率上达到了第二,全年出货量超过9.4亿颗芯片。

故事四:科创板上市与资本助力

2023年8月18日,格科微电子在上海证券交易所科创板成功上市,盘前市值一度突破千亿。此次上市不仅为公司带来了大量的资金支持,也进一步提升了公司的品牌影响力和市场竞争力。在资本市场的助力下,格科微电子将继续加大在技术研发、市场拓展和产能扩张等方面的投入,推动公司业务的持续快速增长。

故事五:新项目建设与未来展望

为了满足市场日益增长的需求,格科微电子启动了“12英寸CIS集成电路特色工艺研发与产业化项目”。该项目旨在通过引进先进设备和技术,提升公司在中高阶CIS产品的生产能力。目前,项目已完成首批设备的安装调试,并顺利产出了良率符合预期的合格产品。随着更多设备的安装和投产,公司的产能将进一步提升,预计最终将实现月产20,000片晶圆的产能。这一项目的成功实施将有助于公司在未来市场竞争中占据更有利的位置,实现更大的发展。

Advance Tapes公司的发展小趣事

随着电子行业的快速发展,对胶带产品的性能要求也越来越高。Advance Tapes公司意识到,只有不断创新才能在激烈的市场竞争中立于不败之地。于是,公司加大了对研发的投入,引进了一批高素质的研发人才,并与多家高校和研究机构建立了合作关系。经过不懈努力,Advance Tapes成功开发出了一系列具有高性能、高可靠性的胶带产品,得到了广大客户的认可。

HCH Co公司的发展小趣事

背景:HCH Co公司自成立以来,始终将技术创新作为企业发展的核心驱动力。在电子行业快速发展的背景下,公司投入大量资源于研发领域,成功研发出一系列具有自主知识产权的核心技术。其中,一项关于高效能电源管理芯片的突破,不仅大幅提升了电子产品的续航能力,还显著降低了能耗,赢得了市场的广泛认可。

发展:随着技术的不断成熟和市场需求的增长,HCH Co公司的电源管理芯片迅速占领市场份额,成为众多知名电子产品制造商的首选供应商。公司的技术创新不仅推动了自身业务的快速增长,也为整个电子行业的节能减排和可持续发展做出了积极贡献。

光大芯业公司的发展小趣事

随着技术的不断进步,光大芯业的产品逐渐得到了市场的认可。公司的产品线涵盖了磁传感、DC/DC、AC/DC转换器、电机驱动等多个领域,广泛应用于消费电子、运动控制、电动工具、智能家居、汽车电子等多个行业。通过不断拓展市场,光大芯业的产品已经走进了千家万户,为人们的生活带来了便利和舒适。

ADPOW公司的发展小趣事

随着国内市场的饱和,ADPOW公司开始将目光投向国际市场。公司制定了国际化发展战略,通过设立海外分支机构、参加国际展会等方式拓展海外市场。同时,公司积极与国际知名企业合作,共同开发新技术、新产品,实现互利共赢。这些举措为公司的长远发展打开了新的局面。

这些故事是基于电子行业的一般发展规律和可能的企业发展路径构建的,并不代表ADPOW公司的真实历史。如需了解该公司的真实发展情况,建议查阅相关资料或访问其官方网站。

Bridgelux公司的发展小趣事

Bridgelux在LED照明技术方面取得了重要突破。公司研发出了一种新型的LED芯片结构,提高了光效和稳定性,降低了成本。这一创新使得Bridgelux的产品在市场上更具竞争力,也为其赢得了众多客户的青睐。同时,公司还注重知识产权保护,积极申请专利,确保自身技术的领先地位。

问答坊 | AI 解惑

C51_应用实战集锦

C51_应用实战集锦…

查看全部问答>

vim中verilog/VHDL怎么自动缩进啊??

以前都是用emacs,现在想改用vim了,但是对vim的设置不太熟悉。    我在.vimrc中设置了set ai ,但是在编辑verilog/VHDL的时候还是没有办法自动缩进啊,按enter还是定位到行首去了。  各位大侠们是怎么设置的verilog/vhdl的自 ...…

查看全部问答>

关于UART的问题

写了一个简单的uart程序 在接收端显示发送端发送的数据 但后来发现发送的是6但接收端总是显示0 后来调试发现: 1.接收端给*P_UART_Data赋值6  但*P_UART_Data仍为0  即赋值不成功 而且即使没有发送接收端也会显示0 2.在发送 ...…

查看全部问答>

wince下adsl拨号上网

请教斑竹和各位大侠,我想在wince平台上直接接adsl modem来实现上网,但不能拨号成功。我的操作步骤描述如下:1、内核加入PPPOE;2、CE起来后,新建连接选择PPPOE;3、输入用户名密码,拨号,但拨号失败。     修改新建连接的TCP/IP属性 ...…

查看全部问答>

安装了wince5的sdk,请问vs2008开发时如何打开wince的模拟器~~~~~

安装了wince5的sdk,请问vs2008开发时如何打开wince的模拟器~~~~~ 小弟开发手机程序。…

查看全部问答>

存储芯片扩展问题?

在MCS-51单片机系统中,用2*8位存储芯片扩展为8*16位(用线选法), 这怎么扩展呀?P0,P2口一共16跟线,那用哪几跟线做为线选选择呀? 真想不明白怎么扩展?哪位大虾说下?谢谢!!…

查看全部问答>

请教大虾:在workbench环境下为什么联不上C-SPY

  用的程序是他自带的例子(LED闪烁).编译通过了,然后按PROJECT菜单中的DEBUGGER选项,出现一MESSAGES窗口提示出错:  error[e12]:una××e to open file \'cl430\' 这是怎么回事啊?   我的电脑是WINDO ...…

查看全部问答>

430的熔丝太难烧断了,求助。

最近在diy一个熔断器,我已经按照时序和6.5V的电压加在tdi上,可就是熔不断。从tdi发指令0xaaaa,TDO返回的始终是0x5555.未熔断状态。所有的操作和时序严格按ti的手册上来的,已经可以和目标430通讯,有返回码,熔断电压是6.5v,也正确,不知为何烧 ...…

查看全部问答>

MSP430FR5739慢慢学整合

感谢lcofjp的MSP430FR5739使用笔记,在此将他的笔记整理,方便大家学习。MSP430FR5739慢慢学之一:C语言的hello world程序https://bbs.eeworld.com.cn/thread-312187-1-1.html MSP430FR5739+DS18B20示例https://bbs.eeworld.com.cn/thread-312499- ...…

查看全部问答>