先下手为强是什么意思| 属猴的是什么命| 身体乳是什么| 鱼什么而什么| 总蛋白高是什么原因| 鹅蛋有什么好处| 慢性肠胃炎吃什么药| 幻肢是什么| 高压高低压正常是什么原因| 安全总监是什么级别| 长期喝豆浆有什么好处和坏处| 被艹是什么感觉| 古代的面首是什么意思| 涛字五行属什么| 为什么我不快乐| 关二爷是什么神| 肠炎吃什么药好的快| 什么是蒸馏水| 舌苔发黑是什么原因引起的| 血稠是什么原因造成的| 胃萎缩是什么意思| 怀孕两天会有什么反应| 天公作美什么意思| 梦见喝水是什么意思| 肠胃紊乱什么症状| 买手机上什么网| 檀郎是什么意思| 有何指教是什么意思| 高筋面粉和低筋面粉有什么区别| 蛋清加蜂蜜敷脸有什么好处| 湿热泄泻是什么意思| 回迁房是什么意思| 7月16日什么星座| 宝宝吃益生菌有什么好处和坏处| 脉是什么意思| 亥五行属什么| 火把节在每年农历的什么时间举行| 一个九一个鸟念什么| 鼻甲肥大是什么原因| 吃什么瘦肚子脂肪最快| 户籍地填什么| 指甲盖凹凸不平是什么原因| 口腔溃疡是什么原因造成的| 大便粘便池是什么原因| 7月14日是什么日子| rosa是什么意思| 如果你是什么那快乐就是什么| 颈椎不舒服挂什么科| 血压高降不下来是什么原因| 飞机后面的白烟是什么| 白虎关是什么意思| 便秘是什么意思| 甄嬛传什么时候上映的| 7朵玫瑰花代表什么意思| 吉页读什么| 乩童是什么意思| 十一月份出生的是什么星座| 周六左眼跳是什么预兆| 阴虚火旺吃什么食物| 大脑供血不足用什么药| 全距是什么意思| 慈悲是什么意思| 吃什么东西去湿气| 山楂可以和什么一起泡水喝| 水土不服吃什么药| 凉血是什么意思| 壁虎是什么类动物| 凹陷性疤痕用什么药膏| 结婚送什么礼物最合适| 女性分泌物增多发黄是什么原因| 每年什么时候征兵| 丑小鸭告诉我们一个什么道理| 落空是什么意思| 左手臂有痣代表什么| 疏是什么意思| 摇曳是什么意思| 子宫内膜增厚是什么意思| 家里进蝙蝠什么预兆| 裸婚什么意思| 孕妇梦见猫是什么意思| 颞颌关节炎吃什么药| 什么是种草| 高原反应的原因是什么| ABA是什么植物激素| 日柱华盖是什么意思| 什么是软饮料| 青皮是什么皮| pvs是什么意思| 透明的什么| 钾肥是什么肥料| 海豚吃什么食物| 黄粱是什么意思| 希特勒为什么杀犹太人| 老年性脑改变是什么意思| 无字五行属什么| 肿瘤标志物cA724高说明什么| 擅长是什么意思| 病毒感染咳嗽吃什么药效果好| 眼压高什么症状| 咳嗽吃什么好| 鸢的俗称是什么| 吃什么补充酪氨酸酶| 感染幽门螺旋杆菌吃什么药| 病变是什么意思| 终端是什么意思| 栀子对妇科有什么功效| 甘油三酯高是什么意思| 煞南是什么意思| 既什么又什么| 过敏性紫癜是什么病| 三妻四妾是什么生肖| 脸水肿是什么原因| 不硬的原因是什么| 经常脚抽筋是什么原因| 节瓜是什么瓜| 人黑穿什么颜色的衣服好看| vc是什么药| peaches是什么意思| 包皮开裂擦什么药膏| 咂嘴是什么意思| 德巴金是什么药| 什么是尿失禁| 相火是什么意思| 生酮是什么意思| 男人阴茎硬不起来是什么原因| 什么是甲状腺| 银河系的中心是什么| 4级手术是什么意思| 徘徊是什么意思| 梦见眼镜蛇是什么预兆| 甘肃天水有什么好玩的地方| 放下执念是什么意思| icloud是什么| 缺金的人戴什么最旺| 增大摩擦力的方法有什么| 右眼上眼皮跳是什么预兆| 祎是什么意思| 儿童腮腺炎吃什么药| 茶叶杀青是什么意思| 什么太空| 谶语是什么意思| 为什么家里会有蜈蚣| 怀疑肝不好挂什么科室| hpv是什么| 什么是芡实| 粉红是什么意思| 乳清是什么| 5月26日是什么星座| 原籍是什么意思| 视线模糊是什么原因| 什么是腺样体| 活检是什么检查| 荷花代表什么象征意义| 鑫字属于五行属什么| 高铁服务员叫什么| zw是什么意思| 天生一对成伴侣是什么生肖| 11年是什么婚| 吃华法林不能吃什么| 得过且过什么意思| 任字五行属什么| 玻璃体混浊吃什么药好| 小便有血尿是什么原因| 肛裂用什么药治最好效果最快| 争奇斗艳的斗是什么意思| 中之人什么意思| 梦见妈妈出轨预示什么意思| 阿米替林片是治什么病的| 小孩拉肚子吃什么药效果好| 为什么孩子要跟爸爸姓| 胃疼吃什么饭| 嵌顿是什么意思| 大同有什么好吃的| 梦见买黄金是什么兆头| 非主流什么意思| 肝脑涂地是什么意思| vera是什么意思| 百田森的鞋什么档次| 脑炎是什么症状| 斗智斗勇什么意思| 浮生若梦是什么意思| 吃什么补气补血最见效| 肝看什么科| 漫山遍野是什么意思| 中性是什么意思| 蓝莓对身体有什么好处| 心窦过缓是什么原因| 抹布是什么意思| 七月半是什么日子| 香蕉是什么季节的| 梦见自己家被盗有什么预兆| 多巴胺什么意思| 什么大笑| 学渣什么意思| 李思思为什么离开央视| 苁蓉有什么功效| 花开两朵各表一枝什么意思| 长孙皇后为什么叫观音婢| 来曲唑片是什么药| 月子里可以吃什么水果| 什么叫suv车| 忌诸事不宜什么意思| 中核集团是什么级别| 再接再厉是什么意思| 天梭属于什么档次| 10周年结婚是什么婚| 陋习什么意思| 肾阳虚吃什么| 鞭尸什么意思| 主人是什么意思| 手发抖是什么原因引起的年轻人| 为什么掉发严重| 横死是什么意思| 痛风是什么原因造成的| 孤独的最高境界是什么| 脸上长红色的痘痘是什么原因| iron什么意思| 乘风破浪是什么生肖| 葡萄糖什么意思| 用什么梳子梳头发最好| 身份证号码的数字代表什么意义| 男人小便刺痛吃什么药| 什么叫腔梗| 左上腹疼是什么原因| 补气血喝什么泡水| 黄埔军校现在叫什么| 青光眼是什么意思| 1966年属马的是什么命| 后壁是什么意思| 3.8号是什么星座| 吃螃蟹不能喝什么饮料| 哪吒的妈妈叫什么| 梦见钓鱼是什么意思周公解梦| 2029年属什么生肖| 荥在中医读什么| 白茶泡出来是什么颜色| 砂舞是什么意思| dw是什么牌子的手表| 吸烟人吃什么清肺最快| 7月份适合种什么菜| 白带异常是什么原因| 淋是什么意思| 尿失禁是什么原因| 吸烟有害健康为什么国家还生产烟| 眼睛充血用什么药| 长期胃胀气什么原因| via什么意思| 什么地流着| 鱼油不能和什么一起吃| 摩羯座什么性格| 画画用什么铅笔| gag是什么意思| 上火吃什么水果好| 越睡越困是什么原因| 受割礼是什么意思| 续航是什么意思| 县尉相当于现在什么官| 荷花的别称是什么| 婴儿泡奶粉用什么水好| 免疫力是什么| 艾滋病潜伏期有什么症状| 鼎字五行属什么| 乌灵胶囊有什么副作用| 腰间盘突出是什么症状| 百度

新闻中心

EEPW首页 > 嵌入式系统 > 设计应用 > 「STM32 Flash 操作全解析」擦除、写入、读取一网打尽!附完整源码

《中国记者》杂志

作者:嵌入式芯视野 时间:2025-08-03 来源:今日头条 收藏
百度 “对于因人工智能产业发展可能带来的改变,立法上要有充分考虑。

在嵌入式开发中,MCU 内部的 常用于存储配置信息、日志数据或用于 OTA 升级。F4 系列 MCU 提供了对 的灵活操作能力,包括按扇区擦除、字节或半字写入等。本文将围绕一段实际使用的 操作代码进行讲解,主要涉及 Flash 的擦除、写入与读取功能。

一、Flash 结构及操作基本原理

F4 MCU 的 Flash 存储器按照扇区(Sector)划分,每个扇区大小不一,例如在 F407 中,前四个扇区大小为 16KB,第五个为 64KB,之后为若干个 128KB 的大扇区。片上 Flash 支持:

  • 扇区级擦除(Sector Erase)

  • 多种对齐方式的编程(如 Byte、Halfword、Word、Double Word)

  • 擦写需先解锁并清除相关标志位

操作前需解锁 Flash 控制器,完成后应及时锁定以防意外写入。

二、Flash 扇区映射及擦除操作

代码中的扇区映射表 sec_map[] 采用结构体 sec_info_t 维护每个扇区的起始地址、大小及编号:

typedef struct {
    unsigned int start;    unsigned int size;    unsigned int secnum;
} sec_info_t;

这是一个结构体类型,表示每个扇区的起始地址、扇区大小和扇区编号。接着通过一个常量数组 sec_map[] 列出 Flash 不同扇区的信息:

const sec_info_t sec_map[] = {
    {0x08000000, 16*1024, FLASH_Sector_0},
    {0x08004000, 16*1024, FLASH_Sector_1},
    {0x08008000, 16*1024, FLASH_Sector_2},
    {0x0800C000, 16*1024, FLASH_Sector_3},
    {0x08010000, 64*1024, FLASH_Sector_4},
    {0x08020000, 128*1024, FLASH_Sector_5},
    {0x08040000, 128*1024, FLASH_Sector_6},
    {0x08040000, 128*1024, FLASH_Sector_7}};

该映射表根据 STM32F4 的 Flash 布局列出了常用的 8 个扇区。


二、Flash 擦除函数讲解

函数 mcu_flash_erase() 实现对 Flash 指定地址范围的擦除。

int mcu_flash_erase(unsigned int addr, size_t size)
  • addr: 要擦除的起始地址

  • size: 要擦除的范围(单位为字节)

函数先计算扇区数量:

int len = sizeof(sec_map) / sizeof(sec_info_t);

然后依次遍历扇区,找出与 addr 和 size 匹配的扇区范围,并执行擦除:

status = FLASH_EraseSector(sec->secnum, VoltageRange_2);

在执行擦除之前必须解锁 Flash:

FLASH_Unlock();

擦除完成后锁定 Flash:

FLASH_Lock();

最后返回 1 表示成功,返回 0 表示擦除失败。

三、Flash 写入函数讲解

写入函数为:

int mcu_flash_write(unsigned int addr ,const void *buf, size_t size)
  • addr: 写入的起始地址

  • buf: 待写入的数据缓冲区

  • size: 写入数据的字节数

写入之前,同样要进行 Flash 解锁,并清除标志位:

FLASH_Unlock();              
FLASH_ClearFlag(FLASH_FLAG_EOP | FLASH_FLAG_WRPERR | FLASH_FLAG_OPERR | 
                FLASH_FLAG_PGAERR);

然后进入一个循环,按字节或半字方式逐步写入 Flash:

if ((addr & 1) == 0 && size > 2) {    status = FLASH_ProgramHalfWord(addr, *((uint16_t *)p));    wrlen = 2;
} else {    status = FLASH_ProgramByte(addr, *((uint8_t *)p));    wrlen = 1;
}

写入完成后更新地址和缓冲区指针:

size -= wrlen;addr += wrlen;p    += wrlen;

如果写入中某次操作返回错误,则提前跳出,最后执行锁定操作并返回是否写入成功:

FLASH_Lock();return ret;

四、Flash 读取函数讲解

读取函数的接口为:

int mcu_flash_read(unsigned int addr ,void *buf, size_t size)

该函数直接通过内存拷贝读取 Flash 数据:

memcpy(buf, (void *)addr, size);  
return 0;

其中 addr 是 Flash 的起始地址,buf 是目标缓存区,size 是读取字节数。由于 STM32 的 Flash 可以直接映射为内存读取,因此可以像访问普通内存一样操作。

五、总结

本篇文章介绍了 STM32F4 MCU 内部 Flash 的基础操作实现,包括:

  • 使用结构体映射 Flash 扇区信息

  • 实现 Flash 擦除函数,通过匹配地址范围擦除对应扇区

  • 实现 Flash 写入函数,按字节或半字逐步写入 Flash

  • 实现 Flash 读取函数,通过 memcpy 方式直接读取 Flash 内容

以上代码适用于裸机开发,也可作为 STM32 Flash 操作的基础模板,配合上层协议或文件系统进行扩展应用,如参数存储、数据记录、Bootloader 固件升级等功能。

开源源码供参考:

#include "mcu_flash.h"#include "stm32f4xx.h"#include <string.h>typedef struct {
    unsigned int start;    unsigned int size;    unsigned int secnum;
}sec_info_t;/*扇区地址映射 ---------------------------------------------------------------*/const sec_info_t sec_map[] = 
{
    {0x08000000, 16*1024, FLASH_Sector_0},
    {0x08004000, 16*1024, FLASH_Sector_1},
    {0x08008000, 16*1024, FLASH_Sector_2},
    {0x0800C000, 16*1024, FLASH_Sector_3},
    {0x08010000, 64*1024, FLASH_Sector_4},
    {0x08020000, 128*1024, FLASH_Sector_5},
    {0x08040000, 128*1024, FLASH_Sector_6},
    {0x08040000, 128*1024, FLASH_Sector_7}
};/*
 * @brief       stm32 mcu 内部flash擦除操作
 * @param[in]   addr        - 地址
 * @param[in]   探险大小    - size
 * @return      0 - 失败, 非0 - 成功
 */int mcu_flash_erase(unsigned int addr, size_t size){ 
    int i;    int len = sizeof(sec_map) / sizeof(sec_info_t);    const sec_info_t *sec = &sec_map[len - 1];
    
    FLASH_Status status;    
    /*越界处理*/
    if (addr > sec->start + sec->size)        return 0;
    
    FLASH_Unlock();    for (i = 0; i < len; i++)
    {
        sec = &sec_map[i];        if ( (sec->start >= addr && sec->start < addr + size) || 
             (sec->start + sec->size > addr && sec->start + sec->size <= addr + size))
        {            //FLASH_OB_WRPConfig();
            status = FLASH_EraseSector(sec->secnum, VoltageRange_2);            if (status != FLASH_COMPLETE)
            {
                FLASH_Lock(); 
                return 0;  
            }
                          
        }
    }
    FLASH_Lock(); 
    return 1;
}/*
 * @brief       stm32 mcu 内部flash写操作
 * @param[in]   addr        - 地址
 * @param[in]   buf         - 数据缓冲区
 * @param[in]   写入大小    - size
 * @return      0 - 失败, 非0 - 成功
 */int mcu_flash_write(unsigned int addr ,const void *buf, size_t size){    unsigned char *p = (uint8_t *)buf;//    unsigned int base = addr;//    size_t tlen = size;
    int wrlen;
    FLASH_Status status = FLASH_COMPLETE;    int ret = 0;
    FLASH_Unlock();              
    FLASH_ClearFlag(FLASH_FLAG_EOP | FLASH_FLAG_WRPERR | FLASH_FLAG_OPERR | 
                    FLASH_FLAG_PGAERR);     
    while (size) {#if 0
        /*根据对齐方式优化写入长度*/
        if ((addr & 7) == 0 && size > 8)             /*8字节对齐,按双字写入*/  
        {
            status = FLASH_ProgramDoubleWord(addr, *((uint64_t *)p));            if (status != FLASH_COMPLETE)                goto _quit;
            wrlen = 8;
        }        else if ((addr & 3) == 0 && size > 4)        /*4字节对齐,按字写入*/
        {
            status = FLASH_ProgramWord(addr, *((uint32_t *)p));            if (status != FLASH_COMPLETE)                goto _quit;
            wrlen = 4;
        }        else if ((addr & 1) == 0 && size > 2)        /*2字节对齐,按半字写入*/
        {
            status = FLASH_ProgramHalfWord(addr, *((uint16_t *)p));            if (status != FLASH_COMPLETE)                goto _quit;
            wrlen = 2;
        }        else                                         /*按字节写入 --------*/
        {
            status = FLASH_ProgramByte(addr, *((uint8_t *)p));            if (status != FLASH_COMPLETE)                goto _quit;
            wrlen = 1;
        }#endif
        if ((addr & 1) == 0 && size > 2)        /*2字节对齐,按半字写入*/
        {
            status = FLASH_ProgramHalfWord(addr, *((uint16_t *)p));            if (status != FLASH_COMPLETE)                goto _quit;
            wrlen = 2;
        }        else                                         /*按字节写入 --------*/
        {
            status = FLASH_ProgramByte(addr, *((uint8_t *)p));            if (status != FLASH_COMPLETE)                goto _quit;
            wrlen = 1;
        }        
        /*地址偏移 -------------------------------------------------------*/
        size -= wrlen;
        addr += wrlen;
        p    += wrlen;        
    }
_quit:

     ret = status == FLASH_COMPLETE;// && memcmp(buf, (void *)base, tlen) ? 1 : 0;     
 FLASH_Lock();     return ret;
}/*
 * @brief       stm32 mcu 内部flash读操作
 * @param[in]   addr        - 地址
 * @param[in]   buf         - 数据缓冲区
 * @param[in]   读出长度    - size
 * @return      0 - 失败, 非0 - 成功
 */int mcu_flash_read(unsigned int addr ,void *buf, size_t size){    memcpy(buf, (void *)addr, size);  
    return 0;
}



关键词: STM32 Flash

评论


相关推荐

技术专区

关闭
阴阳失调吃什么中成药 啵啵是什么意思 belkin是什么牌子 胆囊炎是什么病 保卡是什么意思
糖尿病可以吃什么零食 田字出头是什么字 什么是石斛 boy是什么牌子 抑郁症看什么科
最大的沙漠是什么 黄瓜敷脸有什么好处 成双成对是什么生肖 自言自语是什么原因导致 梦见搬家是什么预兆
浪蹄子什么意思 阴虱用什么药 拈花一笑什么意思 胃火旺吃什么中成药 脂肪肝看什么指标
什么叫制动hcv8jop0ns7r.cn 九月十七日是什么星座hcv9jop6ns3r.cn 光子嫩肤是什么hcv8jop8ns6r.cn 栉风沐雨是什么意思hcv8jop3ns1r.cn 2002年属什么hcv8jop8ns9r.cn
嫦娥是什么生肖hcv9jop3ns0r.cn 什么蛋白质含量高cj623037.com 走路脚心疼是什么原因hcv9jop5ns1r.cn 送女朋友什么礼物好hcv9jop0ns0r.cn 什么是医保hcv7jop6ns9r.cn
车前草的作用是什么hcv9jop7ns5r.cn 谷草转氨酶偏高是什么原因hcv9jop1ns4r.cn 受精卵着床有什么感觉0297y7.com 中蛊什么意思hcv8jop4ns2r.cn 脂肪肝是什么意思啊hcv8jop3ns2r.cn
孕妇红细胞偏低是什么原因hcv8jop0ns2r.cn 耳耵聍是什么东西hcv9jop7ns3r.cn 鸟吃什么东西hcv8jop7ns0r.cn 淋巴是什么东西hcv9jop7ns3r.cn 豆绿色是什么颜色zhongyiyatai.com
百度