flash模組組織
儲存器被組織為程式儲存器模組,資料eeprom模組和資訊塊。
程式儲存器塊分為4 kb的扇區,每個扇區都是進一步分成16頁,每頁256位元組。
該操作用於擦除程式儲存器中的頁面(64個字)。要做到這一點:
●解鎖flash_pecr暫存器
1.將pekey1 = 0x89abcdef寫入程式設計/擦除金鑰暫存器(flash_pekeyr)
2.將pekey2 = 0x02030405寫入程式設計/擦除金鑰暫存器(flash_pekeyr)
●解鎖程式儲存器
●解鎖flash_pecr暫存器
1. 將prgkey1 = 0x8c9daebf寫入程式儲存器金鑰暫存器
(flash_prgkeyr)
2.將prgkey2 = 0x13141516寫入程式儲存器金鑰暫存器
(flash_prgkeyr)
●將flash_pecr暫存器中的erase位置1
●設定flash_pecr暫存器中的prog位選擇程式頁面
●等待bsy位清零
●將0x0000 0000寫入程式頁的第乙個字以擦除
注意:該功能可以從兩個儲存體,ram或外部儲存器執行。
這個操作用來寫乙個字到程式儲存器,假設它是
先前被刪除。要做到這一點:
●解鎖flash_pecr暫存器
●解鎖程式儲存器
●將乙個字寫入程式儲存器中的有效位址。
**:(注釋刪了,上傳後全是亂碼
flash.c:
#include "flash.h"
#include "main.h"
#define u32 uint32_t
#define u16 uint16_t
#define u8 uint8_t
#define pekey1 0x89abcdef
#define pekey2 0x02030405
#define prgkey1 0x8c9daebf
#define prgkey2 0x13141516
extern char teemp;
void writeflashtest(u32 dataxaddr,u8 write_data,u32 size)
{ u32 i;
u32 temp;
u16 t=0;
u32 fwaddr=dataxaddr;
u8 *dfu=write_data;
hal_flash_unlock();
flash_eraseinittypedef f;
f.typeerase = flash_typeerase_pages;
f.pageaddress = dataxaddr;
f.nbpages = 1;
uint32_t pageerror = 0;
hal_flashex_erase(&f, &pageerror);
hal_flash_lock();
hal_flash_unlock();
for(t=0;tflash.h:
#include "main.h"
#include "stm32l1xx_hal_flash_ramfunc.h"
#define u32 uint32_t
#define u16 uint16_t
#define u8 uint8_t
void flash_erase_pages(u32 erase_address);
void writeflashtest(u32 dataxaddr,u8 write_data,u32 size);
u8 flash_read_data(u32 dataxaddr);
unsigned char flash_write_data(u32 dataxaddr,u32 write_data);
stm32 讀寫內部Flash
stm32的flash分為主儲存塊和資訊塊。主儲存塊用於儲存具體的程式 和使用者資料,資訊塊用於負責由stm32出廠是放置2kb的啟動程式 bootloader 和512b的使用者配置資訊區。主儲存塊是以頁為單位劃分的,一頁大小為1kb。範圍為從位址0x08000000開始的128kb內。對flas...
STM32 實現內部Flash的讀寫(HAL庫版)
flash 中文名字叫快閃儲存器,是一種長壽命的非易失性 斷電資料不丟失 的儲存器。可以對稱為塊的儲存器單元塊進行擦寫和再程式設計,在進行寫入操作之前必須先執行擦除。乙個nand flash由多個塊 block 組成,每個塊裡面又包含很多頁 page 每個頁對應乙個空閒區域 冗餘區域 spare a...
STM32之內部FLASH原理
不同型號的 stm32,其 flash 容量也有所不同,最小的只有 16k 位元組,最大的則達到了 1024k 位元組。市面上 stm32f1 開發板使用的晶元是 stm32f103系列,其 flash 容量一般為 512k 位元組,屬於大容量晶元。大容量產品的 flash 模組組織結構如圖 40....