OpenEdv-开源电子网

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

DMA1和DMA2数据发生冲突,时不时导致数据错误

[复制链接]

40

主题

259

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
459
金钱
459
注册时间
2016-5-19
在线时间
192 小时
发表于 2020-3-12 15:51:46 | 显示全部楼层 |阅读模式
20金钱
芯片用的是F427。我用ADC1开DMA2的通道0数据流0,从外设传数据到内存;然后用UART5开DMA1的通道4数据流7,从内存发送处理后的ADC数据到外设。两个DMA都是循环模式。DMA2的处理数据频率是12.8KHz;DMA1处理数据的频率是11.52KHZ(波特率115200)。我设置了他们的优先级。但是从串口发上来的数据看,会随机出现几个字节的错误。我改用串口轮询的方式发送数据就不会出现这种情况。有懂的朋友吗?指点一二啊

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

使用道具 举报

31

主题

2183

帖子

0

精华

资深版主

Rank: 8Rank: 8

积分
14409
金钱
14409
注册时间
2018-8-3
在线时间
1156 小时
发表于 2020-3-12 19:22:13 | 显示全部楼层
回复

使用道具 举报

40

主题

259

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
459
金钱
459
注册时间
2016-5-19
在线时间
192 小时
 楼主| 发表于 2020-3-12 20:59:03 | 显示全部楼层
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165516
金钱
165516
注册时间
2010-12-1
在线时间
2116 小时
发表于 2020-3-13 00:46:37 | 显示全部楼层
单独开串口DMA,正确么?
回复

使用道具 举报

40

主题

259

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
459
金钱
459
注册时间
2016-5-19
在线时间
192 小时
 楼主| 发表于 2020-3-13 08:59:11 | 显示全部楼层
正点原子 发表于 2020-3-13 00:46
单独开串口DMA,正确么?
  1. void MYDMA_Config(DMA_Stream_TypeDef *DMA_Streamx,u32 chx,u32 par,u32 mar,u16 ndtr)
  2. {
  3.   NVIC_InitTypeDef NVIC_InitStructure;
  4.         DMA_InitTypeDef  DMA_InitStructure;
  5.        
  6.         if((u32)DMA_Streamx>(u32)DMA2)//得到当前stream是属于DMA2还是DMA1
  7.         {
  8.           RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA2,ENABLE);//DMA2时钟使能
  9.                
  10.         }else
  11.         {
  12.           RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA1,ENABLE);//DMA1时钟使能
  13.         }
  14.   DMA_DeInit(DMA_Streamx);
  15.        
  16.         while (DMA_GetCmdStatus(DMA_Streamx) != DISABLE){}//等待DMA可配置
  17.         DMA_Cmd(DMA_Streamx, DISABLE);                      //开启DMA传输
  18.   /* 配置 DMA Stream */
  19.   DMA_InitStructure.DMA_Channel = chx;  //通道选择
  20.   DMA_InitStructure.DMA_PeripheralBaseAddr = par;//DMA外设地址
  21.   DMA_InitStructure.DMA_Memory0BaseAddr = mar;//DMA 存储器0地址
  22.   DMA_InitStructure.DMA_DIR = DMA_DIR_MemoryToPeripheral;//存储器到外设模式
  23.   DMA_InitStructure.DMA_BufferSize = ndtr;//数据传输量
  24.   DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;//外设非增量模式
  25.   DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;//存储器增量模式
  26.   DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;//外设数据长度:8位
  27.   DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;//存储器数据长度:8位
  28.   DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;// 使用循环模式
  29.   DMA_InitStructure.DMA_Priority = DMA_Priority_VeryHigh;//最高优先级
  30.   DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable;         
  31.   DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_Full;
  32.   DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single;//存储器突发单次传输
  33.   DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;//外设突发单次传输
  34.   DMA_Init(DMA_Streamx, &DMA_InitStructure);//初始化DMA Stream       
  35.         DMA_Cmd(DMA_Streamx, ENABLE);                      //开启DMA传输
复制代码
串口DMA的设置是这样的
main函数中初始化
  1. MYDMA_Config(DMA1_Stream7,DMA_Channel_4,(u32)&UART5->DR,(u32)SendBuff,SEND_BUF_SIZE);//DMA2,STEAM7,CH4,外设为串口1,存储器为SendBuff,长度为:SEND_BUF_SIZE.
复制代码
串口中开启
  1. USART_DMACmd(UART5,USART_DMAReq_Tx,ENABLE);  //使能串口5的DMA发送   
复制代码


回复

使用道具 举报

40

主题

259

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
459
金钱
459
注册时间
2016-5-19
在线时间
192 小时
 楼主| 发表于 2020-3-13 08:59:48 | 显示全部楼层
正点原子 发表于 2020-3-13 00:46
单独开串口DMA,正确么?

原子哥,你的意思是还有其他设置嘛?
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165516
金钱
165516
注册时间
2010-12-1
在线时间
2116 小时
发表于 2020-3-14 01:00:37 | 显示全部楼层
h418452224 发表于 2020-3-13 08:59
原子哥,你的意思是还有其他设置嘛?

我的意思是单独 用一个dma,测试是否正常  ,然后再看是dma冲突,还是dma配置问题。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

40

主题

259

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
459
金钱
459
注册时间
2016-5-19
在线时间
192 小时
 楼主| 发表于 2020-3-15 00:06:03 | 显示全部楼层
正点原子 发表于 2020-3-14 01:00
我的意思是单独 用一个dma,测试是否正常  ,然后再看是dma冲突,还是dma配置问题。

原子哥,我试了。单独用串口+DMA和单独用ADC+DMA。数据都是正常的。
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-5-22 16:18

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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