STM32 FSMC 總結

背景異步

 

作DP開發過程當中,須要將DP芯片和ARM芯片進行通訊,通常有兩種方式:函數

1)IO端口(總線)方式來進行通訊;spa

2)FSMC-存儲器映射方式來進行通訊;設計

 

以前的開發是採用第一種方式在F103芯片上開發,如今換F4平臺,採用第二種方式來進行交互數據。調試

 

FSMC的基礎htm

 

FSMC功能是相似 51 單片機的存儲器映射功能,能管理多個外部不一樣種類的存儲設備,具備方便,簡單,快捷的優勢。blog

 

目前支持的類型有:SRAMROMPSRAMNOR FlashNANDFlash 存儲器開發

更多的關於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 的理解和操做,時序圖的匹配這個一個大致過程,基本掌握了硬件設計人員原理圖線路鏈接過程,以及軟件調試。