STM32系列第15篇--灵活的静态存储控制器FSMC
扫描二维码
随时随地手机看文章
FSMC特性
FSMC管理1GB空间,拥有4个Bank连接外部存储器
每个Bank有独立的片选信号
每个Bank有独立的时序配置
同步批量传输访问最高频率可达60MHz
fCLK= HCLK /2
静态地址映射存储器支持的存储器类型
SRAM
PSRAM
NOR/ONENAND
ROM
LCD接口-支持8080和6800模式
NANDFlash和16位PCCard,NAND Flash具有硬件ECC
结构FSMC分为四块BANK,每块各占256M字节空间,每块分为四个区,每个区占64M。
NOR/PSRAM 256M字节的空间需要28根地址线寻址
HADDR是内部AHB地址总线
HADDR[25:0]来自外部存储器地址FSMC[25:0]
HADDR[26:27]对4个region分别寻址
无论外接8位/16位宽度设备,FSMC_A[0]永远连接外部设备的地址A[0]
外接16位宽度存储器:HADDR[25:1] →FSMC_A[24:0]
外接8位宽度存储器:HADDR[25:0] →FSMC_A[25:0]
Bank1的四个区的地址范围:
控制LCD源码讲解:
//LCD地址结构体typedefstruct{vu16LCD_REG;vu16LCD_RAM;}LCD_TypeDef;//使用NOR/SRAM的Bank1.sector4,地址位HADDR[27,26]=11A10作为数据命令区分线//注意设置时STM32内部会右移一位对其!#defineLCD_BASE((u32)(0x6C000000|0x000007FE))#defineLCD((LCD_TypeDef*)LCD_BASE)12345678910
LCD_BASE,须根据外部电路的连接来确定,如Bank1.sector4就是从地址0X6C000000开始,而0X000007FE,则是A10的偏移量。以A10为例,7FE换成二进制为:111 1111 1110,而16位数据时,地址右移一位对齐,对应到地址引脚,就是:A10:A0=011 1111 1111,此时A10是0,但是如果16位地址再加1(对应到8位地址是加2,即7FE+0X02),那么:A10:A0=100 0000 0000,此时A10就是1了,即实现了对RS的0和1的控制。
我们将这个地址强制转换为LCD_TypeDef结构体地址,那么可以得到LCD->LCD_REG的地址就是0X6C00,07FE,对应A10的状态为0(即RS=0),而LCD-> LCD_RAM的地址就是0X6C00,0800(结构体地址自增),对应A10的状态为1(即RS=1),从而实现对RS的控制。
根据8080时序和FSMC写寄存器对比:
//8080时序写寄存器voidLCD_WR_REG(u16data){LCD_RS_CLR;LCD_CS_CLR;DATAOUT(data);LCD_WR_CLR;LCD_WR_SET;LCD_CS_SET;}//FSMC写寄存器voidLCD_WR_REG(u16regval){LCD->LCD_REG=regval;}//用FSMC程序要简便很多,但是在初始化LCD时需要对FSMC进行初始化