OpenEdv-开源电子网

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

STM32H7 使用uart dma空闲中断接收时,收到数据不对???

[复制链接]

1

主题

13

帖子

0

精华

初级会员

Rank: 2

积分
53
金钱
53
注册时间
2020-5-21
在线时间
18 小时
发表于 2020-7-12 20:12:19 | 显示全部楼层 |阅读模式
8金钱
本帖最后由 ClineH 于 2020-7-13 23:29 编辑

stm32h743,工程中用到了uart rx的dma。在电脑串口向板子发数据时,数据发送稍微快点,500ms时,USART_RX_BUF2中数据有时会是0。
为何哦???
求助USART2_IRQHandler中断程序如下:


    if (__HAL_UART_GET_FLAG(&UART2_Handler,UART_FLAG_IDLE) != RESET)    //判断是否为空闲中断
    {
        //清除DMA2_Steam3传输完成标志位
        __HAL_UART_CLEAR_IDLEFLAG(&UART2_Handler);//清除标志位                          
               
        HAL_UART_DMAStop(&UART2_Handler);      //传输完成以后关闭串口DMA
        //计算接收数据长度,拷贝数据到USART_RX_BUF
        count = USART_REC_LEN - __HAL_DMA_GET_COUNTER(&UART2RxDMA_Handler);
        memcpy((void *)USART_RX_BUF, (void *)USART_RX_BUF2, count);
        printf("\r\n进入空闲中断中  字节数 = %d \r\n",count);
               
        //数据个数放到低8bit,数据接收完毕标志置1
        USART_RX_STA2 = 0x8000 + count;
        //清空缓冲区
        memset(USART_RX_BUF2,0,count);                                            
        count = 0;
               
        //重新打开DMA接收
        HAL_UART_Receive_DMA(&UART2_Handler,USART_RX_BUF2,USART_REC_LEN);//重新打开DMA接收
    }
        
        HAL_UART_IRQHandler(&UART2_Handler);      //该函数会清空中断标志,取消中断使能,并间接调用回调函数
捕获.PNG

接收到的数据有时全是0 ???
捕获.PNG



最佳答案

查看完整内容[请看2#楼]

解决方法:Cache打开时,在读取数据前调用 SCB_CleanInvalidateDCache_by_Addr()。 原因:DMA 串口接收时会发生cache与内存不一致情况,详细原因和解决方法求解哦???
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

1

主题

13

帖子

0

精华

初级会员

Rank: 2

积分
53
金钱
53
注册时间
2020-5-21
在线时间
18 小时
 楼主| 发表于 2020-7-12 20:12:20 | 显示全部楼层
解决方法:Cache打开时,在读取数据前调用 SCB_CleanInvalidateDCache_by_Addr()。
原因:DMA 串口接收时会发生cache与内存不一致情况,详细原因和解决方法求解哦???
捕获3.PNG
回复

使用道具 举报

1

主题

13

帖子

0

精华

初级会员

Rank: 2

积分
53
金钱
53
注册时间
2020-5-21
在线时间
18 小时
 楼主| 发表于 2020-7-13 19:20:53 | 显示全部楼层
求助哦   
回复

使用道具 举报

1

主题

13

帖子

0

精华

初级会员

Rank: 2

积分
53
金钱
53
注册时间
2020-5-21
在线时间
18 小时
 楼主| 发表于 2020-7-13 21:54:30 | 显示全部楼层
即使我把重新打开DMA接收放到外面的函数里,情况也是一样的
HAL_UART_Receive_DMA(&UART2_Handler,USART_RX_BUF2,USART_REC_LEN);//重新打开DMA接收      
回复

使用道具 举报

1

主题

13

帖子

0

精华

初级会员

Rank: 2

积分
53
金钱
53
注册时间
2020-5-21
在线时间
18 小时
 楼主| 发表于 2020-7-13 22:46:17 | 显示全部楼层

HAL_UART_Receive_DMA(&UART2_Handler,USART_RX_BUF2,USART_REC_LEN);//放到外面也不行
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165377
金钱
165377
注册时间
2010-12-1
在线时间
2111 小时
发表于 2020-7-13 23:26:04 | 显示全部楼层
加油
回复

使用道具 举报

1

主题

13

帖子

0

精华

初级会员

Rank: 2

积分
53
金钱
53
注册时间
2020-5-21
在线时间
18 小时
 楼主| 发表于 2020-7-13 23:34:50 | 显示全部楼层

原因找到了,cache原因,不用cache就没事。。。
这是为何哦?原子哥,如果要用cache应该怎么改哦?
回复

使用道具 举报

13

主题

34

帖子

0

精华

初级会员

Rank: 2

积分
161
金钱
161
注册时间
2015-1-16
在线时间
11 小时
发表于 2021-1-14 17:35:52 | 显示全部楼层
用cache可以解决吗
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-3-1 01:10

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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