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,