ST MCU Finder
安装免费手机应用,
寻找理想的ST MCU
查看: 444|回复: 17
收起左侧

[STM32F4] 关于FSMC和DMA的问题

[复制链接]
     

17

主题

51

帖子

147

积分

中级技术员

 楼主| 发表于 2017-9-12 09:34 | 显示全部楼层 |返回版面|阅读模式
我用的是stm32f407zet6,想用DMA将数据发送到FSMC,然后通过fsmc传送到外部SRAM,有的时候是成功的有的时候吧数据读出来看是乱的,问一下是不是两个时序的问题
     

17

主题

51

帖子

147

积分

中级技术员

 楼主| 发表于 2017-9-12 09:35 | 显示全部楼层 |返回版面
本帖最后由 xp1179926265 于 2017-9-12 09:36 编辑
  1. #define Bank1_SRAM3_ADDR    ((u32)(0x68000000))        
  2.                                             
  3. void FSMC_SRAM_Init(void)
  4. {
  5.         RCC->AHB1ENR|=0XF<<3;         
  6.         RCC->AHB3ENR|=1<<0;         
  7.          
  8.          GPIO_AF_Set(GPIOG,10,12);      
  9.         
  10.         GPIO_Set(GPIOD,(3<<0)|(3<<4)|(0XFF<<8),GPIO_MODE_AF,GPIO_OTYPE_PP,GPIO_SPEED_100M,GPIO_PUPD_PU);        //PD0,1,4,5,8~15 AF OUT
  11.          GPIO_Set(GPIOE,(3<<0)|(0X1FF<<7),GPIO_MODE_AF,GPIO_OTYPE_PP,GPIO_SPEED_100M,GPIO_PUPD_PU);                        //PE0,1,7~15,AF OUT
  12.         GPIO_Set(GPIOF,(0X3F<<0)|(0XF<<12),GPIO_MODE_AF,GPIO_OTYPE_PP,GPIO_SPEED_100M,GPIO_PUPD_PU);                  //PF0~5,12~15
  13.         GPIO_Set(GPIOG,(0X3F<<0)|PIN10,GPIO_MODE_AF,GPIO_OTYPE_PP,GPIO_SPEED_100M,GPIO_PUPD_PU);                         //PG0~5,10

  14.         
  15.         GPIO_AF_Set(GPIOD,0,12);        //PD0,AF12
  16.          GPIO_AF_Set(GPIOD,1,12);        //PD1,AF12
  17.          GPIO_AF_Set(GPIOD,4,12);        //PD4,AF12
  18.          GPIO_AF_Set(GPIOD,5,12);        //PD5,AF12
  19.          GPIO_AF_Set(GPIOD,8,12);        //PD8,AF12
  20.          GPIO_AF_Set(GPIOD,9,12);        //PD9,AF12
  21.          GPIO_AF_Set(GPIOD,10,12);        //PD10,AF12
  22.          GPIO_AF_Set(GPIOD,11,12);        //PD11,AF12
  23.          GPIO_AF_Set(GPIOD,12,12);        //PD12,AF12
  24.          GPIO_AF_Set(GPIOD,13,12);        //PD13,AF12
  25.          GPIO_AF_Set(GPIOD,14,12);        //PD14,AF12
  26.          GPIO_AF_Set(GPIOD,15,12);        //PD15,AF12
  27.         
  28.          GPIO_AF_Set(GPIOE,0,12);        //PE0,AF12
  29.          GPIO_AF_Set(GPIOE,1,12);        //PE1,AF12
  30.          GPIO_AF_Set(GPIOE,7,12);        //PE7,AF12
  31.          GPIO_AF_Set(GPIOE,8,12);        //PE8,AF12
  32.          GPIO_AF_Set(GPIOE,9,12);        //PE9,AF12
  33.          GPIO_AF_Set(GPIOE,10,12);        //PE10,AF12
  34.          GPIO_AF_Set(GPIOE,11,12);        //PE11,AF12
  35.          GPIO_AF_Set(GPIOE,12,12);        //PE12,AF12
  36.          GPIO_AF_Set(GPIOE,13,12);        //PE13,AF12
  37.          GPIO_AF_Set(GPIOE,14,12);        //PE14,AF12
  38.          GPIO_AF_Set(GPIOE,15,12);        //PE15,AF12
  39.         
  40.          GPIO_AF_Set(GPIOF,0,12);        //PF0,AF12
  41.          GPIO_AF_Set(GPIOF,1,12);        //PF1,AF12
  42.          GPIO_AF_Set(GPIOF,2,12);        //PF2,AF12
  43.          GPIO_AF_Set(GPIOF,3,12);        //PF3,AF12
  44.          GPIO_AF_Set(GPIOF,4,12);        //PF4,AF12
  45.          GPIO_AF_Set(GPIOF,5,12);        //PF5,AF12
  46.          GPIO_AF_Set(GPIOF,12,12);        //PF12,AF12
  47.          GPIO_AF_Set(GPIOF,13,12);        //PF13,AF12
  48.          GPIO_AF_Set(GPIOF,14,12);        //PF14,AF12
  49.          GPIO_AF_Set(GPIOF,15,12);        //PF15,AF12
  50.         
  51.          GPIO_AF_Set(GPIOG,0,12);        //PG0,AF12
  52.          GPIO_AF_Set(GPIOG,1,12);        //PG1,AF12
  53.          GPIO_AF_Set(GPIOG,2,12);        //PG2,AF12
  54.          GPIO_AF_Set(GPIOG,3,12);        //PG3,AF12
  55.          GPIO_AF_Set(GPIOG,4,12);        //PG4,AF12
  56.          GPIO_AF_Set(GPIOG,5,12);        //PG5,AF12         
  57.                               
  58.         FSMC_Bank1->BTCR[4]=0X00000000;
  59.         FSMC_Bank1->BTCR[5]=0X00000000;
  60.         FSMC_Bank1E->BWTR[4]=0X00000000;


  61.         FSMC_Bank1->BTCR[4]|=1<<12;
  62.         //FSMC_Bank1->BTCR[4]|=(1<<4);   
  63.         //²Ù×÷BTR¼Ä´æÆ÷                       HCLK=168M, 1¸HCLK=6ns                           
  64.         FSMC_Bank1->BTCR[5]|=8<<8; HCLK 6*9=54ns                  
  65.         FSMC_Bank1->BTCR[5]|=0<<4;               
  66.         FSMC_Bank1->BTCR[5]|=0<<0;           
  67.    
  68.         FSMC_Bank1E->BWTR[4]=0x0FFFFFFF;
  69.       
  70.         FSMC_Bank1->BTCR[4]|=1<<0;         
  71. }
复制代码
     

17

主题

51

帖子

147

积分

中级技术员

 楼主| 发表于 2017-9-12 09:37 | 显示全部楼层 |返回版面
本帖最后由 xp1179926265 于 2017-9-12 16:09 编辑
  1. <blockquote>void MYDMA_Config(DMA_Stream_TypeDef *DMA_Streamx,u8 chx,u32 par,u32 mar,u16 ndtr)
复制代码
     

17

主题

51

帖子

147

积分

中级技术员

 楼主| 发表于 2017-9-12 09:42 | 显示全部楼层 |返回版面
  1. mian函数里面的主要的,还有就是吧数据读出来看,不用DMA,直接FSMC读写是对的,用DMA就不对,DMA通道是DMA2的通道零,存储器到存储器模式

  2. FSMC_SRAM_Init();
  3. MYDMA_Config(DMA2_Stream0,0,(u32)(shuju),0x68000000,2112);
  4. MYDMA_Enable(DMA2_Stream0,2112);
复制代码
     

463

主题

2万

帖子

7万

积分

版主

发表于 2017-9-12 10:42 | 显示全部楼层 |返回版面
先降低读写速度;

另外要确定,主要是写入的原因还是读出的原因;
可以加一段测试程序:比如写入一组数据,再读出来比对下;
ST、机器人、电路欣赏等版主;感谢大家的支持;

电子工程师群1:16519783;123768874;171897584;
物联网群:301879792;智能机器人群:284122983; AGV及立体仓库群:309252026;
     

17

主题

51

帖子

147

积分

中级技术员

 楼主| 发表于 2017-9-12 11:13 | 显示全部楼层 |返回版面
mmuuss586 发表于 2017-9-12 10:42
先降低读写速度;

另外要确定,主要是写入的原因还是读出的原因;

我就是用DMA写入fsmc存到外部sram中然后用FSMC读出输出,发现读出的乱的,感觉应该是写入的问题,想问一下DMA的速度是如何控制的?

34

主题

851

帖子

2657

积分

初级工程师

发表于 2017-9-12 11:31 | 显示全部楼层 |返回版面
把FSMC接口的时序配置的保守一些
     

119

主题

4729

帖子

1万

积分

资深工程师

发表于 2017-9-12 11:42 | 显示全部楼层 |返回版面

示波器。

有事请找 xuander
     

17

主题

51

帖子

147

积分

中级技术员

 楼主| 发表于 2017-9-12 16:11 | 显示全部楼层 |返回版面
mmuuss586 发表于 2017-9-12 10:42
先降低读写速度;

另外要确定,主要是写入的原因还是读出的原因;

示波器测过了,对比的试验过了,发现是DMA与fsmc的问题,fsmc没有发数据出去
     

17

主题

51

帖子

147

积分

中级技术员

 楼主| 发表于 2017-9-12 16:50 | 显示全部楼层 |返回版面
又测了一下,发现DMA只传输了一次或者说之成功传输了第一次,但是在while循环里只传输一次是什么问题,有没有人遇到过
     

463

主题

2万

帖子

7万

积分

版主

发表于 2017-9-12 17:22 | 显示全部楼层 |返回版面
你程序DMA好像都没设置呢;
ST、机器人、电路欣赏等版主;感谢大家的支持;

电子工程师群1:16519783;123768874;171897584;
物联网群:301879792;智能机器人群:284122983; AGV及立体仓库群:309252026;
     

0

主题

12

帖子

36

积分

实习生

发表于 2017-9-12 17:24 | 显示全部楼层 |返回版面
你DMA配置问题把,工作模式,搬运的缓存大小。DMA操作完成后需要重新使能通道。清中断标志

3

主题

61

帖子

183

积分

中级技术员

发表于 2017-9-12 21:38 | 显示全部楼层 |返回版面
你的代码DMA设置有点问题啊?

296

主题

5903

帖子

1万

积分

资深工程师

发表于 2017-9-12 22:30 | 显示全部楼层 |返回版面
xp1179926265 发表于 2017-9-12 11:13
我就是用DMA写入fsmc存到外部sram中然后用FSMC读出输出,发现读出的乱的,感觉应该是写入的问题,想问一 ...

地址是正确的?

296

主题

5903

帖子

1万

积分

资深工程师

发表于 2017-9-12 22:34 | 显示全部楼层 |返回版面
xp1179926265 发表于 2017-9-12 11:13
我就是用DMA写入fsmc存到外部sram中然后用FSMC读出输出,发现读出的乱的,感觉应该是写入的问题,想问一 ...

是不是32位的数据?
     

17

主题

51

帖子

147

积分

中级技术员

 楼主| 发表于 2017-9-13 07:51 | 显示全部楼层 |返回版面
51xlf 发表于 2017-9-12 22:30
地址是正确的?

地址是对的,只用FSMC读写没问题,但是用DMA写就只能写刚开始的一次
     

17

主题

51

帖子

147

积分

中级技术员

 楼主| 发表于 2017-9-13 07:52 | 显示全部楼层 |返回版面
51xlf 发表于 2017-9-12 22:34
是不是32位的数据?

dma和fsmc都是8位数据
     

17

主题

51

帖子

147

积分

中级技术员

 楼主| 发表于 2017-9-13 10:33 | 显示全部楼层 |返回版面
解决解决了,我没有中断,以为传输完成中断不用清零
您需要登录后才可以回帖 登录 | 注册 手机登录

本版积分规则

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