26_STM32FSMC原理

目录

FSMC介绍

SRAM/NOR闪存片选控制寄存器(FSMC_BCRx)

SRAM/NOR闪存片选时序寄存器(FSMC_BTRx)

SRAM/NOR闪存写时序寄存器(FSMC_BWTRx)

寄存器组合说明

FSMC介绍

FSMC,即灵活的静态存储控制器,能够与同步或异步存储器和16位PC存储器卡连接, STM32的FSMC接口支持包括SRAM, NAND FLASH, NOR FLASH和PSRAM等存储器。FSMC的框图如下图所示:

FSMC驱动外部SRAM时,外部SRAM的控制一般有:地址线(如A0~A25)、数据线(如D0~D15)、写信号(WE,即WR)、读信号(OE,即RD)、片选信号(CS),如果SRAM支持字节控制,那么还有UB/LB信号。

而TETLCD的信号我们在前面介绍过,包括: RS、D0~015、WR、RD、CS、RST和BL等,其中真正在操作LCD的时候需要用到的就只有: RS,DO-D15,WR、RD和CS。其操作时序和SRAM的控制完全类似,唯一不同就是TFTLCD有RS信号,但是没有地址信号。

TFTLCD通过RS信号来决定传送的数据是数据还是命令,本质上可以理解为个地址信号,比如我们把RS接在A0上面,那么当FSMC控制器写地址0的时候,会使得A0变为0,对TFTLCD来说,就是写命令。而FSMC写地址1的时候,A0将会变为1,对TFTLCD来说,就是写数据了。这样,就把数据和命令区分开了,他们其实就是对应SRAM操作的两个连续地址。当然RS也可以接在其他地址线上,因此,可以把TFTLCD当成一个SRAM来用,只不过这个SRAM有2个地址,这就是FSMC可以驱动LCD的原理。

STM32的FSMC支持8/16/32位数据宽度,我们这里用到的LCD是16位宽度的,所以在设置的时候,选择16位宽就OK了。FSMC的外部设备地址映像, STM32的FSMC将外部存储器划分为固定大小为256M字节的四个存储块附上stm32内部存储结构图,一句话总结就是内核的数据线和地址线是直接连接到FSMC外设上的,可以理解为就是预留了一段空间的接口至于接口外面你想连接什么是你直接决定,注意,在内存预留的地址是从0x60000000开始如果你想访问外接设备外部地址的0x00的地址,在程序中操作的直接读取0x60000000即可(硬件上要连接地址总线FSMC_A[25:0]和数据总线FSMC_D)。

STM32的FSMC存储块1 (Bank1)用于驱动NOR FLASH/SRAM/PSRAM,被分为4个区,每个区管理64M字节空间,每个区都有独立的寄存器对所连接的存储器进行配置。Bank1的256M字节空间由28根地址线(HADDR[27:0])寻址。这里HADDR,是内部AHB地址总线,其中, HADDR[25:0]来自外部存储器地址FSMC_A[25:0],而HADDR[26:27]对4个区进行寻址。这里的意思是HADDR的0位到25位地址总线可以访问大小是64M然后26位和27位决定访问256M里面的哪一个64M,可以理解为外部可以接4个64M的SRAM,地址是从0x60000000开始26位和27位0,如果26和27位是1,则内存地址偏移64M以此类推。

如下表所示:

 

当Bank1接的是16位宽度存储器的时候: HADDR[25:1]>FSMC_A[24:0]

当Bank1接的是8位宽度存储器的时候: HADDR[25:0]→FSMC A[25:0]

不论外部接8位/16位宽设备, FSMC_A[0]永远接在外部设备地址A[0]

设置的数据宽度为16位,STM32会自动的右移1位,所以咱们需要反过来左移一位,那么就应该是1000 00000b 把这个数加2就应该是

01111 1111b 即为0x7E

那么0x6000 0000 | 0x03 这个地址将会是LCD结构体的首地址。

#define LCD_BASE ((u32)(0x60000000 | 0x0000007E))

而这句话,将LCD_BASE代表这个地址数据

#define LCD ((LCD_TypeDef *) LCD_BASE)

这句话将LCD定义为一个结构体指针,而这个结构体指针的地址为LCD_BASE;

这里可以理解为就是少了一根地址线然后,我们又要字节对齐

STM32的FSMC存储块1支持的异步突发访问模式包括:模式1、模式A~D等多种时序模型,驱动SRAM时一般使用模式1或者模式A,这里我们使用模式A来驱动LCD(当SRAM用),其他模式说明详见: STM32中文参考手册-FSMC章节。

 SRAM/NOR闪存片选控制寄存器(FSMC_BCRx)

EXTMOD:扩展模式使能位,控制是否允许读写不同的时序,需设置为1

WREN写使能位。我们需要向TFTLCD写数据,故该位必须设置为1

MWID[1:0]:存储器数据总线宽度。00,表示8位数据模式; 01表示16位数据模式; 10和11保留。我们的TFTLCD是16位数据线,所以设置WMID[1:0]=01。

MTYP[1:0]:存储器类型。00表示SRAM, ROM; 01表示PSRAM; 10表示NORFLASH;11保留。我们把LCD当成SRAM用,所以需要设置MTYP[1:0]=00。

MBKEN:存储块使能位。需设置为1

SRAM/NOR闪存片选时序寄存器(FSMC_BTRx)

ACCMOD[1:0]:访问模式。00:模式A; 01:模式B; 10:模式C; 11:模式D。

DATAST[7:0]:数据保持时间,等于:DATAST(+1)个HCLK时钟周期,DATAST最为255。对ILI9341来说,其实就是RD低电平持续时间,最大为355ns。对STM32F1,一个HCLK=13.8ns (1/72M),设置为15;对STM32F4,一个HCLK=6ns(1/168M),设置为60。

ADDSET[3:0]:地址建立时间。表示: ADDSET (+1)个HCLK周期, ADDSET最大为15。对ILI9341来说,这里相当于RD高电平持续时间,为90ns. STM32F1的FSMC性能存在问题,即便设置为0, RD也有190ns的高电平,我们这里设置为1。而对STM32F4,则设置为15。

如果未设置EXTMOD位,则读写共用这个时序寄存器!

SRAM/NOR闪存写时序寄存器(FSMC_BWTRx)

ACCMOD[1:0]:访问模式。00:模式A; 01:模式B; 10:模式C; 11:模式D。

DATAST[7:0]:数据保持时间,等于:DATAST(+1)个HCLK时钟周期,DATAST最大为255。对ILI9341来说,其实就是WR低电平持续时间,为15ns,不过ILI9320等则需要50ns。考虑兼容性,对STM32F1,一个HCLK=13.8ns (1/72M),设置为3;对STM32F4,一个HCLK=6ns(1/168M),设置为9。

ADDSET[3:0]:地址建立时间。表示: ADDSET+1个HCLK周期, ADDSET最大为15。对ILI9341来说,这里相当于WR高电平持续时间,为15ns。同样考虑兼容ILI9320,对STM32F1,这里即便设置为1,WR也有100ns的高电平,我们这里,设置为1。而对STM32F4,则设置为8。

寄存器组合说明

在ST官方库提供的的寄存器定义里面,并没有定义FSMC_BCRx、FSMC_BTRx、FSMC_BWTRx等这个单独的寄存器,而是将他们进行了一些组合。规律如下:

FSMC_BCRx和FSMC_BTRx,组合成BTCR[8]寄存器组,他们的对应关系如下:

BTCR[0]对应FSMC_BCR1, BTCR[1]对应FSMC_BTR1

BTCR[2]对应FSMC_BCR2, BTCR[3]对应FSMC_BTR2

BTCR[4]对应FSMC_BCR3, BTCR[5]对应FSMC_BTR3

BTCR[6]对应FSMC_BCR4, BTCR[7]对应FSMC_BTR4

FSMC_BWTRx则组合成BWTR[7],他们的对应关系如下:

BWTR[0]对应FSMC_BWTR1, BWTR[2]对应FSMC_BWTR2,

BWTR[4]对应FSMC_BWTR3, BWTR[6]对应FSMC_BWTR4,

BWTR[1]、BWTR[3]和BWTR[5]保留,没有用到。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值