天天看點

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