用C語言編程操作SPMC75內部Flash的方法
支持C語言幾乎是所有微控制器程序設計的一項基本要求,當然SPMC75系列單片機也不例外。μ'nSPTM 指令結構的設計就著重考慮對C語言的支持,GCC就是一種針對μ'nSPTM 操作平臺的ANSI-C編譯器。但是在應用中對于程序的設計,特別是C和ASM混合使用的時候有些地方是需要注意的,在C中如何嵌入ASM也是一個不可回避的問題。
2SPMC75單片機FLASH硬件資源分析
SPMC75系列微控制器Flash分為兩區:信息區和通用區,在同一時間只能訪問其中的一區。信息區包含64個字,尋址空間為0x8000 ~ 0x803F。地址0x8000為系統選項寄存器P_System_Option。其他地址空間可由用戶自定義重要信息比如:版本控制、日期、版權、項目名稱等等。信息區的內容只有在仿真或燒錄的狀態下才能改變。
32k字的內嵌Flash(embedded Flash)被劃分為16個頁,每頁2K字,每頁可分為8塊,這樣32K的Flash就可以分成128個塊。只有位于00F000 ~00F7FF區域的頁在自由運行模式下可以設置為只讀或可讀可寫,其他頁均為只讀。SPMC75系列微控制器的32K字的內嵌式閃存結構入下圖2-1和圖2-2。
圖2-1信息區結構 圖2-2頁和幀結構
2.1 FLASH操作
◆ FLASH相關寄存器
Flash有兩個控制寄存器:P_Flash_RW ($704D)和P_Flash_Cmd ($7555).。
P_Flash_RW ($704D)是Flash訪問控制接口,用連續兩次寫操作進行設置,這樣避免誤寫入。首先向該寄存器寫入$5a5a,然后在16個CPU時鐘周期內再向該寄存器寫入設置字。
表 2-1 Flash寄存器和系統寄存器
地址 | 寄存器 | 名稱 |
704Dh | P_Flash_RW | 內嵌 Flash 的訪問控制寄存器 |
7555h | P_Flash_Cmd | 內嵌 Flash 的控制寄存器 |
P_Flash_RW ($704D):內嵌的Flash訪問控制寄存器
P_Flash_RW ($704D)是Flash訪問控制接口,用連續兩次寫操作進行設置,這樣避免誤寫入:首先向該寄存器寫入$5a5a,然后在16個CPU時鐘周期內再向該寄存器寫入設置字。
B15 | B14 | B13 | B12 | B11 | B10 | B9 | B8 |
R | R/W | R | R | R | R | R | R |
1 | 0 | 1 | 1 | 1 | 1 | 1 | 1 |
保留 | BK14WENB | BK13WENB | BK12WENB | BK11WENB | BK10WENB | BK9WENB | BK8WENB |
B7 | B6 | B5 | B4 | B3 | B2 | B1 | B0 |
R | R | R | R | R | R | R | R |
1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 |
BK7WENB | BK6WENB | BK5WENB | BK4WENB | BK3WENB | BK2WENB | BK1WENB | BK0WENB |
用控制寄存器將頁設置內嵌FLASH為只讀或可讀可寫模式。
類型 ( 默認 ) | 頁 | 塊 | 描述 | |
B[15] | 保留 | |||
B[14] | R/W (0) | Bank 14 | Frame 112~119 | F000h-F7FFh 訪問控制 1= 只讀 0= 讀 / 寫 |
B[13:0] | 保留 |
P_Flash_Cmd ($7555):內嵌的Flash訪問控制寄存器
用于處理Flash的指令,見表2-3
B15 | B14 | B13 | B12 | B11 | B10 | B9 | B8 |
W | W | W | W | W | W | W | W |
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
FlashCtrl |
B7 | B6 | B5 | B4 | B3 | B2 | B1 | B0 |
W | W | W | W | W | W | W | W |
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
FlashCtrl |
表 2-2 指令功能和操作流程
塊擦除 | 單字寫模式 | 連續多字寫模式 | |
第一步 | P_Flash_CMD = 0xAAAA | ||
第二步 | [ P_Flash_CMD ] = 0x5511 | [ P_Flash_CMD ] = 0x5533 | [ P_Flash_CMD ] = 0x5544 |
第三步 | 設置擦除地址 | 寫數據 | 寫數據 |
第四步 | 自動等待 20ms 后結束 | 自動等待 40us 后結束 | 自動等待 40us |
未寫完則轉向第二步 | |||
[ P_Flash_CMD ]= 0xFFFF à 操作結束令 |
2.2 FLASH操作使用舉例
◆Flash塊擦除操作
![]() | //擦除Flash的第14頁的第0塊 |
◆ Flash單字寫操作
![]() | //擦除Flash的第14頁的第0塊 |
Flash的特點是編程數據寫入時只能將1變成0,不能從0變成1。因此,用戶在對Flash編程之前,必須首先執行Flash塊擦除或者頁擦除命令,這樣就可以將數據從0"擦除"為1。
◆ Flash連續寫操作
采用連續編程模式向Flash的0xF000 到 0xF060地址空間連續寫入數據。
![]() | // 寫數據到 0xF001~0xF060的連續單元中,設這段空間已經擦//除過。 |
評論