概述
SPIM(External SPI FLASH memory interface)最大地址段為0x08400000-0x093FFFFF(16MB),是AT32 MCU獨有的一種Flash訪問方式。用戶可以使用自己的Flash作為AT32 MCU的外掛Flash。該方式有別于片上Bank1/Bank2,用戶可根據具體需求選擇是否開啟。開啟SPIM后可以作為Flash擴展實現如下功能:
在SPIM地址存放用戶執行程序,類似于Bank1/Bank2一樣執行程序。
用戶程序直接訪問SPIM地址,作為存儲字體庫,圖片等存儲器使用。
SPIM配置
SPIM僅允許按字(32bit)或者半字(16bit)操作,在執行讀、編程、擦除SPIM前,必須首先執行初始化及解鎖操作。
SPIM在AT32不同系列產品及不同封裝上,可能使用的pin有所不同,具體請參考對應型號產品的RM和DS,下面以AT32F403A系列為例,描述操作步驟
初始化及解鎖操作
初始化及解鎖的步驟,在AT32的BSP中已經封裝成庫函數,用戶可以直接調用
1) 使能GPIOA、GPIOB和IOMUXCRM時鐘。
2) 配置對應pin PA8、PA11、PA12、PB1、PB6、PB7為推挽復用輸出模式。
4) 設置FLASH_SELECT寄存器選擇配置SPIM Flash的類型。
5) 使用KEY解鎖SPIM:寫FLASH_UNLOCK3寄存器2次,按順序分別寫0x45670123和0xCDEF89AB。
6) 檢查SPIM是否解鎖成功,讀取FLASH_CTRL3寄存器的OPLK位,如果被清除為0,則可以開始操作SPIM。
Flash型號選擇
SPIM可以配置支持不同型號的spi Flash,支持的指令集如下表,更詳細描述可以看參考手冊FlASH章節。
表1. SPIM支持的指令集
讀操作
直接按字(32bit)或者半字(16bit)訪問需要讀取數據的地址段:0x08400000–0x093FFFFF
編程操作
編程操作步驟,在AT32的BSP中已經封裝成庫函數,用戶可以直接調用
1) 打開編程操作,FLASH_CTRL3寄存器FPRGM位置1
2) 直接按字(32bit)或者半字(16bit)在需要編程的地址寫入數據
3) 檢查是否寫入完成讀取FLASH_STS3寄存器的OBF位是否清除,如果清除表示寫入完成
4) 關閉編程操作,FLASH_CTRL3寄存器FPRGM位置0
5) 檢查是否寫入成功,讀取FLASH_STS3寄存器的PRGMERR和EPPERR位,如果都為0則表示寫入成功
擦除操作
SPIM擦除分為Mass Erase和Sector Erase,每個sector固定為4KB,在AT32的BSP中已經封裝成庫函數,用戶可以直接調用
Mass Erase
1) 使能擦除,FLASH_CTRL3寄存器CHPERS位置1
2) 開始擦除,FLASH_CTRL3寄存器ERSTR位置1
3) 關閉擦除,FLASH_CTRL3寄存器CHPERS位置0
Sector Erase
1) 使能擦除,FLASH_CTRL3寄存器SECERS位置1
2) 選擇擦除扇區地址,FLASH_ADDR3寄存器寫入需要擦除扇區的地址
3) 開始擦除,FLASH_CTRL3寄存器ERSTR位置1
4) 關閉擦除,FLASH_CTRL3寄存器SECERS位置0
加密操作
因為SPIM電路裸露在MCU芯片外部,為防止存儲在SPIM Flash里邊的數據被外界直接讀取,SPIM提供了加密功能,將原始數據通過特有算法進行加密操作后再寫入Flash,AT32 MCU讀取SPIM數據時會先進行解密得到原始數據,然后才使用,保證數據安全。加密算法所用的SPIM scrambled KEY為用戶系統數據區的地址0x1FFFF820-0x1FFFF82F范圍內數據。
當SPIM scrambled KEY值全為0xFFFFFFFF時,加密功能關閉。
當SPIM scrambled KEY值不全為0xFFFFFFFF時,加密功能開啟。AT32 MCU根據FLASH_DA寄存器值作為加密范圍分界,小于0x08400000+FLASH_DA地址段的數據為密文,其余范圍數據仍然采用明文存儲。
注意:數據寫入時的加密狀態必須和讀取時的加密狀態保持一致,否則可能導致讀取的數據是亂碼而無法正確使用或者運行。即寫入時如果配置了SPIM scrambled KEY及FLASH_DA,那么在讀取時也必須配置相同的SPIM scrambled KEY及FLASH_DA。
圖1. SPIM scrambled KEY存放地址
圖2. SPIM地址范圍
硬件電路
因為SPIM連接在外部電路,受環境影響較大,為保證電路穩定,需盡量減少PCB布線長度。
注意:SPIM運行頻率為MCU的AHB時鐘頻率的1/2,所以當開啟SPIM時,MCU對應的運行AHB頻率有最大限制值,不同型號MCU在SPIM開啟時運行的最大頻率值請用戶參考DS的通用工作條件章節描述。
圖3. 參考電路
I/O復用
要使用SPIM,需要注意跟其他外設IP的IO復用問題。
當SPIM使用的IO還有對應的其他外設使能的話,有些IO即使其他外設應用中沒有用到,但也可能會占用。
例如:XMC和SPIM同時使用時,在F403A上PB7用作SPIM的IO2,但是如果配置使能了XMC,即使XMC_NADV功能沒有使用,則PB7也會被XMC_NADV默認開啟占用,導致SPIM工作異常。此時需手動配置IOMUX_REMAP2寄存器關閉XMC_NADV功能,調用庫函數即可,如下gpio_pin_remap_config (XMC_NADV_MUX, TRUE)
圖4. XMC和SPIM共用引腳
圖5. 單獨關閉XMC_NADV功能
demo示例
AT32的BSP中,有兩個例程operate_spim和run_in_spim演示了如何使用SPIM。
用戶程序訪問SPIM存儲區
如果通過用戶程序去執行讀、編程及擦除操作,只需要按照正常配置初始化及解鎖后就可以實現。
BSP中examplesflashoperate_spim執行了SPIM的初始化、擦除、編程和讀取流程,并通過LED顯示執行結果。
下載用戶程序到SPIM或者用戶程序在SPIM執行
如果用戶程序通過keil下載到SPIM中,或者想程序直接在SPIM執行,需要執行一些額外的操作。
附件工程run_in_spim通過LED的閃爍,簡單的演示了代碼如何在SPIM上運行。
1) Options-Debug-Settings-Flash Download中選擇添加外掛flash類型。
圖6. 配置SPIM Flash類型
2) Options-Target中添加SPIM起始地址和容量大小,但不勾選。Demo中將SPIM定義在IROM2位置,用于存儲C文件
注意:如果勾選則KEIL在編譯時可能會將其余不需要運行在SPIM的函數編譯到SPIM地址段。
圖7. 配置SPIM起始地址和容量
3) Project中選擇需要運行在SPIM對應位置的C文件,鼠標右鍵選Options進入將Memory Assignment的code地址改為對應地址段。
注意:如果工程中函數還有更多指定地址分段編譯的需求,可以繼續添加到對應 ROM1/2/3 等,也可以手動修改sct文件
圖8. 配置需運行在SPIM第一部分代碼
4) 編譯時勾選自動生成sct文件的選項,編譯完成后瀏覽sct文件可以發現需要運行在SPIM區域的函數已被正確編譯到該區域。
圖9 勾選自動生成sct文件
圖10 自動生成的sct文件
注意:整個代碼的啟動必須從bank1開始,須保證SPIM flash的初始化代碼在程序執行到SPIM前運行。
審核編輯:湯梓紅
-
mcu
+關注
關注
146文章
17185瀏覽量
351708 -
FlaSh
+關注
關注
10文章
1638瀏覽量
148199 -
存儲器
+關注
關注
38文章
7514瀏覽量
164004
原文標題:AT32講堂021 | 如何使用AT32 MCU的SPIM作為外部存儲器的擴展功能
文章出處:【微信號:AT32 MCU 雅特力科技,微信公眾號:AT32 MCU 雅特力科技】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論