日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

用keil怎么擦除_分享STM32 FLASH 擦除(以及防止误擦除程序代码)、写入

發布時間:2023/12/4 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 用keil怎么擦除_分享STM32 FLASH 擦除(以及防止误擦除程序代码)、写入 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

編譯環境:我用的是(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

下一頁

創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎

總結

以上是生活随笔為你收集整理的用keil怎么擦除_分享STM32 FLASH 擦除(以及防止误擦除程序代码)、写入的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。