一、
當 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