FSMC:靈活的靜態存儲控制器能夠與同步或異步存儲器和16位PC存儲器卡連接STM32的FSMC接口支持包括SRAM、NAND FLASH、NOR FLASH和PSRAM等存儲器STM32 407和103是不支持SD RAM的,429,439支持SD RAM操作12345
FSMC驅動外部SRAM(LCD被當做SRAM)
SRAM控制包含: 地址線(如A0~A25) 數據線(如D0~D15) 寫信號(WE,即WR) 讀信號(OE,即RD) 片選信號(CS) 若SRAM支持字節控制,還有UB/LB信號。12345678
上一節提到的TFTLCD信號,RS、D0~D15、WR、RD、CS、RST和BL等
其中真正操作LCD時用到的就只有: 數據&命令:RS 數據線:D0~D15 寫信號:WR 讀信號:RD 片選信號:CS1234567
操作時序和SRAM控制類似,唯一不同是TFTLCD有RS信號,但是沒有地址信號
TFTLCD通過RS信號來決定傳送是數據還是命令,可以理解為一個地址信號
將RS接到FSMC地址線A10(A0-A25隨意),TFTLCD就被當做一個SRAM使用
這樣TFTLCD成為只有一個地址的SRAM設備,從而實現FSMC驅動TFTLCD
STM32的FSMC支持8/16/32位數據寬度,我們使用的LCD為16位,所以設置選擇16位
FSMC的外部設備地址映像:STM32的FSMC將外部存儲器劃分為固定大小為256M字節的四個存儲塊
如圖: FSMC分為4塊,每塊256M字節又被劃分為4*64,即四個片選 NOR / PSRAM使用塊1,共256M NAND快閃記憶體使用塊2,3,共512M PC卡使用塊4,共256M123456
所以我們使用NOR PSRAM驅動TFTLCD
STM32的FSMC存儲塊1(Bank1)用於驅動NOR FLASH/SRAM/PSRAM
Bank1被分為4個區,每個區管理64M字節空間,每個區都有獨立的寄存器對所連接的存儲器進行配置。
Bank1的256M字節空間由28根地址線(HADDR[27:0])尋址。 這裡HADDR,是內部AHB地址總線
HADDR[25:0]來自外部存儲器地址FSMC_A[25:0],而HADDR[26:27]對4個區進行尋址。
如下圖所示:
說明: HADDR[27:26]是不可手動配置的,當選擇所在區後會自動賦值注意: 1,當Bank1接 8位寬度存儲器時:HADDR[25:0] -> FSMC_A[25:0] 2,當Bank1接16位寬度存儲器時:HADDR[25:1] -> FSMC_A[24:0] 由於內部每個地址對應一個字節,外部設備16位寬,FSMC的一個地址對應兩個字節 即: 0000對應FSMC_A[0]=0 (2位元組) 0010對應FSMC_A[0]=1 (2位元組) 0100對應FSMC_A[1]=1 (2位元組) 所以對應關係需要除以2,內部右移一位對齊 此時最低位沒用,訪問最低位需要使用UB/LB 不論外部接8位/16位寬設備,FSMC_A[0]永遠接在外部設備地址A[0]123456789101112131415161718
STM32的FSMC存儲塊1支持的異步突發訪問模式
包括模式1,模式A~D等多種時序模型,驅動SRAM一般使用模式1或模式A
我們使用模式A驅動LCD(當做SRAM使用),模式A支持讀寫時序分開設置
上一篇說的LCD時序,我們知道,LCD的讀寫耗時是不同的.寫快讀慢
這裡採用模式A,針對不同的速度,做不同的設置
模式A讀時序:
模式A寫時序:
ILI9341時序-讀寫高低電平最小持續時間:
根據ILI9341時序讀寫高低電平最小持續時間來配置模式A的讀寫時序
對於NOR FLASH/PSRAM控制器-存儲塊1,可通過FSMC_BCRx、FSMC_BTRx和FSMC_BWTRx寄存器設置(其中x=1~4,對應4個區)。
通過這3個寄存器,可以設置FSMC訪問外部存儲器的時序參數,拓寬了可選用的外部存儲器的速度範圍。
1,SRAM/NOR快閃記憶體片選控制寄存器(FSMC_BCRx)
EXTMOD: 擴展模式使能位,控制是否允許讀寫不同的時序,需設置為1WREN: 寫使能位。我們要向TFTLCD寫數據,需設置為1MWID[1:0]: 存儲器數據總線寬度。00,表示8位數據模式;01表示16位數據模式;10和11保留。 我們的TFTLCD是16位數據線,需設置WMID[1:0]=01。MTYP[1:0]: 存儲器類型。00表示SRAM、ROM;01表示PSRAM;10表示NOR FLASH;11保留。 我們把LCD當成SRAM用,需設置MTYP[1:0]=00。MBKEN: 存儲塊使能位。需設置為112345678910111213
2,SRAM/NOR快閃記憶體片選時序寄存器(FSMC_BTRx)-讀時序控制
ACCMOD[1:0]: 訪問模式。00:模式A;01:模式B;10:模式C;11:模式D。 我們使用模式A,需設置為00DATAST[7:0]: 數據保持時間,等於: DATAST(+1)個HCLK時鐘周期,DATAST最大為255。 對於ILI9341相當於RD低電平持續時間,最大355ns 對於STM32F1,一個HCLK=13.8ns (1/72M),設置為15,相當於16個HCLK=220.8,加上STM32F1的FSMC性能較低一些,配置為15即可 對於STM32F4,一個HCLK=6ns(1/168M) ,設置為60(360)。ADDSET[3:0]: 地址建立時間。表示:ADDSET+1個HCLK周期,ADDSET最大為15。 對ILI9341來說,這裡相當於RD高電平持續時間,為90ns。 STM32F1的FSMC性能較低,即便設置為0,RD也有190ns高電平,所以設置為1 STM32F1設置為15注意: 如果未設置EXTMOD位,則讀寫共用FSMC_BTRx時序寄存器12345678910111213141516171819
3,SRAM/NOR快閃記憶體寫時序寄存器(FSMC_BWTRx)-寫時序控制
ACCMOD[1:0]: 訪問模式。00:模式A;01:模式B;10:模式C;11:模式D。DATAST[7:0]: 數據保持時間,等於: DATAST(+1)個HCLK時鐘周期,DATAST最大為255。 對ILI9341來說,其實就是WR低電平持續時間,為15ns,不過ILI9320等則需要50ns。 考慮兼容性,對STM32F1一個HCLK=13.8ns (1/72M),設置為3(4*13.8=55.2); 對STM32F4,一個HCLK=6ns(1/168M) ,設置為9(9*6=54)。ADDSET[3:0]: 地址建立時間。表示:ADDSET+1個HCLK周期,ADDSET最大值為1111 = 15。 對ILI9341來說,這裡相當於WR高電平持續時間,為15ns。 考慮兼容ILI9320,STM32F1即便設置為1,WR也有100ns高電平,所以設置為1。 而對STM32F4,則設置為8(9*6=54)12345678910111213
ST官方庫寄存器定義中並沒有FSMC_BCRx、FSMC_BTRx、FSMC_BWTRx等單獨寄存器
而是將他們進行了一些組合。規律如下:
FSMC_BCRx和FSMC_BTRx,組合成BTCR[8]寄存器組,他們的對應關係如下:
BTCR[0]對應FSMC_BCR1,BTCR[1]對應FSMC_BTR1BTCR[2]對應FSMC_BCR2,BTCR[3]對應FSMC_BTR2BTCR[4]對應FSMC_BCR3,BTCR[5]對應FSMC_BTR3BTCR[6]對應FSMC_BCR4,BTCR[7]對應FSMC_BTR412345
FSMC_BWTRx則組合成BWTR[7],他們的對應關係如下:
BWTR[0]對應FSMC_BWTR1,BWTR[2]對應FSMC_BWTR2,BWTR[4]對應FSMC_BWTR3,BWTR[6]對應FSMC_BWTR4,BWTR[1]、BWTR[3]和BWTR[5]保留
推薦閱讀
,上面就是IO直接控制LCD的方法。假如放到STM32裡面,用IO直接控制顯得效率很低。STM32有FSMC(其實其他晶片基本都有類似的總線功能),FSMC的好處就是你一旦設置好之後,WR、RD、DB0-DB15這些控制線和數據線,都是FSMC自動控制的。打個比方,當你在程序中寫到:*(volatile unsigned short int *)(0x60000000)=val;那麼FSMC就會自動執行一個寫的操作,其對應的主控晶片的WE、RD這些腳,就會呈現出寫的時序出來(即WE=0,RD=1),數據val的值也會通過DB0-15自動呈現出來(即FSMC-D0:FSMC-D15=val)。地址0x60000000會被呈現
發表於 2020-03-23
最近在學習SMT32的FSMC模塊,現將我自己對FSMC的理解講解一下,並對學習過程中遇到的疑點和難點進行分享。0.前言學習FSMC,我推薦《STM32F4xx中文參考手冊》、《STM32F4開發指南-庫函數版本_V1.1.pdf》和一些SRAM的技術文檔,比如《IS62WV51216.pdf》。如果有STM32開發板那就更好了,如果沒有開發板,只是想了解FSMC的工作原理及過程,可以參考STM32F407的程序代碼,這些資料可以去正點原子官方網站免費下載:http://www.openedv.com/thread-13912-1-1.html。本文主要是按照《STM32F4xx中文參考手冊》FSMC部分講解。對我在學習過程中
發表於 2020-03-23
一、基本概念1. 與非總線復用的16位SRAM接口FSMC配置SRAM存儲器和NOR快閃記憶體存儲器共用相同的FSMC存儲塊,所用的協議依不同的存儲器類型而有所不同。控制SRAM存儲器,FSMC應該具有下述功能:●使用或禁止地址/數據總線的復用功能。●選擇所用的存儲器類型:NOR快閃記憶體、SRAM或PSRAM。●定義外部存儲器的數據總線寬度:8或16位。●使用或關閉擴展模式:擴展模式用於訪問那些具有不同讀寫操作時序的存儲器。正如配置NOR快閃記憶體存儲器一樣,用戶必須按照SRAM存儲器的數據手冊給出的時序數據,計算和設置下列參數:●ADDSET:地址建立時間●ADDHOLD:地址保持時間●DATAST:數據建立時間二、例程1.
發表於 2020-03-23
硬體平臺:icore板(STM32F103VC + EP4C6E22C8)STM32F103VC是100管腳的,FSMC引腳定義:地址僅有A19-23 A16-18 共8根地址線,數據線有16根,控制信號RD、WR、NE1FPGA掛在BANK1的第一區(NE1,還可以有NE2、3、4) 這樣可以在FPGA內定義8個寄存器(僅解析A16-18三根地址線) /***********************************************************據此定義如下STM32與FPGA間通信用的寄存器 
發表於 2020-03-17
剛開始接觸感覺似乎很難,真的是雲裡霧裡。但是看了百度百科FMSC介紹以及芯嵌stm32入門視頻《基於stm32的FSMC控制LCD的理解》視頻終於對FMSC有自己的理解。雖然還有些細節還沒有完全吃透,但是學東西就是需要在摸索中前進,停下來就是浪費時間。然後馬上拿起板子,下載SRAM的例程運行。好正常運行。下面我們來看看相關的代碼吧。/*神舟SRAM讀寫程序相關定義*/#define BUFFER_SIZE 0x400 /*定義讀寫BUFFER大小*/#define
發表於 2020-03-17
CH395L是帶並口的版本,支持串口、SPI、並口三種模式,網卡類似於內置TCP協議的W5500,用戶只需讀取一些參數設置socket就可以完成網絡通信。CH395具有並口模式,這是個特色,在對速度要求高的場合,並口比SPI等串行方式快很多,在使用stm32f103以fsmc硬體並口驅動ch395時參考秉火和戰艦的驅動LCD的例程,因為都是8080時序的設備,方法相似。在配置過程中,發現在以杜邦線連接ch395模塊的情況下,readWriteTiming.FSMC_AddressSetupTime = 0x03;  
發表於 2020-03-17