1. 程式人生 > >STM32學習筆記-Flash做為儲存器儲存資料

STM32學習筆記-Flash做為儲存器儲存資料


其中寫操作如下:
     FLASH_Unlock();  //解鎖FLASH程式設計擦除控制器
     FLASH_ClearFlag(FLASH_FLAG_BSY|FLASH_FLAG_EOP|FLASH_FLAG_PGERR|FLASH_FLAG_WRPRTERR);//清除標誌位
     /*********************************************************************************
          //               FLASH_FLAG_BSY            FLASH忙標誌位
          //               FLASH_FLAG_EOP            FLASH操作結束標誌位
          //               FLASH_FLAG_PGERR            FLASH編寫錯誤標誌位
          //               FLASH_FLAG_WRPRTERR       FLASH頁面防寫錯誤標淨         
     **********************************************************************************/
     FLASH_ErasePage(FLASH_START_ADDR);     //擦除指定地址頁
     FLASH_ProgramHalfWord(FLASH_START_ADDR+(addr+i)*2,dat); //從指定頁的addr地址開始寫
     FLASH_ClearFlag(FLASH_FLAG_BSY|FLASH_FLAG_EOP|FLASH_FLAG_PGERR|FLASH_FLAG_WRPRTERR);//清除標誌位
     FLASH_Lock();    //鎖定FLASH程式設計擦除控制器

從上面可以看出基本順序是:
解鎖-》清除標誌位(可以不要)-》擦除-》寫半字-》清楚標誌位(也可以不要)-》上鎖。其中FLASH_START_ADDR是巨集定義的0x8000000+2048*255,0x8000000是Flash的起始地址,2048是因為我用的是大容量晶片,根據上一筆記Flash地址可以看出晶片每頁容量2K,即2048位元組,255表示晶片的最後一頁,這個根據不同晶片而定。之所以從後面頁寫起可以防止儲存資料破壞使用者程式。addr*2是因為每個資料佔用2位元組(半字),雖然寫入的是1位元組資料,但是程式設計是2位元組為單位,也就是說一個位元組的資料也會佔用兩個位元組地址。

讀操作如下:
 u16 value;
    value = *(u16*)(FLASH_START_ADDR+(addr*2));//從指定頁的addr地址開始讀