背景異步
作DP開發過程當中,須要將DP芯片和ARM芯片進行通訊,通常有兩種方式:函數
1)IO端口(總線)方式來進行通訊;spa
2)FSMC-存儲器映射方式來進行通訊;設計
以前的開發是採用第一種方式在F103芯片上開發,如今換F4平臺,採用第二種方式來進行交互數據。調試
FSMC的基礎htm
FSMC功能是相似 51 單片機的存儲器映射功能,能管理多個外部不一樣種類的存儲設備,具備方便,簡單,快捷的優勢。blog
目前支持的類型有:SRAM、ROM、PSRAM、NOR Flash和NANDFlash 存儲器。開發
更多的關於FSMC的資料須要閱讀STM32 手冊對於FSMC的詳細介紹。get
VPC3+C + ARM + FSMC實現細節描述同步
1)首先了解VPC3+C該芯片的時序圖,VPC3的存儲器提供兩種訪問方式:
a) 數據線和地址線不復用模式,手冊中叫作C165模式;
b) 數據線和地址線交叉複用,手冊中叫作80C32模式;
爲了節約IO的數量,決定採用80C32模式,手冊中對此描述爲同步模式,我的以爲有歧義。
2)查找80C32模式的時序圖,以下:
3)在STM32數據手冊中查找與80C32時序圖一致的時序圖。
採用的是地址線和數據線交叉複用和異步方式的,因此,相應的查找交叉複用的時序圖,以下:
4)對比時序圖發現,互聯的線有
FSMC_NADV |
加反向器(VPC3地址鎖存控制信號) |
ALE |
FSMC_AD |
數據線(地址線) |
AB |
FSMC_A |
地址線 |
DB |
FSMC_NWE |
寫信號 |
XWR |
FSMC_NRD |
讀信號 |
XRD |
因爲VPC3內部自帶地址鎖存器,因此外部能夠不加鎖存器了,按照VPC3手冊推薦,用了8個地址線,尋址2K空間,剩餘的用做地址片選信號,這裏有個小技巧,片選其中一個引腳,加反相器,同時也將STM32地址惟一映射爲VPC3的肯定地址。我當時調試代碼時未理解透該細節,致使浪費了很多時間。
5)代碼的調試
FSMC的代碼採用STM32官方庫函數來實現,在新平臺下面須要注意一些幾點:
A)新平臺採用的系統時鐘是否因爲外部晶振變化而變化,須要對系統時鐘進行配置,具體的配 置是在STM32F4xx.c 文件中。
系統時鐘 = ((HSE或者HSI)/PLL_M )*PLL_N /PLL_P;
B)新平臺時鐘加快後對於FSMC的時間的設置的影響,在異步模式下,主要是考慮地址生成時間,地址保持時間,數據生成時間,這幾個參數須要參考對應的外部存儲器的參數來進行設定。
6)調試中遇到最大的兩個問題
a) 外部晶振更改後爲從新進行系統時鐘的配置,我調用RCC_GetClocksFreq()來獲取當前系統的時鐘,是168M,這個是根據上面的計算公式計算出來,因爲宏定義的數據未更改,因此表面上市正確的,可是和實際的狀況卻不符合。
b) 對於片選信號的理解,我是在配置FSMC功能後從新對地址線上的片選信號進行IO的操做,通過觀看GPIO口的數據後,發現拉高該端口了,其實,FSMC是一個自動的過程,在FSMC操做額過程當中,即使我以前拉高該端口,FSMC在地址操做時會將以前的IO口操做的結果給覆蓋掉,致使數據寫入不成功這個也是我對於片選的理解不完全而形成的。
結束語
本次FSMC的調試過程當中,學到了許多的知識,硬件電路的如何鏈接,信號線的選擇,對FSMC 的理解和操做,時序圖的匹配這個一個大致過程,基本掌握了硬件設計人員原理圖線路鏈接過程,以及軟件調試。