打印
[STM32F7]

麻烦香水城主帮忙解决个问题(STM32F767的DMA问题)

[复制链接]
1838|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
昨天做串口DMA传输的时候遇到一个问题,方向是存储器到外设,传输数据不正确,传输数量是对的,并且改变源传输数据(改变数组内容),串口发出的数据并没有改变。


对此非常疑惑,费很多心思,后来发现个问题

512KB的SRAM被MDK拆分成两部分,并且其中一部分默认不使用,


对照数据手册的储存器映射表,

默认不使用的是DTCM,大小为128KB,
随后,我将另一块RAM勾选上,但是仍然不行,我将数组地址输出查看,发现地址仍然在20020000开始的区域。
于是我将其改为



DMA随即好使,
对此我十分困惑,有以下几个问题
问题1:2002000开始区域的SRAM1不能用作DMA传输的储存器地址域吗?还是我对DMA配置存在问题?
问题2:MDK的默认选项为何将ram拆分了,并且选择SRAM1?


DMA配置代码:
#define USARTx USART3
#define DMAstrx DMA1_Stream4
#define Stream_ch 7

#define Periph_data_size_8  0U
#define Periph_data_size_16 1U
#define Periph_data_size_32 2U

#define Memory_data_size_8  0U
#define Memory_data_size_16 1U
#define Memory_data_size_32 2U

#define Periph_TO_Memory    0X00U
#define Memory_TO_Periph    0X40U
#define Memory_TO_Memory    0X80U

#define Periph_NOT_Inc      0X000U
#define Memory_NOT_Inc      0X000U
#define Periph_Inc          0X200U
#define Memory_Inc          0X400U
#define Circular_mode       0x100U

void DMA1_USART3_init(DMA_Stream_TypeDef *DMA1S,u32 ch,u32 Prio,u32 M0AD,u32 WsheAD)      // DMA1_Stream0
{
  RCC->AHB1ENR|=RCC_AHB1ENR_DMA1EN;
  while(DMA1S->CR&0X1);
  
  DMA1S->PAR=WsheAD;
  DMA1S->M0AR=M0AD;
  DMA1S->CR=Periph_data_size_8<<11|Memory_data_size_8<<13|Memory_Inc|Memory_TO_Periph;
  DMA1S->CR|=(u32)ch<<25;
  DMA1S->CR|=(Prio<<16);
  DMA1S->CR|=(u32)0x10;    //transfer complete interrupt
  
  NVIC->ISER[0]|=(u32)0x01<<DMA1_Stream4_IRQn;
  NVIC->IP[DMA1_Stream4_IRQn]=(u8)0xf0;
}



DMA1_USART3_init(DMAstrx,Stream_ch,1,((u32)&USART_SendBuf),(u32)&USARTx->TDR);


@香水城
经验有限,所以想请城主帮忙解决一下,谢谢了



沙发
sjw1716094642|  楼主 | 2016-8-5 01:57 | 只看该作者
香水不在论坛了吗

使用特权

评论回复
板凳
icecut| | 2016-8-5 09:56 | 只看该作者
你先做 mem 2 mem 测试,看结果如何.
如果是 内存到 设备,有一个问题需要考虑,就是串口发送完成了么?
很明显,你这个适合前者.建议你用 stm32cubemx 配置一个串口,启用 dma,然后自动生成代码.

使用特权

评论回复
地板
sjw1716094642|  楼主 | 2016-8-5 13:59 | 只看该作者
icecut 发表于 2016-8-5 09:56
你先做 mem 2 mem 测试,看结果如何.
如果是 内存到 设备,有一个问题需要考虑,就是串口发送完成了么?
很明显 ...

串口发送完成了,并且字节数量也正确。然后我用官方的m to m 试过了,将内存范围改至20020000-20080000,传输也出现错误(传输能够完成,但是数据不正确)。

使用特权

评论回复
5
sjw1716094642|  楼主 | 2016-8-5 14:05 | 只看该作者
icecut 发表于 2016-8-5 09:56
你先做 mem 2 mem 测试,看结果如何.
如果是 内存到 设备,有一个问题需要考虑,就是串口发送完成了么?
很明显 ...


使用的是这个例程


增加一个数据校验的判断,20000000-20080000时正确,20020000-20080000时不正确

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:欢迎加入微控制家园,讨论微控制技术:群号 258891985

24

主题

302

帖子

8

粉丝