新聞中心

EEPW首頁 > 嵌入式系統(tǒng) > 設計應用 > 用C語言編程操作SPMC75內(nèi)部Flash的方法

用C語言編程操作SPMC75內(nèi)部Flash的方法

作者: 時間:2011-10-21 來源:網(wǎng)絡 收藏
1引言
  支持C語言幾乎是所有微控制器程序設計的一項基本要求,當然系列單片機也不例外。μ'nSPTM 指令結構的設計就著重考慮對C語言的支持,GCC就是一種針對μ'nSPTM 操作平臺的ANSI-C編譯器。但是在應用中對于程序的設計,特別是C和ASM混合使用的時候有些地方是需要注意的,在C中如何嵌入ASM也是一個不可回避的問題。

2單片機FLASH硬件資源分析
  系列微控制器Flash分為兩區(qū):信息區(qū)和通用區(qū),在同一時間只能訪問其中的一區(qū)。信息區(qū)包含64個字,尋址空間為0x8000 ~ 0x803F。地址0x8000為系統(tǒng)選項寄存器P_System_Option。其他地址空間可由用戶自定義重要信息比如:版本控制、日期、版權、項目名稱等等。信息區(qū)的內(nèi)容只有在仿真或燒錄的狀態(tài)下才能改變。
  32k字的內(nèi)嵌Flash(embedded Flash)被劃分為16個頁,每頁2K字,每頁可分為8塊,這樣32K的Flash就可以分成128個塊。只有位于00F000 ~00F7FF區(qū)域的頁在自由運行模式下可以設置為只讀或可讀可寫,其他頁均為只讀。SPMC75系列微控制器的32K字的內(nèi)嵌式閃存結構入下圖2-1和圖2-2。

圖2-1信息區(qū)結構      圖2-2頁和幀結構

2.1 FLASH操作
◆ FLASH相關寄存器
  Flash有兩個控制寄存器:P_Flash_RW ($704D)和P_Flash_Cmd ($7555).。
  P_Flash_RW ($704D)是Flash訪問控制接口,用連續(xù)兩次寫操作進行設置,這樣避免誤寫入。首先向該寄存器寫入$5a5a,然后在16個CPU時鐘周期內(nèi)再向該寄存器寫入設置字。

表 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ù)兩次寫操作進行設置,這樣避免誤寫入:首先向該寄存器寫入$5a5a,然后在16個CPU時鐘周期內(nèi)再向該寄存器寫入設置字。

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

  用控制寄存器將頁設置內(nèi)嵌FLASH為只讀或可讀可寫模式。

類型 ( 默認 )

描述

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ù)據(jù)

寫數(shù)據(jù)

第四步

自動等待 20ms 后結束

自動等待 40us 后結束

自動等待 40us

未寫完則轉向第二步

[ P_Flash_CMD ]= 0xFFFF à 操作結束令

2.2 FLASH操作使用舉例
◆Flash塊擦除操作

//擦除Flash的第14頁的第0塊
P_Flash_CMD->W = 0xAAAA; //寫控制命令
P_Flash_CMD->W = 0x5511; //寫入塊擦除命令
//要檫除的塊任一地址寫入任意數(shù)據(jù),則擦除此塊
P_WordAdr = (unsigned int *)0xF000;
*P_WordAdr = 0x5555;

◆ Flash單字寫操作

//擦除Flash的第14頁的第0塊
//寫控制命令
P_Flash_CMD->W = 0xAAAA;
//寫入塊擦除命令
P_Flash_CMD->W = 0x5511;
//0xF000單元寫入數(shù)據(jù)0x5555
P_WordAdr = (unsigned int *)0xF000;
*P_WordAdr = 0x5555;

  Flash的特點是編程數(shù)據(jù)寫入時只能將1變成0,不能從0變成1。因此,用戶在對Flash編程之前,必須首先執(zhí)行Flash塊擦除或者頁擦除命令,這樣就可以將數(shù)據(jù)從0"擦除"為1。

◆ Flash連續(xù)寫操作
采用連續(xù)編程模式向Flash的0xF000 到 0xF060地址空間連續(xù)寫入數(shù)據(jù)。

// 寫數(shù)據(jù)到 0xF001~0xF060的連續(xù)單元中,設這段空間已經(jīng)擦//除過。
P_WordAdr = (unsigned int *)0xF001;
uiData = 11;
P_Flash_CMD->W = 0xAAAA; //寫控制命令
for(i = 1;i = 96;i ++)
{
   P_Flash_CMD->W = 0x5544; //寫入連續(xù)數(shù)據(jù)寫命令
   *P_WordAdr = uiData; //寫入數(shù)據(jù)
   uiData ++;
   P_WordAdr ++;
}
P_Flash_CMD->W = 0xFFFF; //結束數(shù)據(jù)寫入操作



評論


相關推薦

技術專區(qū)

關閉