OpenEdv-开源电子网

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

stm32H750 串口DMA接收数据

[复制链接]

24

主题

48

帖子

0

精华

初级会员

Rank: 2

积分
196
金钱
196
注册时间
2020-6-12
在线时间
37 小时
发表于 2020-7-11 00:30:05 | 显示全部楼层 |阅读模式
1金钱
配置为串口1的DMA接收之后。如下:
USART1->CR3 |=1<<6;
USART1->CR1 |=1;


串口DMA配置如下
DMA1_Stream0->CR&=~1;            
while(DMA1_Stream0->CR & 0x01){;}

DMAMUX1->CCR=41;                     
DMAMUX1_RequestGenerator0->RGCR=0;      
DMA1_Stream0->PAR=(uint32_t)&USART1->RDR;
DMA1_Stream0->M0AR=(uint32_t)Uart1Buffer;
DMA1_Stream0->NDTR=BufferSize1;         
DMA1_Stream0->CR=0<<6                    
                |1<<8                  
                |1<<10                  
                |0<<11                 
                |0<<13                  
                |0<<16;                 
DMA1_Stream0->CR|=1;                  


测试中发现,
1.当我在程序中不断读取 Uart1Buffer 这个缓存的时候 ,此时用串口助手发送3字节数据后 DMA1_Stream0->NDTR寄存器会自减3,所以接收应该没得问题,只是 Uart1Buffer缓存里面没得任何数据,太奇怪了,是不是哪里配置的不对呢


2.当我在程序中不读取 Uart1Buffer 这个缓存的时候,此时用串口助手发送3字节数据后 DMA1_Stream0->NDTR寄存器会自减3, Uart1Buffer缓存里面也有相关数据
3.当我把如下几句屏蔽后
  SCB_EnableICache();       
  SCB_EnableDCache();       
  SCB->CACR|=1<<2;
就算我在程序中不断读取 Uart1Buffer 这个缓存的时候,此时用串口助手发送3字节数据后 DMA1_Stream0->NDTR寄存器会自减3,Uart1Buffer缓存里面也有相关数据。


最后分析难道是开启了如上三条指令导致如果在程序中不断读取 Uart1Buffer 这个缓存的时候,什么数据都接收不到????请各位大神解答下呢,谢谢!

最佳答案

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

SCB_InvalidateDCache_by_Addr((uint32_t *)Uart1Buffer,BufferSize1);//由于开启了D-cache功能,所以需要将Uart1Buffer缓存做无效化处理,这样CPU就可以不去读取cache直接去读取 Uart1Buffer 缓存数据,我这样处理就好了
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

24

主题

48

帖子

0

精华

初级会员

Rank: 2

积分
196
金钱
196
注册时间
2020-6-12
在线时间
37 小时
 楼主| 发表于 2020-7-11 00:30:06 | 显示全部楼层
shenqihao 发表于 2020-11-28 17:59
楼主,我和你遇到一样问题。
硬件仿真的时候,串口调试助手发送数据,NDTR数据减少,但缓存数值没接收到数 ...

SCB_InvalidateDCache_by_Addr((uint32_t *)Uart1Buffer,BufferSize1);//由于开启了D-cache功能,所以需要将Uart1Buffer缓存做无效化处理,这样CPU就可以不去读取cache直接去读取 Uart1Buffer 缓存数据,我这样处理就好了
回复

使用道具 举报

84

主题

347

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2008
金钱
2008
注册时间
2014-7-1
在线时间
189 小时
发表于 2020-11-28 17:59:50 | 显示全部楼层
楼主,我和你遇到一样问题。
硬件仿真的时候,串口调试助手发送数据,NDTR数据减少,但缓存数值没接收到数据,MDK5停止仿真,再次开启仿真,缓存数组接收到数据。
屏蔽这几条同样有效,
SCB_EnableICache();      
  SCB_EnableDCache();      
  SCB->CACR|=1<<2;
请问你解决这个问题了吗?
做一个相信自己的人
回复

使用道具 举报

84

主题

347

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2008
金钱
2008
注册时间
2014-7-1
在线时间
189 小时
发表于 2020-11-29 10:47:37 | 显示全部楼层
18180918620 发表于 2020-11-28 20:48
SCB_InvalidateDCache_by_Addr((uint32_t *)Uart1Buffer,BufferSize1);//由于开启了D-cache功能,所以需 ...

好的,非常感谢分享
做一个相信自己的人
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-4-30 03:43

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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