打印
[STM32F4]

FSMC和DMA的问题

[复制链接]
1602|26
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
houcs|  楼主 | 2020-11-18 19:01 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
stm32f407zet6,想用DMA将数据发送到FSMC,然后通过fsmc传送到外部SRAM,有的时候是成功的有的时候吧数据读出来看是乱的,问一下是不是两个时序的问题

使用特权

评论回复
沙发
lium| | 2020-11-18 19:05 | 只看该作者

楼主程序可以公开吗?贴程序看下吧,这么说看不出什么原因

使用特权

评论回复
板凳
houcs|  楼主 | 2020-11-18 19:12 | 只看该作者
#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;         
}

使用特权

评论回复
地板
houcs|  楼主 | 2020-11-18 19:16 | 只看该作者
<blockquote>void MYDMA_Config(DMA_Stream_TypeDef *DMA_Streamx,u8 chx,u32 par,u32 mar,u16 ndtr)

使用特权

评论回复
5
houcs|  楼主 | 2020-11-18 19:19 | 只看该作者
mian函数里面的主要的,还有就是吧数据读出来看,不用DMA,直接FSMC读写是对的,用DMA就不对,DMA通道是DMA2的通道零,存储器到存储器模式

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

使用特权

评论回复
6
wenfen| | 2020-11-18 19:22 | 只看该作者
先降低读写速度;

使用特权

评论回复
7
chenho| | 2020-11-18 19:29 | 只看该作者
另外要确定,主要是写入的原因还是读出的原因;

使用特权

评论回复
8
stly| | 2020-11-18 19:33 | 只看该作者
可以加一段测试程序:比如写入一组数据,再读出来比对下;

使用特权

评论回复
9
houcs|  楼主 | 2020-11-18 19:37 | 只看该作者
我就是用DMA写入fsmc存到外部sram中然后用FSMC读出输出,发现读出的乱的,感觉应该是写入的问题,想问一下DMA的速度是如何控制的?

使用特权

评论回复
10
pengf| | 2020-11-18 19:41 | 只看该作者
把FSMC接口的时序配置的保守一些

使用特权

评论回复
11
houcs|  楼主 | 2020-11-18 19:47 | 只看该作者
示波器。

使用特权

评论回复
12
houcs|  楼主 | 2020-11-18 19:50 | 只看该作者
示波器测过了,对比的试验过了,发现是DMA与fsmc的问题,fsmc没有发数据出去

使用特权

评论回复
13
houcs|  楼主 | 2020-11-18 19:54 | 只看该作者

又测了一下,发现DMA只传输了一次或者说之成功传输了第一次

使用特权

评论回复
14
houcs|  楼主 | 2020-11-18 19:57 | 只看该作者
但是在while循环里只传输一次是什么问题,有没有人遇到过

使用特权

评论回复
15
wangzsa| | 2020-11-18 20:00 | 只看该作者
你程序DMA好像都没设置呢;

使用特权

评论回复
16
yufe| | 2020-11-18 20:07 | 只看该作者

你DMA配置问题把,工作模式,搬运的缓存大小。DMA操作完成后需要重新使能通道。清中断标志

使用特权

评论回复
17
morrisk| | 2020-11-18 20:11 | 只看该作者
你的代码DMA设置有点问题啊?

使用特权

评论回复
18
zhuhuis| | 2020-11-18 20:14 | 只看该作者
地址是正确的?

使用特权

评论回复
19
stly| | 2020-11-18 20:19 | 只看该作者
是不是32位的数据?

使用特权

评论回复
20
houcs|  楼主 | 2020-11-18 20:22 | 只看该作者
地址是对的,只用FSMC读写没问题,但是用DMA写就只能写刚开始的一次

使用特权

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

本版积分规则

743

主题

8382

帖子

5

粉丝