ST MCU Finder
安装免费手机应用,
寻找理想的ST MCU
查看: 506|回复: 17
打印 上一主题 下一主题
收起左侧

[STM32F4] 关于FSMC和DMA的问题

[复制链接]   已结帖(7)
     
19主题53帖子153积分
中级技术员 专家等级:结帖率:89%
跳转到指定楼层
楼主
我用的是stm32f407zet6,想用DMA将数据发送到FSMC,然后通过fsmc传送到外部SRAM,有的时候是成功的有的时候吧数据读出来看是乱的,问一下是不是两个时序的问题

满意回复

+7
东方教主 查看完整内容
你DMA配置问题把,工作模式,搬运的缓存大小。DMA操作完成后需要重新使能通道。清中断标志
     
19主题53帖子153积分
中级技术员 专家等级:结帖率:89%
沙发
 楼主| 发表于 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. }
复制代码
     
19主题53帖子153积分
中级技术员 专家等级:结帖率:89%
板凳
 楼主| 发表于 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)
复制代码
     
19主题53帖子153积分
中级技术员 专家等级:结帖率:89%
地板
 楼主| 发表于 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);
复制代码
     
473主题2万帖子7万积分
版主 专家等级:结帖率:100%打赏:0.00受赏:43.00
5
发表于 2017-9-12 10:42 | 只看该作者 |返回版面
先降低读写速度;

另外要确定,主要是写入的原因还是读出的原因;
可以加一段测试程序:比如写入一组数据,再读出来比对下;
欢迎进入21IC论坛
电子工程师技术交流群:16519783,124545085;
     
19主题53帖子153积分
中级技术员 专家等级:结帖率:89%
6
 楼主| 发表于 2017-9-12 11:13 | 只看该作者 |返回版面
mmuuss586 发表于 2017-9-12 10:42
先降低读写速度;

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

我就是用DMA写入fsmc存到外部sram中然后用FSMC读出输出,发现读出的乱的,感觉应该是写入的问题,想问一下DMA的速度是如何控制的?
     
34主题855帖子2669积分
初级工程师 专家等级:结帖率:100%
7
发表于 2017-9-12 11:31 | 只看该作者 |返回版面
把FSMC接口的时序配置的保守一些
     
120主题4802帖子1万积分
资深工程师 专家等级:结帖率:89%打赏:0.00受赏:40.00
8
发表于 2017-9-12 11:42 | 只看该作者 |返回版面

示波器。

有事请找 xuander
     
19主题53帖子153积分
中级技术员 专家等级:结帖率:89%
9
 楼主| 发表于 2017-9-12 16:11 | 只看该作者 |返回版面
mmuuss586 发表于 2017-9-12 10:42
先降低读写速度;

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

示波器测过了,对比的试验过了,发现是DMA与fsmc的问题,fsmc没有发数据出去
     
19主题53帖子153积分
中级技术员 专家等级:结帖率:89%
10
 楼主| 发表于 2017-9-12 16:50 | 只看该作者 |返回版面
又测了一下,发现DMA只传输了一次或者说之成功传输了第一次,但是在while循环里只传输一次是什么问题,有没有人遇到过
     
473主题2万帖子7万积分
版主 专家等级:结帖率:100%打赏:0.00受赏:43.00
11
发表于 2017-9-12 17:22 | 只看该作者 |返回版面
你程序DMA好像都没设置呢;
欢迎进入21IC论坛
电子工程师技术交流群:16519783,124545085;
     
0主题16帖子49积分
实习生 专家等级:结帖率:0%
12
发表于 2017-9-12 17:24 | 只看该作者 |返回版面
你DMA配置问题把,工作模式,搬运的缓存大小。DMA操作完成后需要重新使能通道。清中断标志
6主题130帖子390积分
资深技术员 专家等级:结帖率:0%
13
发表于 2017-9-12 21:38 | 只看该作者 |返回版面
你的代码DMA设置有点问题啊?
297主题5996帖子1万积分
资深工程师 专家等级:结帖率:66%打赏:0.00受赏:19.00
14
发表于 2017-9-12 22:30 | 只看该作者 |返回版面
xp1179926265 发表于 2017-9-12 11:13
我就是用DMA写入fsmc存到外部sram中然后用FSMC读出输出,发现读出的乱的,感觉应该是写入的问题,想问一 ...

地址是正确的?
297主题5996帖子1万积分
资深工程师 专家等级:结帖率:66%打赏:0.00受赏:19.00
15
发表于 2017-9-12 22:34 | 只看该作者 |返回版面
xp1179926265 发表于 2017-9-12 11:13
我就是用DMA写入fsmc存到外部sram中然后用FSMC读出输出,发现读出的乱的,感觉应该是写入的问题,想问一 ...

是不是32位的数据?
     
19主题53帖子153积分
中级技术员 专家等级:结帖率:89%
16
 楼主| 发表于 2017-9-13 07:51 | 只看该作者 |返回版面
51xlf 发表于 2017-9-12 22:30
地址是正确的?

地址是对的,只用FSMC读写没问题,但是用DMA写就只能写刚开始的一次
     
19主题53帖子153积分
中级技术员 专家等级:结帖率:89%
17
 楼主| 发表于 2017-9-13 07:52 | 只看该作者 |返回版面
51xlf 发表于 2017-9-12 22:34
是不是32位的数据?

dma和fsmc都是8位数据
     
19主题53帖子153积分
中级技术员 专家等级:结帖率:89%
18
 楼主| 发表于 2017-9-13 10:33 | 只看该作者 |返回版面
解决解决了,我没有中断,以为传输完成中断不用清零
*滑动验证:
您需要登录后才可以回帖 登录 | 注册 手机登录
本版积分规则
分享 快速回复 返回顶部 返回列表