水滴鱼长什么样子| 剁椒鱼头是什么鱼头| 梅花是什么颜色| 肠胃感冒是什么症状| 舌头发麻是什么原因| 做什么菜好吃又简单| 小孩小便红色是什么原因| 睡觉爱流口水是什么原因| 泡茶用什么杯子最好| 痔疮便血吃什么药| 成都有什么特色美食| 石英是什么| 变爻是什么意思| 枉然是什么意思| 斋醮什么意思| 舌头长泡吃什么药| 吃什么食物对头发好| 人体是由什么组成的| 脑多普勒检查什么| 牛和什么属相相冲| af什么意思| 胃胀吃什么药最有效| 大尾巴狼是什么意思| 易烊千玺什么星座| 泡热水脚有什么好处| 开路是什么意思| 胃反酸吃什么食物好| 玉和石头有什么区别| 女人腿肿应该检查什么| 警察为什么叫条子| 猪肝跟什么相克| 好吧是什么意思| 母亲ab型父亲o型孩子什么血型| 八月二十六是什么星座| hgb是什么意思| 视力模糊用什么眼药水| 职业测试你适合什么工作| 麦芽糖是什么做的| 金晨为什么叫大喜| 广州立冬吃什么| 癃闭是什么意思| 磨破皮了涂什么药| 10月19是什么星座| 脚趾抽筋是什么原因引起的| 偷袭是什么意思| 什么是提肛运动| 脚跟痛什么原因| 肝功能四项检查什么| 盐为什么要加碘| 甲状腺结节忌口什么| 四季春属于什么茶| 什么防辐射最好| 口干是什么原因呢| 玉溪烟属于什么档次| 苯磺酸氨氯地平片什么时候吃| 龙猫是什么动物| 耳鸣脑鸣是什么原因引起的| 止疼药吃多了有什么副作用| 成人自考本科需要什么条件| 梦见换房子是什么预兆| tia是什么病| 乌龟吃什么| 身上痒是什么原因| 母亲节送给妈妈什么礼物| 阴道口痒是什么原因| 经常打饱嗝是什么原因| 心猿意马是什么意思| 左腰疼痛是什么原因男性| 何首乌长什么样子| 舌苔发黄是什么症状| 什么也不懂| 血糖偏高能吃什么水果和食物最好| 女孩为什么难得午时贵| 日行一善是什么意思| 眼睛老是肿着是什么原因造成的| 心电图显示窦性心律是什么意思| 牙齿痛挂什么科| 盐酸苯海索片治什么病| md是什么职位| 医的笔顺是什么| 西咪替丁是什么药| pls是什么意思| 身经百战是什么意思| 人工牛黄是什么| 青字五行属什么| 肺结节吃什么好| 轴位是什么| 眩晕症吃什么药| 手热脚凉是什么原因| 火气太旺是什么原因| 猫头鹰吃什么| boq是什么意思| 艺名是什么意思| 牙疼有什么办法| 真实的印度是什么样的| 中秋节送什么水果好| 小狗肚子里有虫子吃什么药| 桃符指的是什么| 多囊卵巢综合症有什么症状| 水奶和奶粉什么区别| 什么是985| 久负盛名的负是什么意思| 胎儿偏小是什么原因| 为什么男人喜欢女人的胸| 李小龙和丁佩什么关系| 挂是什么意思| 诱惑是什么意思| 乳房疼痛应该挂什么科| 摸胸是什么感觉| 反复发烧吃什么药| 九重天是什么意思| 血小板有什么作用| 右眼上眼皮跳是什么预兆| psa升高代表什么| 脚气去医院挂什么科| 预防水痘吃什么药| 副县长是什么级别干部| 47岁属什么| 栀是什么意思| 为什么眨眼睛| 春晓的晓是什么意思| 降血糖喝什么茶好| 血压高喝什么茶| 断桥铝是什么意思| 里长是什么官| 阴囊湿疹长什么样图片| 儿童肚子疼吃什么药| 披什么散什么| 孽债是什么意思| 甲亢是什么回事| 高挑是什么意思| 吃了紧急避孕药会有什么反应| 地球什么时候毁灭| 什么是菱形| 什么情什么意| 三月29号是什么星座| 枣子什么季节成熟| 男人结扎有什么好处| 成年人改名字需要什么手续| pcl是什么意思| 女命带驿马是什么意思| 三级手术是什么意思| 步步高升是什么意思| 什么像什么似的什么造句| 浅蓝色裙子配什么颜色上衣好看| 萤火虫为什么会发光简单回答| tct是什么| 固体玉米糖浆是什么| 冰岛说什么语言| 中元节是什么| 掂过碌蔗是什么意思| 饮食清淡主要吃什么| 七夕送老婆什么| 酒后喝什么解酒| 亚甲炎吃什么药效果好| 5到7点是什么时辰| 犬瘟热是什么症状| 男士长脸适合什么发型| 老打瞌睡犯困是什么原因| 百什么百什么的成语| 慢性肾炎是什么原因引起的| 一个口一个甫念什么| 后脑勺麻木是什么征兆| 镶什么牙实惠耐用| 死心眼什么意思| 痛风要吃什么药好得快| 儿童红眼病用什么眼药水| 忘忧草是什么意思| 什么食用油最好最健康| 阿堵物是什么意思| 掉以轻心是什么意思| 脉数是什么意思| 什么人不宜吃石斛| 羊水栓塞是什么意思| 小脑梗塞会出现什么症状| 王的五行属性是什么| 为什么要做微信营销| 书字五行属什么的| sheep什么意思| 十月十一日是什么星座| 什么是洁癖| 肺结核挂什么科| 为什么心脏会隐隐作痛| candies什么意思| 蚊子吸血是为了什么| 农村什么赚钱| 夏天能干什么| 婴幼儿积食会有什么症状| 什么是边界感| 软脚虾是什么意思| 肩胛骨缝疼挂什么科| 南辕北辙告诉我们什么道理| 猫的偏旁叫什么| 健康证有什么用| 什么是有机磷农药| 什么是对比色| 亲故是什么意思| 望远镜什么牌子好| 氯化钠是什么盐| 全身皮肤瘙痒是什么原因引起的| 宫腔内异常回声是什么意思| 肥皂水是什么| m是什么单位| 无力感是什么意思| 喉咙里痰多是什么原因| 科普一下是什么意思| 后羿是什么生肖| 孟姜女属什么生肖| 钉钉是什么| 胎监不过关是什么原因| 男孩学什么专业有前途| 人参泡酒有什么功效和作用| 女人大腿粗代表什么| 周角是什么| 排卵日有什么症状| 瑶五行属什么| 替代品是什么意思| nars是什么牌子| 才子是什么意思| 一个牙一个合是什么字| 平顶山为什么叫平顶山| 阿胶糕适合什么人吃| 天生一对成伴侣是什么生肖| 螃蟹的血是什么颜色的| 百依百顺是什么生肖| 院士相当于什么级别| 宝宝便秘吃什么食物好| 地图舌吃什么药| 第二次世界大战是什么时候| 口干口苦吃什么药最好| 子宫肌瘤什么症状| 1007是什么星座| 什么筷子好| 普外科是什么科| 添堵是什么意思| 商业保险报销需要什么材料| 血糖能吃什么水果| 尾款是什么意思| 肾虚型脱发是什么样子| 经是什么意思| 双子座和什么座最配对| 4月1日什么星座| 幼稚细胞是什么意思| 小月子吃什么水果| 电磁波是什么| 西米是什么东西| 胃反流是什么原因引起的| 阴道瘙痒吃什么药| 什么是支原体感染| approval是什么意思| 为什么小鸟站在电线上不会触电| 眼睛为什么不怕冷| 痔疮挂什么科| 新疆人是什么人种| 布洛芬起什么作用| 什么叫次日| guess是什么牌子| 望子成龙是什么意思| 中秋节送什么好| 尿等待是什么原因| 糯米粉可以做什么好吃的| 为什么会得霉菌感染| u什么意思| fhr是什么意思| 百度

「STM32 Flash 操作全解析」擦除、写入、读取一网打尽!附完整源码

嵌入式系统   作者:嵌入式芯视野 时间:2025-08-06来源:今日头条
百度 人民日报社社长杨振武为荣获中国品牌先锋年度大奖的浙江吉利控股集团董事长李书福颁发奖项。

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

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

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

操作前需解锁 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)

函数先计算扇区数量:

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)

写入之前,同样要进行 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 的基础操作实现,包括:

以上代码适用于裸机开发,也可作为 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

加入微信
获取电子行业最新资讯
搜索微信公众号:EEPW

或用微信扫描左侧二维码

相关文章

查看电脑版
游泳前一定要做好什么运动 跛子是什么意思 渃是什么意思 中医是什么 反复感冒是什么原因引起的
说话不清楚是什么原因导致的 孺子可教也什么意思 2157是什么意思 血压高吃什么水果好 为什么身上会长脂肪瘤
心脏不舒服吃什么药最好 芒果过敏用什么药 01年属什么的 什么学习机好 黑枸杞的功效是什么
胃充盈欠佳是什么意思 盆腔炎吃什么药最有效 pes是什么材质 铮字五行属什么 低血钾吃什么药
孩子流黄鼻涕吃什么药效果好hcv8jop6ns6r.cn 五十八岁属什么生肖hcv9jop4ns4r.cn 醋纤是什么面料hcv9jop6ns1r.cn 辣条是什么做的hcv8jop8ns9r.cn 百年老枞属于什么茶hcv8jop6ns0r.cn
什么血型是熊猫血hcv9jop2ns9r.cn 热射病是什么病hcv8jop2ns3r.cn 肾素活性高是什么原因hcv9jop6ns1r.cn 梅子和杏有什么区别hcv8jop4ns1r.cn 驳是什么动物hcv8jop3ns9r.cn
百什么争鸣hcv9jop3ns7r.cn 11月25日是什么星座hcv8jop1ns0r.cn 心肌炎吃什么药jingluanji.com 一般什么原因做宫腔镜xianpinbao.com 赵云的武器叫什么hcv9jop7ns1r.cn
无水酥油是什么hcv9jop6ns1r.cn 软坚散结是什么意思hcv9jop2ns9r.cn 血肌酐高是什么原因hcv8jop1ns7r.cn 女人贫血吃什么补血最快hcv9jop3ns2r.cn 五行缺金是什么意思hcv7jop6ns0r.cn
百度