历史上的今天
返回首页

历史上的今天

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

2018年10月06日 | 关于STM32串口空闲中断IDEL的问题

2018-10-06 来源:eefocus

1.空闲中断是接受数据后出现一个byte的高电平(空闲)状态,就会触发空闲中断.并不是空闲就会一直中断,准确的说应该是上升沿(停止位)后一个byte,如果一直是低电平是不会触发空闲中断的(会触发break中断)。


2.关于第二点有要铺垫的三个情况,datasheet中
"当一空闲帧被检测到时,其处理步骤和接收到普通数据帧一样,但如果IDLEIE位被设置将产生一个中断"
"空闲符号被视为完全由'1'组成的一个完整的数据帧,后面跟着包含了数据的下一帧的开始位'1'的位数也包括了停止位的位数” 空闲符号的配图后面跟这一个低电平.
有人理解为只有收到下一个数据的起始位才会触发中断,这样理解是不对的,应该是数据后有空闲了一帧就会触发.


3.清中断的方式感觉奇怪,使用函数USART_ClearITPendingBit( USART1, USART_IT_IDLE )清除不了中断的.我用的是3.5的库,查看函数说明,里面的@param参数并没有IDLE,后面的@note中,这样说:
"PE(Parity error),FE(Framing error),NE(Noise error),ORE(OverRun error) and IDLE(Idle line detected) pending bits are cleared by software sequence: a read operation to USART_SR register (USART_GetITStatus()) followed by a read operation to USART_DR register (USART_ReceiveData())."
我是通过语句"USART1->DR;"来清除IDLE中断的.

现在有很多数据处理都要用到不定长数据,而单片机串口的RXNE中断一次只能接收一个字节的数据,没有缓冲区,无法接收一帧多个数据,现提供两种利用串口IDLE空闲中断的方式接收一帧数据,方法如下:

方法1:实现思路:采用STM32F103的串口1,并配置成空闲中断IDLE模式且使能DMA接收,并同时设置接收缓冲区和初始化DMA。那么初始化完成之后,当外部给单片机发送数据的时候,假设这帧数据长度是200个字节,那么在单片机接收到一个字节的时候并不会产生串口中断,而是DMA在后台把数据默默地搬运到你指定的缓冲区里面。当整帧数据发送完毕之后串口才会产生一次中断,此时可以利用DMA_GetCurrDataCounter();函数计算出本次的数据接受长度,从而进行数据处理。

应用对象:适用于各种串口相关的通信协议,如:MODBUS,PPI ;还有类似于GPS数据接收解析,串口WIFI的数据接收等,都是很好的应用对象。

方法2:实现思路:直接利用stm32的RXNE和IDLE中断进行接收不定字节数据。 


推荐阅读

史海拾趣

问答坊 | AI 解惑

[资料] HSPICE最新中文使用手册

HSPICE最新中文教程,希望对大家有帮助!…

查看全部问答>

关于dm642 D1 转 Cif的问题

关于dm642 D1 转 Cif的问题 请教高手, 我采集出来的是pal制式 的 D1(720*576)的图像,  但是要做图像处理, 所以想要缩小成Cif的, 请问怎么做啊,我在网上看到说抽出来其中的一部分, 具体怎么做呢,请高手指点!!!…

查看全部问答>

定时器0的中断和串口中断不能同时工作么?

include #include #define _MHZ_ 11    sbit LED1=P0^0; sbit LED2=P0^1; sbit P0_2=P0^2; sbit P0_3=P0^3; sbit K1=P0^4; sbit K2=P0^5; sbit P0_6=P0^6; sbit P0_7=P0^7; sbit LED3=P1^0; sbit LED4=P1^1; sbi ...…

查看全部问答>

LPC114申请

很好奇!:Q :Q…

查看全部问答>

请教STM32的I2C通讯问题

大家好,我最近在弄一个小东西,是用stm32的I2C和一个射频芯片的I2C通讯,主要目的是往我的射频芯片里面写数据。前几天我在网上找到了st的固件库和demo,结果一直没有调通,后来上网看到它的升级版,下下来跑了它的双地址通讯那个demo,跑通了 ...…

查看全部问答>

发本开关电源设计方面的书

这本书在原理性、实践性方面都不错,学习开关电源设计的网友不妨看书学习,包括做逆变器也一样有参考价值,掌握理论自会知道如何实施。     …

查看全部问答>

修改NWK_MAX_DEVICE_LIST定义为70,编译无法通过。请求解决办法。

修改NWK_MAX_DEVICE_LIST定义为70,编译无法通过。请求解决办法。我知道是由于内存够请问有什么办法可以修改?我目前的设置如下…

查看全部问答>

求助

ADC12中的增益误差只会使精度下降,而不会使编码丢失是吗? 如果是,能解释下吗?  …

查看全部问答>

MSP430英文书籍推荐一、Embedded Systems Design using the TI msp430 Series

MSP430英文书籍推荐一、Embedded Systems Design using the TI msp430 Series https://download.eeworld.com.cn/detail/tiankai001/8744 …

查看全部问答>