STM32之FSMC驱动LCD难点理解

根据外设存储器的位宽分为8Bit和16Bit驱动
STM32内部存储单位为一个字节,也就是一个地址存储一个字节大小的数据,当外部存储器的位宽为8位时,写入一个数据需要一个字节即地址加1,当外部存储器的位宽为16位时,写入一个数据需要两个字节即地址加2,如下图所示:
外设存储器位宽8位:写入0x11 和 0x22

地址 内存
0x6000 0000 0x11
0x6000 0001 0x22
外设存储器位宽16位:写入0x1122 和 0x3344
地址 内存
-- --
0x6000 0000 0x11
0x6000 0001 0x22
0x6000 0002 0x33
0x6000 0003 0x44
写16位数据地址变化 HADDR[25:0]
0x00 0000 0000
0x02 0000 0010
0x04 0000 0100
0x06 0000 0110

由于内存地址映射都是偶地址开始,当外设存储器的位宽为16位时,每次写数据时地址加2,相当于所有的地址为2的倍数,即写16位数据时地址位右移1位。FSMC将使用内部的HADDR[25:1]地址来作为对外部存储器的寻址地址FSMC_A[24:0]。
在这里插入图片描述
当FSMC模拟80并口时序驱动LCD外设时,以A6为例,作为LCD_RS信号控制线,A6输出0写命令,A6输出1写数据。当外设是8位位宽时,FSMC以HADDR[25:0] (映射FSMC_A[25:0])对外寻址,只要HADDR[25:0]的Bit6为0写命令,为1写数据。当外设是16位位宽时,FSMC以HADDR[25:1](映射FSMC_A[24:0])对外寻址,相当于整个地址右移一位,原来的Bit6输出实则是FSMC_A5输出,要让A6输出需要设置Bit7输出。如下所示:
外设为8位:Bit6->0100 0000->0x40
写命令->A6输出0 地址0x6000 0000用HADDR[25:0]表示,FSMC_A6为0
写数据->A6输出1 地址(0x6000 0000|0x40)用HADDR[25:0]表示,FSMC_A6为1
外设为16位:Bit6->0100 0000->0x40 Bit7->1000 0000->0x80
写命令->A6输出0 地址0x6000 0000用HADDR[25:1]表示即右移1位写入FSMC_A[24:0],FSMC_A6仍为0
写数据->A6输出1 地址(0x6000 0000|0x40)用HADDR[25:1]表示即右移1位写入FSMC_A[24:0],FSMC_A6变为0, FSMC_A5变为1,要使FSMC_A6输出1,地址需或上Bit7即地址(0x6000 0000|0x80)

LCD存储地址表示
LCD存储地址表示方式有两种,宏定义表示和结构体表示,结构体表示跟结构体成员所占空间大小有关。
FSMC_A6为LCD_RS信号控制线,控制命令和数据的读写,2^6=0x40,2^7=0x80,
在这里插入图片描述

posted on 2021-05-17 15:28  若水千点  阅读(751)  评论(0)    收藏  举报