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