[STM32F4]

关于FSMC和DMA的问题

[复制链接]
4643|19
手机看帖
扫描二维码
随时随地手机跟帖
xp1179926265|  楼主 | 2017-9-12 09:34 | 显示全部楼层 |阅读模式
我用的是stm32f407zet6,想用DMA将数据发送到FSMC,然后通过fsmc传送到外部SRAM,有的时候是成功的有的时候吧数据读出来看是乱的,问一下是不是两个时序的问题
xp1179926265|  楼主 | 2017-9-12 09:35 | 显示全部楼层
本帖最后由 xp1179926265 于 2017-9-12 09:36 编辑
#define Bank1_SRAM3_ADDR    ((u32)(0x68000000))        
                                            
void FSMC_SRAM_Init(void)
{
        RCC->AHB1ENR|=0XF<<3;         
        RCC->AHB3ENR|=1<<0;         
         
         GPIO_AF_Set(GPIOG,10,12);      
        
        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
         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
        GPIO_Set(GPIOF,(0X3F<<0)|(0XF<<12),GPIO_MODE_AF,GPIO_OTYPE_PP,GPIO_SPEED_100M,GPIO_PUPD_PU);                  //PF0~5,12~15
        GPIO_Set(GPIOG,(0X3F<<0)|PIN10,GPIO_MODE_AF,GPIO_OTYPE_PP,GPIO_SPEED_100M,GPIO_PUPD_PU);                         //PG0~5,10

        
        GPIO_AF_Set(GPIOD,0,12);        //PD0,AF12
         GPIO_AF_Set(GPIOD,1,12);        //PD1,AF12
         GPIO_AF_Set(GPIOD,4,12);        //PD4,AF12
         GPIO_AF_Set(GPIOD,5,12);        //PD5,AF12
         GPIO_AF_Set(GPIOD,8,12);        //PD8,AF12
         GPIO_AF_Set(GPIOD,9,12);        //PD9,AF12
         GPIO_AF_Set(GPIOD,10,12);        //PD10,AF12
         GPIO_AF_Set(GPIOD,11,12);        //PD11,AF12
         GPIO_AF_Set(GPIOD,12,12);        //PD12,AF12
         GPIO_AF_Set(GPIOD,13,12);        //PD13,AF12
         GPIO_AF_Set(GPIOD,14,12);        //PD14,AF12
         GPIO_AF_Set(GPIOD,15,12);        //PD15,AF12
        
         GPIO_AF_Set(GPIOE,0,12);        //PE0,AF12
         GPIO_AF_Set(GPIOE,1,12);        //PE1,AF12
         GPIO_AF_Set(GPIOE,7,12);        //PE7,AF12
         GPIO_AF_Set(GPIOE,8,12);        //PE8,AF12
         GPIO_AF_Set(GPIOE,9,12);        //PE9,AF12
         GPIO_AF_Set(GPIOE,10,12);        //PE10,AF12
         GPIO_AF_Set(GPIOE,11,12);        //PE11,AF12
         GPIO_AF_Set(GPIOE,12,12);        //PE12,AF12
         GPIO_AF_Set(GPIOE,13,12);        //PE13,AF12
         GPIO_AF_Set(GPIOE,14,12);        //PE14,AF12
         GPIO_AF_Set(GPIOE,15,12);        //PE15,AF12
        
         GPIO_AF_Set(GPIOF,0,12);        //PF0,AF12
         GPIO_AF_Set(GPIOF,1,12);        //PF1,AF12
         GPIO_AF_Set(GPIOF,2,12);        //PF2,AF12
         GPIO_AF_Set(GPIOF,3,12);        //PF3,AF12
         GPIO_AF_Set(GPIOF,4,12);        //PF4,AF12
         GPIO_AF_Set(GPIOF,5,12);        //PF5,AF12
         GPIO_AF_Set(GPIOF,12,12);        //PF12,AF12
         GPIO_AF_Set(GPIOF,13,12);        //PF13,AF12
         GPIO_AF_Set(GPIOF,14,12);        //PF14,AF12
         GPIO_AF_Set(GPIOF,15,12);        //PF15,AF12
        
         GPIO_AF_Set(GPIOG,0,12);        //PG0,AF12
         GPIO_AF_Set(GPIOG,1,12);        //PG1,AF12
         GPIO_AF_Set(GPIOG,2,12);        //PG2,AF12
         GPIO_AF_Set(GPIOG,3,12);        //PG3,AF12
         GPIO_AF_Set(GPIOG,4,12);        //PG4,AF12
         GPIO_AF_Set(GPIOG,5,12);        //PG5,AF12         
                              
        FSMC_Bank1->BTCR[4]=0X00000000;
        FSMC_Bank1->BTCR[5]=0X00000000;
        FSMC_Bank1E->BWTR[4]=0X00000000;


        FSMC_Bank1->BTCR[4]|=1<<12;
        //FSMC_Bank1->BTCR[4]|=(1<<4);   
        //²Ù×÷BTR¼Ä´æÆ÷                       HCLK=168M, 1¸HCLK=6ns                           
        FSMC_Bank1->BTCR[5]|=8<<8; HCLK 6*9=54ns                  
        FSMC_Bank1->BTCR[5]|=0<<4;               
        FSMC_Bank1->BTCR[5]|=0<<0;           
   
        FSMC_Bank1E->BWTR[4]=0x0FFFFFFF;
      
        FSMC_Bank1->BTCR[4]|=1<<0;         
}

使用特权

评论回复
xp1179926265|  楼主 | 2017-9-12 09:37 | 显示全部楼层
本帖最后由 xp1179926265 于 2017-9-12 16:09 编辑
<blockquote>void MYDMA_Config(DMA_Stream_TypeDef *DMA_Streamx,u8 chx,u32 par,u32 mar,u16 ndtr)

使用特权

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

FSMC_SRAM_Init();
MYDMA_Config(DMA2_Stream0,0,(u32)(shuju),0x68000000,2112);
MYDMA_Enable(DMA2_Stream0,2112);

使用特权

评论回复
mmuuss586| | 2017-9-12 10:42 | 显示全部楼层
先降低读写速度;

另外要确定,主要是写入的原因还是读出的原因;
可以加一段测试程序:比如写入一组数据,再读出来比对下;

使用特权

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

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

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

使用特权

评论回复
zchong| | 2017-9-12 11:31 | 显示全部楼层
把FSMC接口的时序配置的保守一些

使用特权

评论回复
玄德| | 2017-9-12 11:42 | 显示全部楼层

示波器。

使用特权

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

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

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

使用特权

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

使用特权

评论回复
mmuuss586| | 2017-9-12 17:22 | 显示全部楼层
你程序DMA好像都没设置呢;

使用特权

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

使用特权

评论回复
dingbo95| | 2017-9-12 21:38 | 显示全部楼层
你的代码DMA设置有点问题啊?

使用特权

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

地址是正确的?

使用特权

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

是不是32位的数据?

使用特权

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

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

使用特权

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

dma和fsmc都是8位数据

使用特权

评论回复
xp1179926265|  楼主 | 2017-9-13 10:33 | 显示全部楼层
解决解决了,我没有中断,以为传输完成中断不用清零

使用特权

评论回复
nxdzs| | 2017-11-28 22:52 | 显示全部楼层
请问楼主,使用 FSMC DMA 配置数据流的时候,是  DMA_DIR_MemoryToPeripheral   还是    DMA_DIR_MemoryToMemory  ?

使用特权

评论回复
czdpj| | 2019-2-10 21:15 | 显示全部楼层
标志位每次都要清零。

使用特权

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

本版积分规则

22

主题

62

帖子

0

粉丝