OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 5210|回复: 5

求助!在使用STM32H7的串口空闲中断+DMA时遇到的问题

[复制链接]

54

主题

349

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1042
金钱
1042
注册时间
2022-4-20
在线时间
373 小时
发表于 2022-9-1 14:29:20 | 显示全部楼层 |阅读模式
10金钱
本帖最后由 驭剑的秘密 于 2022-9-1 14:48 编辑

我在使用H7练习的时候,做到了串口空闲中断+DMA这一部分,遇到一个问题:串口数据发送一次,有时候数据能被DMA完整搬运到指定地点,有时候搬运的则是残缺的,然后我觉得可能是DMA还没搬完就被停止了接收,但是DMA又不占用CPU的时间,所以进入调试也看不出来是个什么情况,于是我就在停止接收之前加入了一个延时100毫秒,这时候数据都能被DMA完整搬运到指定地点了,当我撤销这个延时的时候,故障又再次出现了,然后我在中断内加入了一个变量,用来记录一次数据发送后进入空闲中断的次数,发现DMA搬运残缺的时候,连着进入了两次空闲中断,总的搬运数据个数与发送的数据个数相符,而正常完整搬运的时候则只进入一次。所以我想问一下,有没有大佬遇到过类似的情况,请教一下如何解决的,以下是我的空闲中断代码,DMA接收的初始化代码就不放了,是直接从例程拿过来的,数据流改的DMA2_Stream6
  1. void USART1_IRQHandler(void)
  2. {
  3. if(__HAL_UART_GET_FLAG(&Uart1_Handle,UART_FLAG_IDLE) != RESET)//判断是否为空闲中断
  4. {
  5. //delay_ms(100);            //此延时为测试用延时,当加上这条时,空闲中断只进入一次,且数据被DMA完整搬运
  6. HAL_UART_AbortReceive(&Uart1_Handle); //停止DMA接收,不停止发送,因为此时发送可能需要工作
  7. USART1->ICR|=1<<4;    //清除idle标志位
  8. numbertimes++;            //此为记录进入了几次空闲中断
  9. Usart1RecCnt = UDP_RX_SIZE-DMA2_Stream6->NDTR;     //得到传输的个数
  10. USART1_IRQ_RevEnable = true;//主程序中使用的标志位
  11. HAL_GPIO_WritePin(GPIOC,GPIO_PIN_11, GPIO_PIN_SET);//RXD点亮
  12. RXD=120;//RXD点亮时间设置ms
  13. memcpy(USARTA_DMA_RX_BUF,TXBUF_t.rx_buffer,Usart1RecCnt);//拷贝一份收到的数据
  14. }
  15. HAL_UART_Receive_DMA(&Uart1_Handle,TXBUF_t.rx_buffer,UDP_RX_SIZE);//重新打开DMA接收
  16. HAL_UART_IRQHandler(&Uart1_Handle);
  17. }
复制代码


又菜又爱指点
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

2

主题

452

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4292
金钱
4292
注册时间
2018-5-14
在线时间
928 小时
发表于 2022-9-1 16:00:47 | 显示全部楼层
空闲中断的判断条件是收到停止位后,再来一个波特率的实际依然没有收到起始位才会触发空闲中断,如果对方设备用的是TC标志判断单字节发送完成的,每个帧都会出现空闲位,如果是用TXE作为单字节标志的,则停止位后紧跟起始位。
所以你这个现象实际上是对方设备的处理有问题导致的,可能是标志位判断错了,可能是发送了一个字节后,有一些复杂任务打断了下然后发了第二个字节。
回复

使用道具 举报

54

主题

349

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1042
金钱
1042
注册时间
2022-4-20
在线时间
373 小时
 楼主| 发表于 2022-9-1 16:37:35 | 显示全部楼层
姚先起 发表于 2022-9-1 16:00
空闲中断的判断条件是收到停止位后,再来一个波特率的实际依然没有收到起始位才会触发空闲中断,如果对方设 ...

我也想过发送来得数据是不是分批来的,但我是用的串口软件直接发送的,数据有900多个
又菜又爱指点
回复

使用道具 举报

0

主题

11

帖子

0

精华

初级会员

Rank: 2

积分
120
金钱
120
注册时间
2019-6-27
在线时间
15 小时
发表于 2022-9-1 20:04:35 | 显示全部楼层
驭剑的秘密 发表于 2022-9-1 16:37
我也想过发送来得数据是不是分批来的,但我是用的串口软件直接发送的,数据有900多个

那兴许是电脑上插的USB转串口的小东西不太行
回复

使用道具 举报

3

主题

821

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3359
金钱
3359
注册时间
2011-11-10
在线时间
207 小时
发表于 2022-9-2 08:43:29 | 显示全部楼层
超过一个bit时间即视为空闲。比如波特率115200,超过82us就串口接收空闲中断了。先换一个串口发送工具试试。
回复

使用道具 举报

54

主题

349

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1042
金钱
1042
注册时间
2022-4-20
在线时间
373 小时
 楼主| 发表于 2022-9-19 10:03:17 | 显示全部楼层
隔离了近20天,我又能继续研究了,楼上的回答我上个月也试过了,并没有解决,有大佬可以帮忙再想想办法吗?
又菜又爱指点
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-2-26 04:00

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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