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;t
{
temp=(u16)dfu[3]<<24;
temp+=(u16)dfu[2]<<16;
temp+=(u16)dfu[1]<<8;
temp+=(u16)dfu[0];
dfu+=4;
HAL_FLASH_Program(FLASH_TYPEERASEDATA_WORD, fwaddr, temp);
fwaddr+=4;
}
HAL_FLASH_Lock();
}
u8 Flash_read_data(u32 dataxaddr)
{
uint8_t temp = *(__IO uint8_t*)(dataxaddr);
return temp;
}
flash.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);
『本文转载自网络,版权归原作者所有,如有侵权请联系删除』