STM32 FSMC 16位寻址 地址移位的解读
一、
当 Bank1 接的是 16 位宽度存储器的时候:HADDR[25:1] FSMC_A[24:0]。
当 Bank1 接的是 8 位宽度存储器的时候:HADDR[25:0] FSMC_A[25:0]。
二、
//LCD 操作结构体
typedef struct
{ vu16 LCD_REG;
vu16 LCD_RAM;
} LCD_TypeDef;
//使用 NOR/SRAM 的 Bank1.sector4,地址位 HADDR[27,26]=11 A10 作为数据命令区分线
//注意 16 位数据总线时,STM32 内部地址会右移一位对齐!
#define LCD_BASE ((u32)(0x6C000000 | 0x000007FE))
#define LCD ((LCD_TypeDef *) LCD_BASE)
三、
FSMC控制LCD,关于原子程序16位寻址的个人理解:
1.16位寻址和8位寻址差了一倍,所以地址线差出一根;
2.16位寻址时,芯片内总线寻址HADDR[25:1],地址从A1开始,对应IO口寻址为 FSMC_A[24:0],地址从A0开始,
为什么选择以上偏移1位的对应关系,见下表:
总线寻址HADDR[25:1] IO寻址FSMC_A[24:0]
0000=0, 0000=0
0010=2, 0001=1
0100=4, 0010=2
0110=6, 0011=3
1000=8, 0100=4
1010=A 0101=5
1100=C 0110=6
1110=E 0111=7
偏移以后,内部寻址右移一位,就变成一半,内部变化两个字节,IO外面变化一个字节;
因内部总线地址0x6C000000,以字节变化,16位寻址IO以双字节变化,所以通过内部总线双字节变化实现外部IO地址的递增奇偶变化。
typedef struct
{ vu16 LCD_REG;
vu16 LCD_RAM;
} LCD_TypeDef;
定义的结构体内部变量是占用16位两个字节的寄存器,定义了基地址后,只要在基地址的基础上加0x02,2个字节
即可使外部IO的16位地址变化一次,内部0x7FE=0111 1111 1110,加2=0x00000800=1000 0000 0000,各右移一位,
则A10由0变为1,地址由0变为1,LCD控制则有命令REG变为数据RAM
本文地址:https://blog.csdn.net/u011878611/article/details/107317741