主頁 > 作業系統 > STM32的FSMC外設簡介

STM32的FSMC外設簡介

2021-01-24 17:17:08 作業系統

01、FSMC特點

Flexible static memory controller(FSMC)靈活的靜態存盤控制器,FSMC可以連接異步或同步存盤器或16位PC存盤卡,主要用途有:

  • 將 AHB 資料通信事務轉換為適當的外部器件協議

  • 滿足外部器件的訪問時序要求

所有外部存盤器共享地址、資料和控制信號,但有各自的片選信號,FSMC 一次只能訪問一個外部器件,

FSMC,即靈活的靜態存盤控制器,能夠與同步或異步存盤器和16位PC存盤器卡連接,STM32的FSMC介面支持包括SRAM、NANDFLASH、NORFLASH和PSRAM等存盤器,

△FSMC框圖示意

 

02、AHB介面

AHB設備介面可以使內部CPU和其他主總線外設去訪問外部存盤器,AHB事務可以傳輸外部設備協議,特別是當外部存盤器被選擇位8位或16位,32位的AHB傳輸傳輸事務會被劃分為多個連續的8位或16的傳輸事務,片選會在每次訪問時切換,

通用事務規則要求AHB傳輸資料寬度必須是8位、16位或32位,但是訪問外部資料必須有個固定的資料寬度,這可能導致不一樣的傳輸,

因此必須遵循一些簡單的事務規則:

  • AHB事務資料寬度必須和存盤器資料寬度相同,在這種情況下不會出問題;

  • AHB事務資料寬度大于存盤器資料寬度,在這種情況下,FSMC會將AHB事務分為多個連續的存盤器訪問,這樣符合外部存盤器訪問資料寬度;

  • AHB事務資料小存盤器寬度,在這種情況下,異步傳輸可能一致,也可能不一致,這取決于外部設備的型別,

對設備的異步訪問要具有位元組選擇功能(SRAM,ROM,PSRAM),①FSMC 允許寫入事務通過其位元組選擇通道 NBL[1:0] 訪問恰當的資料,②允許讀取事務,會讀取所有存盤器位元組,并將丟棄無用的存盤器位元組, NBL[1:0]在讀取事務期間保持為低電平,

對不具有位元組選擇功能的器件( 16 位 NOR 和 NAND Flash)進行異步訪問,當請求對 16 位寬的 Flash 存盤器進行位元組訪問時會發生此情形,

顯然,不能在位元組模式下訪問此器件(只能針對 Flash 存盤器讀取或寫入 16 位字),因此①不允許寫入事務,②允許讀取事務,會讀取所有存盤器位元組,并將丟棄無用的存盤器位元組, NBL[1:0]在讀取事務期間保持低電平,

 

03、外部設備地址映射

FSMC的外部設備地址映像,STM32的FSMC將外部存盤器劃分為固定大小為256M位元組的四個存盤塊:

  • 塊1被用于4個NORflash或者PSRAM記憶體設備,塊1被劃分為4塊NORflash/PSRAM帶有獨立的片選信號,

  • 塊2和塊3用于連接NANDflash(一個塊驅動一個設備)

  • 塊4用于連接PC塊設備

對于每個存盤區域,所要使用的存盤器型別由用戶在配置暫存器中定義

 

NOR/PSRAM地址映射

Bank1的256M位元組空間由28根地址線(HADDR[27:0])尋址,這里HADDR,是內部AHB地址總線,但也會參與對外部存盤器的尋址,其中,HADDR[25:0]來自外部存盤器地址FSMC_A[25:0],而HADDR[26:27]對4個區進行尋址,如下表所示:

HADDR[25:0] 包含外部存盤器地址,由于HADDR為位元組地址,而存盤器按字尋址,所以根據存盤器資料寬度不同,實際向存盤器發送的地址也將有所不同,如下表所示:

當Bank1接的是16位寬度存盤器的時候:HADDR[25:1]->FSMC_A[24:0];

當Bank1接的是8位寬度存盤器的時候:HADDR[25:0]->FSMC_A[25:0];

不論外部接8位/16位寬設備,FSMC_A[0]永遠接在外部設備地址A[0],

 

04、NOR/PSRAM控制器

FSMC 會生成適當的信號時序,以驅動以下型別的存盤器

  • 異步 SRAM 和 ROM,8位、16位或者32位

  • PSRAM,異步模式,突發模式,復用或非復用

  • NOR Flash,異步模式或突發模式,復用或非復用

FSMC每個塊輸出獨立的片選信號NE[4:1],其他信號(讀,資料和控制)是共享的;

對于同步訪問,FSMC僅僅在讀寫事務時給選擇的外部設備發出時鐘,HCLK時鐘頻率是該時鐘的整數倍,每個塊的大小固定64M位元組,

存盤器的可編程引數包括訪問時序(詳見下圖)和對等待管理的支持(用于在突發模式下訪問NOR Flash 和PSRAM),

NOR/PSRAM 的可編程訪問引數

 

05、外部存盤器介面信號

非復用 I/OPSRAM/SRAM

注意:前綴“N”表示相關的信號為低電平有效

 

06、NOR/PSRAM控制器異步事務

異步靜態存盤器(NOR Flash、PSRAM、SRAM)

  • 信號通過內部時鐘 HCLK 進行同步,不會將此時鐘發送到存盤器;

  • FSMC 總是會先對資料進行采樣,而后再禁止片選信號 NE,這樣可以確保符合存盤器資料保持時序的要求(資料轉換的芯片使能高電平,通常最低為 0 ns,);

  • 如果使能擴展模式(FSMC_BCRx 暫存器中的 EXTMOD 位置 1),則最多可提供四種擴展模式( A、 B、 C 和 D),可以混合使用 A、 B、 C 和 D 模式來進行讀取和寫入操作,例如,可以在模式 A 下執行讀取操作,而在模式 B 下執行寫入操作;

  • 如果禁用擴展模式(FSMC_BCRx 暫存器中的 EXTMOD 位復位),則 FSMC 可以在模式 1 或模式 2 下運行,如下所述①當選擇 SRAM/CRAM 存盤器型別時,模式 1 為默認模式( FSMC_BCRx 暫存器中MTYP = 0x0 或 0x01)②當選擇 NOR 存盤器型別時,模式 2 為默認模式( FSMC_BCRx 暫存器中 MTYP =0x10)

對于這5種模式,總結如下:

模式1/A:SRAM/PSRAM(CRAM)OE翻轉,模式A與模式1的區別是NOE的變化和相互獨立的讀寫時序,

模式2/B:NOR閃存,模式2/B與模式1相比較,不同的是NADV的變化,且在擴展模式下(模式B)讀寫時序相互獨立,(只有當設定了擴展模式時(模式B),FSMC_BWTRx才有效,否則該暫存器的內容不起作用,)

模式C :NOR閃存- OE翻轉,模式C與模式1不同的是,NOE和NADV的翻轉變化,以及獨立的讀寫時序;

模式D:帶地址擴展的異步操作,模式D與模式1不同的是NADV的翻轉變化,NOE的翻轉出現在NADV翻轉之后,并且具有獨立的讀寫時序,

 

07、模式1

模式 1 -SRAM/PSRAM (CRAM)

下圖顯示了所遵循的受支持模式的讀寫事務通過配置FSMC_BCRx, and FSMC_BTRx/FSMC_BWTRx暫存器

▽模式1讀訪問

▽模式1寫訪問

位于寫入事務末尾的一個HCLK 周期有助于確保NWE 上升沿之后的地址和資料保持時間,由于存在此HCLK 周期,DATAST 值必須大于零(DATAST > 0),

 

08、模式A

模式 A -SRAM/PSRAM (CRAM) OE 切換

▽模式A讀訪問

▽模式A寫訪問

與模式1的不同之處在于NOE 的切換與獨立的讀取和寫入時序

 

對于模式A,

ADDSET就是NWE的高電平時間,也就是地址建立時間

DATAST就是NWE的低電平時間,也就是資料保持時間

 

09、代碼說明

readWriteTiming.FSMC_AddressSetupTime = 0x02;   //地址建立時間(ADDSET)為2個HCLK 2*1/120M=16ns
readWriteTiming.FSMC_AddressHoldTime = 0x02;   //地址保持時間(ADDHLD),16ns  
readWriteTiming.FSMC_DataSetupTime = 0x06;     //資料建立時間,50ns
readWriteTiming.FSMC_BusTurnAroundDuration = 0x00;//總線恢復時間
readWriteTiming.FSMC_CLKDivision = 0x00;// 時鐘分頻因子 
readWriteTiming.FSMC_DataLatency = 0x00;//資料產生時間
readWriteTiming.FSMC_AccessMode = FSMC_AccessMode_A;   //模式A

FSMC_AddressSetupTime:這些位定義地址的建立時間,適用于SRAM、ROM和異步總線復用模式的NOR閃存操作,

FSMC_AddressHoldTime :這些位定義地址的保持時間,適用于SRAM、ROM和異步總線復用模式的NOR閃存操作,

FSMC_DataSetupTime:這些位定義資料的保持時間,適用于SRAM、ROM和異步總線復用模式的NOR閃存操作,

FSMC_BusTurnAroundDuration:這些位用于定義一次讀操作之后在總線上的延遲(僅適用于總線復用模式的NOR閃存操作),一次讀操作之后控制器需要在資料總線上為下次操作送出地址,這個延遲就是為了防止總線沖突,如果擴展的存盤器系統不包含總線復用模式的存盤器,或最慢的存盤器可以在6個HCLK時鐘周期內將資料總線恢復到高阻狀態,可以設定這個引數為其最小值,

FSMC_CLKDivision :定義CLK時鐘輸出信號的周期,以HCLK周期數表示,

FSMC_DataLatency:處于同步成組模式的NOR閃存,需要定義在讀取第一個資料之前等待的存盤器周期數目,這個時間引數不是以HCLK表示,而是以閃存時鐘(CLK)表示,在訪問異步NOR閃存、SRAM或ROM時,這個引數不起作用,操作CRAM時,這個引數必須為0

FSMC_AccessMode :訪問模式

FSMC_NORSRAMInitStructure.FSMC_Bank = FSMC_Bank1_NORSRAM1;//  這里我們使用NE1 ,也就對應BTCR[6],[7],
FSMC_NORSRAMInitStructure.FSMC_DataAddressMux = FSMC_DataAddressMux_Disable;// 不復用資料地址
FSMC_NORSRAMInitStructure.FSMC_MemoryType = FSMC_MemoryType_SRAM;// FSMC_MemoryType_SRAM; 
FSMC_NORSRAMInitStructure.FSMC_MemoryDataWidth = FSMC_MemoryDataWidth_8b;//存盤器資料寬度為8bit   
FSMC_NORSRAMInitStructure.FSMC_BurstAccessMode = FSMC_BurstAccessMode_Disable;
FSMC_NORSRAMInitStructure.FSMC_AsynchronousWait = FSMC_AsynchronousWait_Disable;  
FSMC_NORSRAMInitStructure.FSMC_WaitSignalPolarity = FSMC_WaitSignalPolarity_Low;
FSMC_NORSRAMInitStructure.FSMC_WrapMode = FSMC_WrapMode_Disable;
FSMC_NORSRAMInitStructure.FSMC_WaitSignalActive = FSMC_WaitSignalActive_BeforeWaitState;
FSMC_NORSRAMInitStructure.FSMC_WriteOperation = FSMC_WriteOperation_Enable;//  存盤器寫使能
FSMC_NORSRAMInitStructure.FSMC_WaitSignal = FSMC_WaitSignal_Disable;
FSMC_NORSRAMInitStructure.FSMC_ExtendedMode = FSMC_ExtendedMode_Disable;// 讀寫使用相同的時序
FSMC_NORSRAMInitStructure.FSMC_WriteBurst = FSMC_WriteBurst_Disable;
FSMC_NORSRAMInitStructure.FSMC_ReadWriteTimingStruct = &readWriteTiming;//讀寫時序
FSMC_NORSRAMInitStructure.FSMC_WriteTimingStruct = &readWriteTiming;//寫時序

FSMC_Bank:nor被分為四塊,其中這個引數是說明對那個塊編程

FSMC_DataAddressMux:地址\資料是否復用

FSMC_MemoryType:存盤器型別

FSMC_MemoryDataWidth:資料總線寬度8位/16位 

FSMC_BurstAccessMode:是否進行成組模式訪問

FSMC_WaitSignalPolarity:等待信號有效級性

FSMC_WrapMode:該位決定控制器是否支持把非對齊的AHB成組操作分割成2次線性操作;該位僅在存盤器的成組模式下有效,

FSMC_WaitSignalActive:當閃存存盤器處于成組傳輸模式時,NWAIT信號指示從閃存存盤器出來的資料是否有效或是否需要插入等待周期,該位決定存盤器是在等待狀態之前的一個時鐘周期產生NWAIT信號,還是在等待狀態期間產生NWAIT信號,

FSMC_WriteOperation:該位指示FSMC是否允許/禁止對存盤器的寫操作,

FSMC_WaitSignal:當閃存存盤器處于成組傳輸模式時,這一位允許/禁止通過NWAIT信號插入等待狀態,

FSMC_ExtendedMode:該位允許FSMC使用FSMC_BWTR暫存器,即允許讀和寫使用不同的時序,

FSMC_WriteBurst:對于處于成組傳輸模式的閃存存盤器,這一位允許/禁止通過NWAIT信號插入等待狀態,讀操作的同步成組傳輸協議使能位是FSMC_BCRx暫存器的BURSTEN位,

FSMC_ReadWriteTimingStruct:讀時序配置指標

FSMC_WriteTimingStruct:寫時序配置指標

 

點擊查看本文所在的專輯,STM32F207教程

轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/251327.html

標籤:嵌入式

上一篇:虛擬機 ubuntu18 樹莓派4 QT5.14.2 交叉編譯

下一篇:QT串口助手(三):資料接收

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • CA和證書

    1、在 CentOS7 中使用 gpg 創建 RSA 非對稱密鑰對 gpg --gen-key #Centos上生成公鑰/密鑰對(存放在家目錄.gnupg/) 2、將 CentOS7 匯出的公鑰,拷貝到 CentOS8 中,在 CentOS8 中使用 CentOS7 的公鑰加密一個檔案 gpg -a ......

    uj5u.com 2020-09-10 00:09:53 more
  • Kubernetes K8S之資源控制器Job和CronJob詳解

    Kubernetes的資源控制器Job和CronJob詳解與示例 ......

    uj5u.com 2020-09-10 00:10:45 more
  • VMware下安裝CentOS

    VMware下安裝CentOS 一、軟硬體準備 1 Centos鏡像準備 1.1 CentOS鏡像下載地址 下載地址 1.2 CentOS鏡像下載程序 點擊下載地址進入如下圖的網站,選擇需要下載的版本,這里選擇的是Centos8,點擊如圖所示。 決定選擇Centos8后,選擇想要的鏡像源進行下載,此 ......

    uj5u.com 2020-09-10 00:12:10 more
  • 如何使用Grep命令查找多個字串

    如何使用Grep 命令查找多個字串 大家好,我是良許! 今天向大家介紹一個非常有用的技巧,那就是使用 grep 命令查找多個字串。 簡單介紹一下,grep 命令可以理解為是一個功能強大的命令列工具,可以用它在一個或多個輸入檔案中搜索與正則運算式相匹配的文本,然后再將每個匹配的文本用標準輸出的格式 ......

    uj5u.com 2020-09-10 00:12:28 more
  • git配置http代理

    git配置http代理 經常遇到克隆 github 慢的問題,這里記錄一下幾種配置 git 代理的方法,解決 clone github 過慢。 目錄 git配置代理 git單獨配置github代理 git配置全域代理 配置終端環境變數 git配置代理 主要使用 git config 命令 git單獨 ......

    uj5u.com 2020-09-10 00:12:33 more
  • Linux npm install 裝包時提示Error EACCES permission denied解

    npm install 裝包時提示Error EACCES permission denied解決辦法 ......

    uj5u.com 2020-09-10 00:12:53 more
  • Centos 7下安裝nginx,使用yum install nginx,提示沒有可用的軟體包

    Centos 7下安裝nginx,使用yum install nginx,提示沒有可用的軟體包。 18 (flaskApi) [root@67 flaskDemo]# yum -y install nginx 19 已加載插件:fastestmirror, langpacks 20 Loading ......

    uj5u.com 2020-09-10 00:13:13 more
  • Linux查看服務器暴力破解ssh IP

    在公網的服務器上經常遇到別人爆破你服務器的22埠,用來挖礦或者干其他嘿嘿嘿的事情~ 這種情況下正確的做法是: 修改默認ssh的22埠 使用設定密鑰登錄或者白名單ip登錄 建議服務器密碼為復雜密碼 創建普通用戶登錄服務器(root權限過大) 建立堡壘機,實作統一管理服務器 統計爆破IP [root ......

    uj5u.com 2020-09-10 00:13:17 more
  • CentOS 7系統常見快捷鍵操作方式

    Linux系統中一些常見的快捷方式,可有效提高操作效率,在某些時刻也能避免操作失誤帶來的問題。 ......

    uj5u.com 2020-09-10 00:13:31 more
  • CentOS 7作業系統目錄結構介紹

    作業系統存在著大量的資料檔案資訊,相應檔案資訊會存在于系統相應目錄中,為了更好的管理資料資訊,會將系統進行一些目錄規劃,不同目錄存放不同的資源。 ......

    uj5u.com 2020-09-10 00:13:35 more
最新发布
  • vim的常用命令

    Vim的6種基本模式 1. 普通模式在普通模式中,用的編輯器命令,比如移動游標,洗掉文本等等。這也是Vim啟動后的默認模式。這正好和許多新用戶期待的操作方式相反(大多數編輯器默認模式為插入模式)。 2. 插入模式在這個模式中,大多數按鍵都會向文本緩沖中插入文本。大多數新用戶希望文本編輯器編輯程序中一 ......

    uj5u.com 2023-04-20 08:43:21 more
  • vim的常用命令

    Vim的6種基本模式 1. 普通模式在普通模式中,用的編輯器命令,比如移動游標,洗掉文本等等。這也是Vim啟動后的默認模式。這正好和許多新用戶期待的操作方式相反(大多數編輯器默認模式為插入模式)。 2. 插入模式在這個模式中,大多數按鍵都會向文本緩沖中插入文本。大多數新用戶希望文本編輯器編輯程序中一 ......

    uj5u.com 2023-04-20 08:42:36 more
  • docker學習

    ###Docker概述 真實專案部署環境可能非常復雜,傳統發布專案一個只需要一個jar包,運行環境需要單獨部署。而通過Docker可將jar包和相關環境(如jdk,redis,Hadoop...)等打包到docker鏡像里,將鏡像發布到Docker倉庫,部署時下載發布的鏡像,直接運行發布的鏡像即可。 ......

    uj5u.com 2023-04-19 09:26:53 more
  • 設定Windows主機的瀏覽器為wls2的默認瀏覽器

    這里以Chrome為例。 1. 準備作業 wsl是可以使用Windows主機上安裝的exe程式,出于安全考慮,默認情況下改功能是無法使用。要使用的話,終端需要以管理員權限啟動。 我這里以Windows Terminal為例,介紹如何默認使用管理員權限打開終端,具體操作如下圖所示: 2. 操作 wsl ......

    uj5u.com 2023-04-19 09:25:49 more
  • docker學習

    ###Docker概述 真實專案部署環境可能非常復雜,傳統發布專案一個只需要一個jar包,運行環境需要單獨部署。而通過Docker可將jar包和相關環境(如jdk,redis,Hadoop...)等打包到docker鏡像里,將鏡像發布到Docker倉庫,部署時下載發布的鏡像,直接運行發布的鏡像即可。 ......

    uj5u.com 2023-04-19 09:19:04 more
  • Linux學習筆記

    IP地址和主機名 IP地址 ifconfig可以用來查詢本機的IP地址,如果不能使用,可以通過install net-tools安裝。 Centos系統下ens33表示主網卡;inet后表示IP地址;lo表示本地回環網卡; 127.0.0.1表示代指本機;0.0.0.0可以用于代指本機,同時在放行設 ......

    uj5u.com 2023-04-18 06:52:01 more
  • 解決linux系統的kdump服務無法啟動的問題

    問題:專案麒麟系統服務器的kdump服務無法啟動,沒有相關日志無法定位問題。 1、查看服務狀態是關閉的,重啟系統也無法啟動 systemctl status kdump 2、修改grub引數,修改“crashkernel”為“512M(有的機器數值太大太小都會導致報錯,建議從128M開始試,或者加個 ......

    uj5u.com 2023-04-12 09:59:50 more
  • 解決linux系統的kdump服務無法啟動的問題

    問題:專案麒麟系統服務器的kdump服務無法啟動,沒有相關日志無法定位問題。 1、查看服務狀態是關閉的,重啟系統也無法啟動 systemctl status kdump 2、修改grub引數,修改“crashkernel”為“512M(有的機器數值太大太小都會導致報錯,建議從128M開始試,或者加個 ......

    uj5u.com 2023-04-12 09:59:01 more
  • 你是不是暴露了?

    作者:袁首京 原創文章,轉載時請保留此宣告,并給出原文連接。 如果您是計算機相關從業人員,那么應該經歷不止一次網路安全專項檢查了,你肯定是收到過資訊系統技術檢測報告,要求你加強風險監測,確保你提供的系統服務堅實可靠了。 沒檢測到問題還好,檢測到問題的話,有些處理起來還是挺麻煩的,尤其是線上正在運行的 ......

    uj5u.com 2023-04-05 16:52:56 more
  • 細節拉滿,80 張圖帶你一步一步推演 slab 記憶體池的設計與實作

    1. 前文回顧 在之前的幾篇記憶體管理系列文章中,筆者帶大家從宏觀角度完整地梳理了一遍 Linux 記憶體分配的整個鏈路,本文的主題依然是記憶體分配,這一次我們會從微觀的角度來探秘一下 Linux 內核中用于零散小記憶體塊分配的記憶體池 —— slab 分配器。 在本小節中,筆者還是按照以往的風格先帶大家簡單 ......

    uj5u.com 2023-04-05 16:44:11 more