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

[复制链接]
2148|4
 楼主| sjw1716094642 发表于 2016-8-2 15:52 | 显示全部楼层 |阅读模式
昨天做串口DMA传输的时候遇到一个问题,方向是存储器到外设,传输数据不正确,传输数量是对的,并且改变源传输数据(改变数组内容),串口发出的数据并没有改变。


对此非常疑惑,费很多心思,后来发现个问题
U$UJNKATXGOC})5YN`I9Y.png
512KB的SRAM被MDK拆分成两部分,并且其中一部分默认不使用,


对照数据手册的储存器映射表,
{C0`Z2]{F24W}%IR3(K31HT.png
默认不使用的是DTCM,大小为128KB,
随后,我将另一块RAM勾选上,但是仍然不行,我将数组地址输出查看,发现地址仍然在20020000开始的区域。
于是我将其改为
[WUGD)7{N14`8OXD1$B]B.png


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


DMA配置代码:
  1. #define USARTx USART3
  2. #define DMAstrx DMA1_Stream4
  3. #define Stream_ch 7

  4. #define Periph_data_size_8  0U
  5. #define Periph_data_size_16 1U
  6. #define Periph_data_size_32 2U

  7. #define Memory_data_size_8  0U
  8. #define Memory_data_size_16 1U
  9. #define Memory_data_size_32 2U

  10. #define Periph_TO_Memory    0X00U
  11. #define Memory_TO_Periph    0X40U
  12. #define Memory_TO_Memory    0X80U

  13. #define Periph_NOT_Inc      0X000U
  14. #define Memory_NOT_Inc      0X000U
  15. #define Periph_Inc          0X200U
  16. #define Memory_Inc          0X400U
  17. #define Circular_mode       0x100U

  18. void DMA1_USART3_init(DMA_Stream_TypeDef *DMA1S,u32 ch,u32 Prio,u32 M0AD,u32 WsheAD)      // DMA1_Stream0
  19. {
  20.   RCC->AHB1ENR|=RCC_AHB1ENR_DMA1EN;
  21.   while(DMA1S->CR&0X1);
  22.   
  23.   DMA1S->PAR=WsheAD;
  24.   DMA1S->M0AR=M0AD;
  25.   DMA1S->CR=Periph_data_size_8<<11|Memory_data_size_8<<13|Memory_Inc|Memory_TO_Periph;
  26.   DMA1S->CR|=(u32)ch<<25;
  27.   DMA1S->CR|=(Prio<<16);
  28.   DMA1S->CR|=(u32)0x10;    //transfer complete interrupt
  29.   
  30.   NVIC->ISER[0]|=(u32)0x01<<DMA1_Stream4_IRQn;
  31.   NVIC->IP[DMA1_Stream4_IRQn]=(u8)0xf0;
  32. }



  33. 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,传输也出现错误(传输能够完成,但是数据不正确)。
 楼主| sjw1716094642 发表于 2016-8-5 14:05 | 显示全部楼层
icecut 发表于 2016-8-5 09:56
你先做 mem 2 mem 测试,看结果如何.
如果是 内存到 设备,有一个问题需要考虑,就是串口发送完成了么?
很明显 ...

%}B3YR{1MRE033TQ$A@RHYJ.png
使用的是这个例程
V%_{AT(T1SA9AUACO0(YWTG.png

增加一个数据校验的判断,20000000-20080000时正确,20020000-20080000时不正确
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

24

主题

302

帖子

8

粉丝
快速回复 在线客服 返回列表 返回顶部