非100腳的FSMC:
第一個角度理解STM32有FSMC(其實其他芯片基本都有類似的總線功能),FSMC的好處就是你一旦設置好之后,WR(寫)、RD(讀)、DB0-DB15這些控制線和數據線,
都是FSMC自動控制的。打個比方,當你在程序中寫到:
*(volatile unsigned short int *)(0x60000000)=0x0055;
那么FSMC就會自動執行一個寫的操作,其對應的主控芯片的WE、RD這些腳,就會呈現出寫的時序出來(即WE=0,RD=1),數據0x0055的值也
會通過DB0-15自動呈現出來(即FSMC-D0:FSMC-D15=0x0055 )。地址0x60000000會被呈現在數據線上(即A0-A25=0,A0-A25正好對應0x60000000-0x64000000,對應64M,存儲塊1正好是4x64M即0x60000000-0x6fffffff)。
那么在硬件上面,我們需要做的,僅僅是MCU和LCD控制芯片的連接關系.
掛接多個存儲器的時候,對相應地址寫數據,NEX片選線會自動選擇相應的芯片使能,NE1是第一個存儲塊,即NOR/SRAM存儲塊 ....
100腳的FSMC操作:
通常會利用100腳的FSMC操作LCD控制芯片,或者CPLD,這個時候由於地址線不齊全,而且不需要地址線,多余的地址線會用作相應的命令、數據寄存器選擇線,這個時候還像非100腳的操作方法操作。
這里以SSD1963為例,通常接法如下圖
這里地址線A16連接的是SSD1963的命令、數據選擇接口,當A16為0時寫到該芯片的命令寄存器里,A16為1時寫的是相應的數據,所以在stm32里面會定義0x60000000是命令寄存器的地址,0x60020000是數據寄存器的地址,因為當地址為0x60020000的時候A0-A25里面A16的值為1,所以就寫進數據寄存器里。
看一看FSMC手冊關於存儲器字寬的描述,我們發現,當外部存儲器是16位時,硬件管腳A0-A24表示的是地址線A1-A25的值,所以
我們要位移一下,Bit17的值,實際會被反應到A16這根IO來。詳細:http://hi.baidu.com/billchian/blog/item/424a1e8055c177a16d81192b.html
#define Bank1_LCD_R ((uint32_t)0x60000000) //disp Reg ADDR
#define Bank1_LCD_D ((uint32_t)0x60020000) //disp Data ADDR

