你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM32F427串口接收和发送中断同时使能,出现接收中断丢数的现象。

[复制链接]
jaybi 提问时间:2024-12-5 12:27 / 未解决

STM32F427芯片,针对UART7开启串口接收缓存区非空中断RXNE和串口传输完成中断TC.

1.单测试收发都没有任何问题。

2.将串口与PC机连接,PC端通过串口助手发送数据给测试板(STM32F427),测试板将收到的数据回传给PC,测试发现串口数据接收中断的次数小于PC端发送数据的个数,且发送中断可完全将接收到的数据发送出来。已排除程序其他影响中断进入的问题。

3.针对2的情况测试发现,怀疑串口中断服务函数中先判断接收TXNE中断标志,若有则读DR数据,接下来判断TC中断标志,而后进行手动清除SR寄存器中的TC标志,或进行写入DR数据操作来清楚中断标志。测试怀疑清TC标志过程中把TXNE中断标志也误清除,或影响了TXNE中断的进行。烦请各位专家帮忙指导一下是否存在这种情况,指导一下问题排查方法。

收藏 评论9 发布时间:2024-12-5 12:27

举报

9个回答
废鱼 回答时间:2024-12-5 18:44:12

中断中处理的内容多不多,正常收发是不会发生类似的问题。如果还是不能达到效果,换成DMA试试。

jaybi 回答时间:2024-12-6 09:22:20

废鱼 发表于 2024-12-5 18:44
中断中处理的内容多不多,正常收发是不会发生类似的问题。如果还是不能达到效果,换成DMA试试。
...

中断处理函数内容不多,就是收数据和发送数据。

jaybi 回答时间:2024-12-6 09:32:48
jaybi 发表于 2024-12-6 09:22
中断处理函数内容不多,就是收数据和发送数据。

中断服务函数如下
void UART7_IRQHandler(void)
{u8 SR_ flag = 0;
u8 temp_DR = 0;

temp_SR = UART7->SR;
Int_cnt++;
if((temp_SR&(1<<6)))//检测到传输完成中断
{
if(Uart7BufIndex.writeSBufindex!=Uart7BufIndex.readSBufindex)
Uart7BufIndex.sendflag =0;//正在发送数据
UART7->DR = Uart7BufIndex.SendBuf[Uart7BufIndex.readSBufindex];
Uart7BufIndex.readSBufindex=(Uart7BufIndex.readSBufindex+1) %UARTBUFLENGTH;
}
else
{
UART7->SR &= ~(1<<6);//清除发送完成种段
Uart7BufIndex.sendflag=1;//发送完成标志置1
}
if(temp_sR&(1<<5))//接收到数据
{
Uart7BufIndex.RecvBuf[Uart7BufIndex.writeRBufindex]=UART7->DR;
Uart7BufIndex.writeRBufindex =(Uart7BufIndex.writeRBufindex
SUARTBUFLENGTH;
}
//监测到其他异常错误-
if((temp_SR&OxF)!=0)
{
     temp DR= UART7->DR;
}
xmshao 回答时间:2024-12-6 14:57:01
你可以尝试UART收发分别基于DMA和中断方式实现。比方,接收采用基于空闲事件的DMA不定长接收方式,发送采用中断方式。


不开启DMA相关中断,仅使用UART的空闲中断。


每收到一串数据后,在空闲中断回调函数里调用发送函数,将刚才收到的数据发回给PC.


这样的话,流程比较简洁,CPU压力也小。


  MX_GPIO_Init();
  MX_DMA_Init();
  MX_USART3_UART_Init();


  HAL_UARTEx_ReceiveToIdle_DMA(&huart3, ( uint8_t *)uartRXbuffer,  UARTSIZE);

  while (1)
  {


  }


void HAL_UARTEx_RxEventCallback(UART_HandleTypeDef *huart, uint16_t Size)
{


DataCNT = Size;

uartRXbuffer[DataCNT]='\r';
uartRXbuffer[DataCNT+1]='\n';

HAL_UART_Transmit_IT(&huart3, ( uint8_t *)uartRXbuffer,  DataCNT+2);

}
rrr.png
jaybi 回答时间:2024-12-8 08:27:14
xmshao 发表于 2024-12-6 14:57
你可以尝试UART收发分别基于DMA和中断方式实现。比方,接收采用基于空闲事件的DMA不定长接收方式,发送采用 ...

因为我现在的应用环境,串口数量较多,Dma已经全部占用了,所以这一路串口就只能用中断收发,这种中断收发从芯片本身来说会有问题吗?现在就想判定一下是否接收中断被异常清楚未正常进呢?
xmshao 回答时间:2024-12-8 19:24:34

jaybi 发表于 2024-12-8 08:27
因为我现在的应用环境,串口数量较多,Dma已经全部占用了,所以这一路串口就只能用中断收发,这种中断收 ...

HI,

1、芯片本身这个地方肯定没问题。我推荐你使用DMA进行接收,原因相信你清楚了。

2、即使中断收发也不该有问题,只是这里面的状态啊、标志啊结合具体应用处理好就行。

jaybi 回答时间:2024-12-9 09:08:44
xmshao 发表于 2024-12-8 19:24
[md]

HI,

那您看您有中断收发的例程可以发给我参考一下吗?
xmshao 回答时间:2024-12-10 14:59:04

jaybi 发表于 2024-12-9 09:08
那您看您有中断收发的例程可以发给我参考一下吗?

其实 各个STM32系列里都有例程,多数是基于HAL库的。

如果需要基于LL库的,我这边可以给你提供个。私信里留下邮箱即可。

jaybi 回答时间:昨天 11:40
xmshao 发表于 2024-12-10 14:59
[md]

其实 各个STM32系列里都有例程,多数是基于HAL库的。

您好,我现在初始化uart5只开启接收缓存区不为空中断,中断优先级为最高。使能uart3的串口dma发送。两个串口波特率均为230400。硬件中将uart3和uart5发收互联,进行uart3发送,uart5接收测试。
主函数中uart3每5ms发送50个字节,uart5中断服务函数中判断到rxne标志或者ore标志则接收计数加1,但ore标志一直未判断到过。这样进行发测试,测试结果发现uart3发送2百万个字节左右,uart5接收会丢1,2个字节,请问这个接收丢数是什么原因呢?
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版