STM32F407外挂SRAM应用

硬件方面:IS62WV51216(具体硬件连接请看原子哥的原理图,这里不做描述)

软件方面:MDK

主要两件事

  1. 修改startup_xxx.s 堆栈地址并在__main函数前初始化FSMC
  2. 修改.sct文件(分散加载),添加外部SRAM的使用空间及大小。

具体步骤如下:

//startup_stm32f407xx.s部分
; Vector Table Mapped to Address 0 at Reset
AREA    RESET, DATA, READONLY
                EXPORT  __Vectors
                EXPORT  __Vectors_End
                EXPORT  __Vectors_Size
                
__Vectors       DCD     0x20000100               ; Top of Stack
                DCD     Reset_Handler              ; Reset Handler
                DCD     NMI_Handler                ; NMI Handler
                ...
                ...
                ...
	        IMPORT  SystemInit              
	        IMPORT  FSMC_SRAM_Init
	        IMPORT  __main
	        LDR     R0, =SystemInit
		BLX     R0
		LDR     R0, =FSMC_SRAM_Init
		BLX     R0                 
		LDR     R0, =__main
		BX      R0
		ENDP

0x20000100 替换 __initial_sp
添加IMPORT FSMC_SRAM_Init
添加LDR R0, =FSMC_SRAM_Init和LX R0。敲黑板这两句必须在__main前面
这里的FSMC_SRAM_Init函数是使用正点原子探索者407寄存器版本的,里面所使用的变量只能是创建在内部SRAM哦,一旦用了外部SRAM就会触发HardFault,后果你懂的。所以尽量使用寄存器来初始化配置FSMC。

接下来就是第二部分,配置内存分配空间
在这里插入图片描述

按上图配置,要注意的是default一定要勾选,不然内存是不会分配到外部SRAM的。当然了你用__atrribute__来指定分配也是可以用的,但是有一个问题就是你不能初始化赋值,管你是非零还是零赋值,通通没用,原因何在,我也不知道。希望高人指点一二

之后就可以愉快的使用外部SRAM啦。
编写代码的时候使用方式与内部SRAM无异。
不过速度嘛…肯定比使用内部SRAM要慢的,毕竟FSMC操作外部SRAM的速度就那么大。

最后附上我改写后的纯寄存器版本的FSMC_SRAM_Init
经测试能用在STM32F407上,其他芯片请自行修改。

void FSMC_SRAM_Init(void)
{
	/*-- GPIOs Configuration -----------------------------------------------------*/
	/* Enable GPIOD, GPIOE, GPIOF and GPIOG interface clock */
	RCC->AHB1ENR   |= 0x00000078;
	
	//PD0,1,4,5,8~15    100M AF OUT_PP UP
	//PE0,1,7~15        100M AF OUT_PP UP
	//PF0~5,12~15       100M AF OUT_PP UP
	//PG0~5,10          100M AF OUT_PP UP
	
	/* Connect PDx pins to FMC Alternate function */
	GPIOD->AFR[0]  = 0x00CC00CC;
	GPIOD->AFR[1]  = 0xCCCCCCCC;
	/* Configure PDx pins in Alternate function mode */  
	GPIOD->MODER   = 0xAAAA0A0A;
	/* Configure PDx pins speed to 100 MHz */  
	GPIOD->OSPEEDR = 0xFFFF0F0F;
	/* Configure PDx pins Output type to push-pull */  
	GPIOD->OTYPER  = 0x00000000;
	/* pull-up for PDx pins */ 
	GPIOD->PUPDR   = 0x55550505;
	
	/* Connect PEx pins to FMC Alternate function */
	GPIOE->AFR[0]  = 0xC00000CC;
	GPIOE->AFR[1]  = 0xCCCCCCCC;
	/* Configure PEx pins in Alternate function mode */ 
	GPIOE->MODER   = 0xAAAA800A;
	/* Configure PEx pins speed to 100 MHz */ 
	GPIOE->OSPEEDR = 0xFFFFC00F;
	/* Configure PEx pins Output type to push-pull */  
	GPIOE->OTYPER  = 0x00000000;
	/* pull-up for PEx pins */ 
	GPIOE->PUPDR   = 0x55554005;
	
	/* Connect PFx pins to FMC Alternate function */
	GPIOF->AFR[0]  = 0x00CCCCCC;
	GPIOF->AFR[1]  = 0xCCCC0000;
	/* Configure PFx pins in Alternate function mode */   
	GPIOF->MODER   = 0xAA000AAA;
	/* Configure PFx pins speed to 100 MHz */ 
	GPIOF->OSPEEDR = 0xFF000FFF;
	/* Configure PFx pins Output type to push-pull */  
	GPIOF->OTYPER  = 0x00000000;
	/* pull-up for PFx pins */ 
	GPIOF->PUPDR   = 0x55000555;
	
	/* Connect PGx pins to FMC Alternate function */
	GPIOG->AFR[0]  = 0x00CCCCCC;
	GPIOG->AFR[1]  = 0x00000C00;
	/* Configure PGx pins in Alternate function mode */ 
	GPIOG->MODER   = 0x00200AAA;
	/* Configure PGx pins speed to 100 MHz */ 
	GPIOG->OSPEEDR = 0x00300FFF;
	/* Configure PGx pins Output type to push-pull */  
	GPIOG->OTYPER  = 0x00000000;
	/* pull-up for PGx pins */ 
	GPIOG->PUPDR   = 0x00100555;
	
	/*-- FMC/FSMC Configuration --------------------------------------------------*/
	/* Enable the FMC/FSMC interface clock */
	RCC->AHB3ENR         |= 0x00000001;
	
	//寄存器清零
	//bank1有NE1~4,每一个有一个BCR+TCR,所以总共八个寄存器。
	//这里我们使用NE3 ,也就对应BTCR[4],[5]。        
	FSMC_Bank1->BTCR[4]=0X00000000;
	FSMC_Bank1->BTCR[5]=0X00000000;
	FSMC_Bank1E->BWTR[4]=0X00000000;
	//操作BCR寄存器 使用异步模式,模式A(读写共用一个时序寄存器)
	//BTCR[偶数]:BCR寄存器;BTCR[奇数]:BTR寄存器
	FSMC_Bank1->BTCR[4]|=1<<12;//存储器写使能
	FSMC_Bank1->BTCR[4]|=1<<4; //存储器数据宽度为16bit      
	//操作BTR寄存器   (HCLK=168M, 1个HCLK=6ns       
	FSMC_Bank1->BTCR[5]|=8<<8; //数据保持时间(DATAST)为9个HCLK 6*9=54ns    
	FSMC_Bank1->BTCR[5]|=0<<4; //地址保持时间(ADDHLD)未用到     
	FSMC_Bank1->BTCR[5]|=0<<0; //地址建立时间(ADDSET)为0个HCLK 0ns    
	//闪存写时序寄存器  
	FSMC_Bank1E->BWTR[4]=0x0FFFFFFF;//默认值
	//使能BANK1区域3
	FSMC_Bank1->BTCR[4]|=1<<0;
}
  • 1
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: STM32F407的FSMC(Flexible Static Memory Controller)总线应用是指将FSMC用于连接外部存储器或外设的数据交换。FSMC是一个灵活的高性能静态存储器控制器,可以与各种存储器类型和外设相连接。 STM32F407的FSMC总线应用有以下几个方面: 1. 外部存储器扩展:通过FSMC总线,可以将外部存储器,如SRAM(静态随机存储器)或 NOR Flash(并行闪存),连接到STM32F407微控制器。这样可以扩展STM32F407的存储容量,适用于需要大容量内存的应用,如图像处理、音频处理等。 2. 外设连接:FSMC还可以用于连接外部设备,如LCD液晶显示屏。通过FSMC总线,可以将STM32F407与LCD控制器相连接,实现彩色图像的实时显示。此外,FSMC还可以连接其他外设,如触摸屏控制器、摄像头模块等。 3. 并行接口:FSMC总线是一个高速的并行接口,支持多种总线协议。除了SRAM和NOR Flash之外,FSMC还可以连接其他外部存储器,如PSRAM(伪静态随机存储器)、NAND Flash(并行闪存)等。通过FSMC的并行接口,可以实现高速数据传输和存取。 4. DMA支持:FSMC与STM32F407的DMA(直接存储器访问)控制器相结合,可实现高效的数据传输。DMA可以直接从外部存储器读取数据或向外部存储器写入数据,减轻了CPU的负担,提高了数据传输的效率。 总之,STM32F407的FSMC总线应用广泛,可以连接各种外部存储器和外设,具有灵活性和高性能。它在大容量存储、图像处理、音频处理等应用中发挥着重要作用,同时通过DMA支持提供了高效的数据传输解决方案。 ### 回答2: STM32F407的FSMC(Flexible Static Memory Controller)总线可以用于处理与外部静态存储器的通信。它提供了多种接口和功能,方便与不同类型的存储器进行连接,包括SRAM、NOR Flash和PSRAM等。 在SRAM应用中,FSMC总线可以为外部SRAM提供直接访问功能。通过配置FSMC控制寄存器和时序寄存器,可以实现读取和写入SRAM中的数据。这种方式可以扩展MCU的内存空间,提高数据处理能力。 在NOR Flash应用中,FSMC总线可以实现对外部闪存的读取和写入。通过配置FSMC的控制寄存器和时序寄存器,可以设置访问闪存的时序和模式。这种方式可以用于存储嵌入式应用程序代码和数据,提高系统的运行速度和效率。 在PSRAM应用中,FSMC总线可以连接并访问外部并行存储器。通过配置FSMC的控制寄存器和时序寄存器,可以实现对PSRAM的读取和写入。这种方式可以提供高速存储器的访问能力,适用于对存储速度要求较高的应用场景。 总之,STM32F407的FSMC总线应用广泛,能够满足不同类型的外部存储器的连接和通信需求。它提供了灵活的接口和丰富的功能,可以大幅拓展内存空间,提高系统性能和效率。 ### 回答3: STM32F407的FSMC(Flexible Static Memory Controller)总线是一种用于连接外部存储器设备的接口。它提供了与静态存储器(SRAM和NOR闪存)、NAND闪存、SDRAM等设备进行高速数据传输的功能。FSMC总线的应用范围广泛,包括但不限于以下几个方面: 首先,FSMC总线可以连接静态存储器设备,例如SRAM和NOR闪存。SRAM是一种快速且易于访问的存储器,适用于对读写速度要求较高的应用场景。NOR闪存则在数据存储方面提供了非常大的存储容量,适用于嵌入式系统中的代码存储需求。 其次,FSMC总线还可以连接NAND闪存,这是一种使用较多的闪存存储设备,适用于对存储容量要求较高的应用场景。NAND闪存不仅具备较大的存储容量,还具备良好的擦除和写入性能。 另外,FSMC总线还支持连接SDRAM,这是一种用于动态存储的存储器设备。SDRAM具备较大的存储容量和高速的数据传输速度,适用于对存储容量和数据读写性能要求较高的应用场景,如图像处理、音频处理等。 总之,STM32F407的FSMC总线广泛应用嵌入式系统中需要连接外部存储器设备的场景。通过高速、稳定的数据传输,实现了对静态存储器(SRAM和NOR闪存)、NAND闪存和SDRAM等存储设备的有效控制和访问,为嵌入式系统的数据存储和处理提供了良好的支持。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值