内部FLASH读写学习笔记
全文为内部FLASH读写学习笔记。
以下分享的是代码集成模块,可直接放入文件使用:
flash.h 文件
#ifndef __FLASH_H
#define __FLASH_H
#include "sys.h"
#define PAGE_ADDR(n) (FLASH_BASE + n * 2048) //FLASH 页地址计算
void flash_write_half_word(u32 addr, u16 *hdata, u32 len);
void flash_write_word(u32 addr, u32 *data, u32 len);
void flash_read_half_word(u32 addr, u16 *harr, u32 len);
void flash_read_word(u32 addr, u32 *arr, u32 len);
#endif //__FLASH_H
flash.c 文件
#include "flash.h"
void flash_write_half_word(u32 addr, u16 *hdata, u32 len) { //向 FLASH 中写入半个字
u16 page = len % 1024 == 0 ? len / 1024 : len / 1024 + 1; //获取写入数据需要的页数,一页大小 2K,一个数据占位为 2
printf("page:%d\r\n", page);
FLASH_Unlock(); //解锁 FLASH
for(u16 i = 0; i < page; i ++) { //循环按页擦除 FLASH
FLASH_ErasePage(addr + 2024 * i); //擦除一页 FLASH
}
for(u16 i = 0; i < len; i ++) { //循环向 FLASH 中写入半字数据
FLASH_ProgramHalfWord(addr, hdata[i]); //向 FLASH 写入半个字内容
addr += 2; //地址后移 2 位
}
FLASH_Lock(); //锁定 FLASH
}
void flash_write_word(u32 addr, u32 *data, u32 len) { //向 FLASH 中写入一个字
u16 page = len % 512 == 0 ? len / 512 : len / 512 + 1; //获取写入数据需要的页数,一页大小 2K,一个数据占位为 4
FLASH_Unlock(); //解锁 FLASH
for(u16 i = 0; i < page; i ++) { //循环按页擦除 FLASH
FLASH_ErasePage(addr + 2024 * i); //擦除一页 FLASH
}
for(u16 i = 0; i < len; i ++) { //循环向 FLASH 中写入半字数据
FLASH_ProgramHalfWord(addr, data[i]); //向 FLASH 写入半个字内容
addr += 4; //地址后移 4 位
}
FLASH_Lock(); //锁定 FLASH
}
void flash_read_half_word(u32 addr, u16 *harr, u32 len) { //从 FLASH 中读出一段半字
for(u16 i = 0; i < len; i ++) {
harr[i] = *(u16 *)addr;
addr += 2;
}
}
void flash_read_word(u32 addr, u32 *arr, u32 len) { //从 FLASH 中读出一段字
for(u16 i = 0; i < len; i ++) {
arr[i] = *(u32 *)addr;
addr += 4;
}
}
温馨提示:
在使用的时候,对于 512K 容量的 flash,建议 32 位数组不要超过 64 个数据,16 位数组不要超过 128 个数据,对于 1M 容量的 flash,建议 32 位数组不要超过 128 个数据,16 位数组不要超过 256 个数据,对于 2M 容量的 flash,建议 32 位数组不要超过 256 个数据,16 位数组不要超过 512 个数据,否则后续代码将不会被执行(对于别人,我不清楚,至少对于我来说是这样的,个人揣测是内存空间不足导致的)。
学习分享,一起成长!以上为小编的学习分享,若存在不当之处,请批评指正!