硬汉嵌入式论坛

 找回密码
 立即注册
查看: 643|回复: 13
收起左侧

[技术讨论] stm32 串口DMA中断接收数据异常

[复制链接]

4

主题

10

回帖

22

积分

新手上路

积分
22
发表于 2025-8-16 16:32:30 | 显示全部楼层 |阅读模式
1、平台

stm32f412、freertos cmis_v2
2、配置背景
通过cube配置的环境,uart1、uart2、uart3、uart6;DMA方式rx,普通方式tx(vApplicationIdleHook 里面发送)
DMA我使用的是idle方式(串口空闲下来了就触发 HAL_UARTEx_RxEventCallback)
#define configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY 5

DMA中断优先级(DMA rx 是circur模式)和uart 全局优先级都是5


  HAL_NVIC_SetPriority(DMA1_Stream1_IRQn, 5, 0);
  HAL_NVIC_EnableIRQ(DMA1_Stream1_IRQn);
//


    /* USART1 interrupt Init */
    HAL_NVIC_SetPriority(USART1_IRQn, 5, 0);
    HAL_NVIC_EnableIRQ(USART1_IRQn);

//
3、外设,开机后外设初始化比stm32快,所以外部串口一会儿就开始发串口数据了
4、问题
   反复开关机,有的时候串口dma rx 没有响应,具体为进入不到 HAL_UARTEx_RxEventCallback, 这个函数;

请教一下,这个可能是什么原因?




回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
118312
QQ
发表于 2025-8-18 09:36:55 | 显示全部楼层
调试状态看下UART的状态寄存器和DMA的状态寄存器,看看是不是触发异常了。

调试的时候通过IDE的RST来替代重新上电效果。
回复

使用道具 举报

3

主题

13

回帖

22

积分

新手上路

积分
22
发表于 2025-8-19 10:57:18 | 显示全部楼层
可能接受出错了,进入HAL_UART_ErrorCallback
回复

使用道具 举报

4

主题

10

回帖

22

积分

新手上路

积分
22
 楼主| 发表于 2025-8-27 12:10:00 | 显示全部楼层
是的,我看了下,是进入到errorcallback了,我看看状态寄存器报的什么错,
回复

使用道具 举报

35

主题

221

回帖

326

积分

高级会员

积分
326
发表于 2025-8-27 13:48:40 | 显示全部楼层
// 开启空闲中断
  __HAL_UART_CLEAR_IDLEFLAG(huart);
  volatile uint8_t dummy = huart->Instance->DR; // 清除残留数据
  __HAL_UART_CLEAR_FEFLAG(huart);
  __HAL_UART_CLEAR_NEFLAG(huart);
  __HAL_UART_CLEAR_OREFLAG(huart);
  __HAL_UART_CLEAR_PEFLAG(huart);
  huart->ErrorCode = HAL_UART_ERROR_NONE;
  __HAL_UART_ENABLE_IT(huart, UART_IT_IDLE);
  HAL_UART_DMAStop(huart);
  HAL_UART_Receive_DMA(huart, ctx->rx_dma_buf, UART_RX_BUFFER_SIZE);

初始化时清除下dma寄存器和残留残留,然后uart error callback里面如果这个串口也触发也也要重新执行初始化
回复

使用道具 举报

4

主题

10

回帖

22

积分

新手上路

积分
22
 楼主| 发表于 2025-8-27 18:09:14 | 显示全部楼层
wx030510026 发表于 2025-8-19 10:57
可能接受出错了,进入HAL_UART_ErrorCallback

是的,进入到这个函数了,需要查看哪些信息或者怎么处理呢?
回复

使用道具 举报

4

主题

10

回帖

22

积分

新手上路

积分
22
 楼主| 发表于 2025-8-27 18:14:39 | 显示全部楼层
LinY 发表于 2025-8-27 13:48
// 开启空闲中断
  __HAL_UART_CLEAR_IDLEFLAG(huart);
  volatile uint8_t dummy = huart->Instance->D ...

上面这段代码是放到串口初始化里的,对吧;
如果跑到uart_error_callback,是要重新初始化串口么?例如 MX_USART2_UART_Init, 还是需要重新初始化DMA么?
回复

使用道具 举报

4

主题

10

回帖

22

积分

新手上路

积分
22
 楼主| 发表于 2025-8-27 20:16:40 | 显示全部楼层
比较奇怪的现象是接上jtag的时候基本正常,拔掉jtag正常跑就异常
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
118312
QQ
发表于 2025-8-28 14:26:30 | 显示全部楼层
liusum12 发表于 2025-8-27 20:16
比较奇怪的现象是接上jtag的时候基本正常,拔掉jtag正常跑就异常

注意从板子端拔掉下载器,然后板子重新上电,看看正常不,如果不正常,程序确实有问题,不支持冷启动运行。
回复

使用道具 举报

4

主题

10

回帖

22

积分

新手上路

积分
22
 楼主| 发表于 2025-8-28 17:53:52 | 显示全部楼层
eric2013 发表于 2025-8-28 14:26
注意从板子端拔掉下载器,然后板子重新上电,看看正常不,如果不正常,程序确实有问题,不支持冷启动运行 ...

从板子端拔掉下载器,就启动不正常了(某个串口中断就没有响应)
回复

使用道具 举报

4

主题

10

回帖

22

积分

新手上路

积分
22
 楼主| 发表于 2025-8-28 17:55:05 | 显示全部楼层
eric2013 发表于 2025-8-28 14:26
注意从板子端拔掉下载器,然后板子重新上电,看看正常不,如果不正常,程序确实有问题,不支持冷启动运行 ...

启动和带jtag的运行,区别在什么地方呢?
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
118312
QQ
发表于 2025-8-29 07:54:11 | 显示全部楼层
liusum12 发表于 2025-8-28 17:55
启动和带jtag的运行,区别在什么地方呢?

这样才能真实反馈实际应用是否正常。
回复

使用道具 举报

4

主题

10

回帖

22

积分

新手上路

积分
22
 楼主| 发表于 2025-8-29 14:12:53 | 显示全部楼层
有stm32单片交流群么? 哪位大佬拉我一下哈
回复

使用道具 举报

85

主题

801

回帖

1056

积分

至尊会员

积分
1056
发表于 2025-8-29 21:38:59 | 显示全部楼层
可以看一下你用的是哪个版本的HAL库,确认HAL库堆溢出异常做了正确的处理
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2025-9-26 11:39 , Processed in 0.060813 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表