新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 分享STM32 FLASH 擦除(以及防止誤擦除程序代碼)、寫入

        分享STM32 FLASH 擦除(以及防止誤擦除程序代碼)、寫入

        作者: 時間:2016-12-01 來源:網絡 收藏
        編譯環境:我用的是(Keil)MDK4.7.2
        stm32庫版本:我用的是3.5.0
        一、本文不對FLASH的基礎知識做詳細的介紹,不懂得地方請查閱有關資料。
          對STM32 內部FLASH進行編程操作,需要遵循以下流程:
          FLASH解鎖
          清除相關標志位
          擦除FLASH(先擦除后寫入的原因是為了工業上制作方便,即物理實現方便)
          寫入FLASH
          鎖定FLASH
        實例:
        #define FLASH_PAGE_SIZE ((uint16_t)0x400) //如果一頁為1K大小
        #define WRITE_START_ADDR ((uint32_t)0x08008000)//寫入的起始地址
        #define WRITE_END_ADDR ((uint32_t)0x0800C000)//結束地址
        uint32_t EraseCounter = 0x00, Address = 0x00;//擦除計數,寫入地址
        uint32_t Data = 0x3210ABCD;//要寫入的數據
        uint32_t NbrOfPage = 0x00;//記錄要擦除的頁數
        volatile FLASH_Status FLASHStatus = FLASH_COMPLETE;/*FLASH擦除完成標志*/
        void main()
        {
        /*解鎖FLASH*/
         FLASH_Unlock();
        /*計算需要擦除FLASH頁的個數 */
         NbrOfPage = (WRITE_END_ADDR - WRITE_START_ADDR) / FLASH_PAGE_SIZE;
        /* 清除所有掛起標志位 */
          FLASH_ClearFlag(FLASH_FLAG_EOP | FLASH_FLAG_PGERR | FLASH_FLAG_WRPRTERR);
        /* 擦除FLASH 頁*/
         for(EraseCounter = 0; (EraseCounter < NbrOfPage) && (FLASHStatus == FLASH_COMPLETE); EraseCounter++)
          {
           FLASHStatus = FLASH_ErasePage(WRITE_START_ADDR + (FLASH_PAGE_SIZE * EraseCounter));
          }
        /* 寫入FLASH*/
         Address = WRITE_START_ADDR;
         while((Address < WRITE_END_ADDR) && (FLASHStatus == FLASH_COMPLETE))
          {
           FLASHStatus = FLASH_ProgramWord(Address, Data);
           Address = Address + 4;
          }
        /* 鎖定FLASH*/
         FLASH_Lock();
        }
        二、FLASH 擦除(以及防止誤擦除程序代碼)
        1、擦除函數
        FLASH_Status FLASH_ErasePage(u32 Page_Address)只要()里面的數是flash第xx頁中對應的任何一個地址!就是擦除xx頁全部內容!


        防止誤擦除有用程序代碼的方法
        方法一:首先要計算程序代碼有多少,把FLASH存取地址設置在程序代碼以外的地方,這樣就不會破壞用戶程序。原則上從0x0800 0000 + 0x1000 以后的FLASH空間都可以作為存儲使用。如果代碼量占了 0x3000, 那么存儲在 0x0800 0000+ 0x4000 以后的空間就不會破壞程序了。

        方法二:先在程序中定義一個const 類型的常量數組,并指定其存儲位置(方便找到寫入、讀取位置),這樣編譯器就會分配你指定的空間將常量數組存入FLASH中。當你做擦除。讀寫操作時,只要在這個常量數組所在的地址范圍就好。

          const uint8_t table[10]__at(0x08010000)= {0x55} ;
          MDK3.03A開始就支持關鍵字 __at() 。
          需要加#include

        方法三:在程序中定義一個const 類型的常量數組,無需指定其存儲位置。只要定義一個32位的變量存儲這個數組的FLASH區地址就行。

          uint32_t address;//STM32的地址是32位的
          const uint8_t imageBuffer[1024] = {0,1,2,3,4,5,6,7};
          address = (uint32_t) imageBuffer;/*用強制類型轉換的方式,可以把FLASH中存儲的imageBuffer[1024]的地址讀到RAM中的變量address 里,方便找到寫入、讀取位置*/

        方法四:利用寫保護的方式(沒研究明白)

        上一頁 1 2 下一頁

        關鍵詞: STM32FLASH擦除寫

        評論


        技術專區

        關閉
        主站蜘蛛池模板: 苏尼特左旗| 贺兰县| 株洲市| 堆龙德庆县| 霍山县| 紫云| 什邡市| 万源市| 离岛区| 通河县| 封开县| 安龙县| 高邑县| 长宁区| 宿松县| 信丰县| 常州市| 延津县| 鹿邑县| 乌兰浩特市| 大余县| 平乡县| 双江| 东方市| 林州市| 涿州市| 兴安县| 尉氏县| 霍城县| 卢氏县| 化隆| 蒙城县| 台江县| 阳原县| 阳春市| 新竹市| 庐江县| 孟津县| 南溪县| 大关县| 丘北县|