新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 用C語言編程操作SPMC75內部Flash的方法

        用C語言編程操作SPMC75內部Flash的方法

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

        2單片機FLASH硬件資源分析
          系列微控制器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塊
        P_Flash_CMD->W = 0xAAAA; //寫控制命令
        P_Flash_CMD->W = 0x5511; //寫入塊擦除命令
        //要檫除的塊任一地址寫入任意數據,則擦除此塊
        P_WordAdr = (unsigned int *)0xF000;
        *P_WordAdr = 0x5555;

        ◆ Flash單字寫操作

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

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

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

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



        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 清河县| 鹤岗市| 新营市| 宁安市| 济南市| 周宁县| 拉孜县| 宝应县| 平南县| 轮台县| 崇文区| 鄂尔多斯市| 江口县| 中超| 木里| 石嘴山市| 唐海县| 杂多县| 镇坪县| 阳西县| 武宁县| 通化市| 云林县| 电白县| 抚州市| 威宁| 乃东县| 嘉善县| 基隆市| 永定县| 教育| 方城县| 新疆| 高邮市| 岳普湖县| 海宁市| 获嘉县| 崇州市| 环江| 临西县| 阿鲁科尔沁旗|