STM32关于FSMC读写TFTLCD SRAM使用详情

**

STM32关于FSMC读写SRAM使用详情

**
FSMC,即灵活的静态存储控制器,能够与同步或异步存储器和 16 位 PC 存储器卡连接,可以看做是连接芯片和外存(sram)的通信协议;
以下是我对FSMC的个人理解,内容来自官方datasheet,详情请看官方datasheet;
STM32F4 的 FSMC 接口支持包括 SRAM、NAND FLASH、NOR FLASH 和 PSRAM 等存储器。
FSMC 的框图如图 18.1.2.1 所示:
在这里插入图片描述
由图可以达到的信息是FSMC是由AHB时钟总线控制,
主要用于控制两大类存储器:NORSRAM 和NAND/PC卡

在这里插入图片描述
FSMC的工作原理是对外部存储器的地址映射,内部寻址,控制外存读写从 FSMC 的角度,外部存储器被划分为 4 个固定大小的存储区域,每个存储区域的大小为 256 MB,
芯片地址0x60000000 - 9FFFFFFF都可以用来配置FSMC,所以可以最大寻址1G外部内存,
比如块1地址ox60000000 - ox6FFFFFFF;每个块每个区对应的地址很重要,由上图可以看出各个区地址,不知道也可以到官方手册查看;

如何配置
主要是对三个寄存器 FSMC_BCRx,FSMC_BTRx,
FSMC_BWTRx的配置

在这里插入图片描述
FSMC_BCRx
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 表示 NOR FLASH;11
保留。前面提到,我们把 TFTLCD 当成 SRAM 用,所以需要设置 MTYP[1:0]=00。
MBKEN:存储块使能位。这个容易理解,我们需要用到该存储块控制 TFTLCD,当然要使能这个存储块了。
FSMC_BTRx,FSMC_BWTRx的配置
因为我们要求读写分开时序控制,( EXTMOD 使能了);
这两个是时序寄存器分别对应读(本寄存器)和写操作(FSMC_BWTRx 寄存器)。
设置ACCMOD、DATAST 和 ADDSET 这三个设置。
ACCMOD[1:0]:访问模式。00 表示访问模式 A;01 表示访问模式 B;10 表示访问模式 C;
11 表示访问模式 D,本章我们用到模式 A,故设置为 00。
DATAST[7:0]:数据保持时间。0 为保留设置,其他设置则代表保持时间为: DATAST 个
HCLK 时钟周期,最大为 255 个 HCLK 周期。对 ILI9341 来说,其实就是 RD 低电平持续时间,
一般为 355ns。而一个 HCLK 时钟周期为 6ns 左右(1/168Mhz),为了兼容其他屏,我们这里设
置 DATAST 为 60,也就是 60 个 HCLK 周期,时间大约是 360ns。
ADDSET[3:0]:地址建立时间。其建立时间为:ADDSET 个 HCLK 周期,最大为 15 个 HCLK
周期。对 ILI9341 来说,这里相当于 RD 高电平持续时间,为 90ns,我们设置 ADDSET 为 15,
即 15*6=90ns。
我们为了高效开发采用固件库配置
FSMC_NORSRAMInit();
FSMC_NANDInit();
FSMC_PCCARDInit();

比如void FSMC_NORSRAMInit(FSMC_NORSRAMInitTypeDef* FSMC_NORSRAMInitStruct);
typedef struct
{
uint32_t FSMC_Bank;
uint32_t FSMC_DataAddressMux;
uint32_t FSMC_MemoryType;
uint32_t FSMC_MemoryDataWidth;
uint32_t FSMC_BurstAccessMode;
uint32_t FSMC_AsynchronousWait;
uint32_t FSMC_WaitSignalPolarity;
uint32_t FSMC_WrapMode;
uint32_t FSMC_WaitSignalActive;
uint32_t FSMC_WriteOperation;
uint32_t FSMC_WaitSignal;
uint32_t FSMC_ExtendedMode;
uint32_t FSMC_WriteBurst;
FSMC_NORSRAMTimingInitTypeDef* FSMC_ReadWriteTimingStruct;
FSMC_NORSRAMTimingInitTypeDef* FSMC_WriteTimingStruct;
}FSMC_NORSRAMInitTypeDef;
typedef struct
{
uint32_t FSMC_AddressSetupTime;
uint32_t FSMC_AddressHoldTime;
uint32_t FSMC_DataSetupTime;
uint32_t FSMC_BusTurnAroundDuration;
uint32_t FSMC_CLKDivision;
uint32_t FSMC_DataLatency;
uint32_t FSMC_AccessMode;
}FSMC_NORSRAMTimingInitTypeDef;
这些初始化参数按照上面的参数配置就可以了;
FSMC 对不同的存储器类型同样提供了不同的使能函数:
void FSMC_NORSRAMCmd(uint32_t FSMC_Bank, FunctionalState NewState);
void FSMC_NANDCmd(uint32_t FSMC_Bank, FunctionalState NewState);
void FSMC_PCCARDCmd(FunctionalState NewState);

实例解析
typedef struct
{
vu16 LCD_REG;
vu16 LCD_RAM;
} LCD_TypeDef;
//使用 NOR/SRAM 的 Bank1.sector4,地址位 HADDR[27,26]=11 ,FSMC_A6 作为数据命令区分线,也就是说FSMC_A6 这根线所连接的GPIO口电平为0表示发命令,1表示发数据

#define LCD_BASE ((u32)(0x6C000000 | 0x0000007E))
#define LCD ((LCD_TypeDef *) LCD_BASE)

0x6C000000是NOR/SRAM 的 Bank1.sector4,即LCD映射到芯片内部的地址
FSMC_A6== 0表示发命令,也就是10111111,//注意 16 位数据总线时,STM32 内部地址会右移一位对齐! ,所以左移回去后是01111110(7E)
01111110+sizeof(u16) = 01000000

所以可以这样读写LCD
void LCD_WR_REG(vu16 regval)
{ regval=regval; //使用-O2 优化的时候,必须插入的延时
LCD->LCD_REG=regval;//写入要写的寄存器序号
}
//写 LCD 数据
//data:要写入的值
void LCD_WR_DATA(vu16 data)
{ data=data; //使用-O2 优化的时候,必须插入的延时
LCD->LCD_RAM=data;
}
STM32F4 开发指南(库函数版)
ALIENTEK 探索者 STM32F407 开发板教程
271
//读 LCD 数据
//返回值:读到的值
u16 LCD_RD_DATA(void)
{ vu16 ram; //防止被优化
ram=LCD->LCD_RAM;
return ram;
}
void LCD_WriteReg(vu16 LCD_Reg, vu16 LCD_RegValue)
{ LCD->LCD_REG = LCD_Reg; //写入要写的寄存器序号
LCD->LCD_RAM = LCD_RegValue; //写入数据
}
//读寄存器
//LCD_Reg:寄存器地址
//返回值:读到的数据
u16 LCD_ReadReg(vu16 LCD_Reg)
{ LCD_WR_REG(LCD_Reg); //写入要读的寄存器序号
delay_us(5);
return LCD_RD_DATA(); //返回读到的值
}

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值