亡羊补牢的寓意是什么| 热血病是什么病| 送女生礼物送什么好| 什么茶助眠| 胃热是什么原因引起的| 菠萝蜜不能跟什么一起吃| 三点水弘读什么| 残疾证有什么补贴| 感冒鼻子不通气吃什么药| 三九胃泰治什么胃病效果好| 10月31日什么星座| 人为什么会哭| 急性结肠炎什么症状| 愚孝什么意思| 邮件号码是什么| 金庸原名叫什么| 皮赘是什么原因引起的| 风寒是什么意思| 飞机用什么油| 失眠多梦吃什么药| 出汗多是什么病| 鹅什么时候开始下蛋| 什么奶粉比较好| 噫是什么意思| 男命正印代表什么| 射精太快吃什么药| 口腔起血泡是什么原因| 梦见怀孕是什么预兆| 追求是什么意思| 生长因子是什么| 吃什么会导致流产| 婴儿什么时候开始说话| 用热毛巾敷眼睛有什么好处| 低迷是什么意思| 男人射精是什么感觉| 二氧化钛是什么| 没有是什么意思| pph是什么材料| 小孩子注意力不集中看什么科| 消化不良的症状吃什么药| 毫无违和感是什么意思| 什么什么似火| boys是什么意思| 瘫痪是什么意思| 什么的蜻蜓| 茶水费是什么意思| 姝姝是什么意思| 小脑萎缩吃什么药好| 蜂王浆什么味道| 乳酸菌可以制作什么| 便秘吃什么药效果好| 人得猫癣用什么药| 线束是什么意思| 什么食物补铁| giordano是什么牌子| 爬坡是什么意思| 安五行属性是什么| 荷塘月色是什么菜| 瓜子脸适合剪什么发型| 敛肺是什么意思| 粘纤是什么材质| 女人大把掉头发是什么原因| 内热吃什么药清热解毒| 胃炎吃什么药| 耽美剧是什么意思| 周文王叫什么名字| ckd3期是什么意思| 高足是什么意思| 止盈什么意思| 身体容易青紫是什么原因| 五谷是什么| 什么是行政处罚| 小孩手指脱皮是什么原因| aivei是什么品牌| 左肾结晶是什么意思| 孕早期宫缩是什么感觉| 10岁属什么| 7月23日是什么日子| 近水楼台是什么意思| 医学生规培是什么意思| 平反是什么意思| 足字旁的字有什么| 临床医学是什么| 打胎药叫什么| 什么是hr| 西安五行属什么| 小二阳是什么意思| 东方明珠什么时候亮灯| 梦见被追杀预示什么| 为什么北京是首都| 什么鸡| 气胸是什么症状| 猫有什么品种| 心脏房颤吃什么药| 飞机上可以带什么吃的| 阴蒂是什么| 省内流量是什么意思| 虚不受补吃什么中成药| pb是什么意思| 磁共振和核磁共振有什么区别| 脚心热什么原因| 肾萎缩吃什么药好| 今晚开什么特马| 重磅是什么意思| 嗷呜是什么意思| 日昳是什么意思| 蒸桑拿是什么意思| 女性白带多吃什么药| ha什么意思| 梦见下雨是什么意思| 女性排卵有什么症状或感觉| 不走心是什么意思| 下面痒吃什么消炎药| tommy什么牌子| 宴字五行属什么| 左手臂有痣代表什么| 宝宝吐奶是什么原因引起的| 鼻中隔偏曲是什么意思| 妈妈的表妹叫什么| 志气是什么意思| 字母圈是什么| 晚上做梦梦到蛇是什么意思| 9月28是什么星座| 吃什么东西增强免疫力| 额头上长痘是因为什么| 鼻子肿了又硬又疼是什么原因| 胆结石属于什么科| 长裙配什么鞋| 乳腺瘤是什么引起的| 透明人什么意思| 5月5是什么星座| 2001年属什么| 耳朵老是痒是什么原因| 脚上长鸡眼去医院挂什么科| bart是什么意思| 省公安厅厅长是什么级别| 心慌吃什么药能缓解| 唐宝是什么意思| 嗓子有痰是什么原因引起的| 谨记的意思是什么| xl代表什么尺码| 正常龟头什么样子| 静脉曲张吃什么中成药| 熠熠生辉什么意思| 感统失调挂什么科| 喉咙不舒服吃什么水果好| 2000年属什么生肖| 吃炒黑豆有什么好处和坏处| 养猫需要准备什么东西| 吃什么可以调理肠胃| 妇科炎症吃什么药| 根基是什么意思| 荠菜是什么菜| 手臂长斑是什么原因| 夏令时是什么| 98年是什么年| 8月出生的是什么星座| 狗狗生产需要准备什么| 怀孕周期是从什么时候开始算的| 2026年是什么生肖年| 其余是什么意思| 自然生化流产是什么意思| 婚检男性检查什么项目| 柠檬水什么时候喝最好| pvd是什么材料| 家里来猫是什么征兆| 谷丙转氨酶是什么意思| 猫怕什么动物| 二八佳人是什么意思| 天什么地| 室性期前收缩是什么意思| 门面是什么意思| 头发容易断是什么原因| 转是什么意思| 南冠指的是什么| 吃什么胎儿眼睛黑又亮| 补钙最好的食物是什么| 吃避孕药为什么要吃维生素c| 痹病是什么意思| ysl是什么意思| 九月八号是什么星座| 喉咙痛有什么好办法| 霉菌性阴道炎是什么引起的| 扶阳是什么意思| 此起彼落是什么意思| 凉皮加什么才柔软筋道| 什么是根管治疗牙齿| 幼儿急疹为什么不能碰水| 降压药什么时间吃最好| 急性胃肠炎用什么抗生素| 恩施玉露属于什么茶| 瓜蒌根为什么叫天花粉| 蓝莓对身体有什么好处| 看抑郁症挂什么科| 病危通知书意味着什么| 螨虫是什么样子的| 三什么九什么成语| 晚上剪指甲有什么禁忌| 八爪鱼是什么意思| 男女身份证号码有什么区分| 羊悬筋是什么样子图片| 男头发稀少适合什么发型| 人言可畏什么意思| 昆仑雪菊有什么作用| 宝宝拉肚子挂什么科| 三月初九是什么星座| 儿童割包皮挂什么科| 嵌合体是什么意思| 颈椎退行性病变是什么意思| 鲤鱼爱吃什么食物| 幽门螺旋杆菌吃什么药最好| 自然流产的症状是什么样的| 脑梗会引起什么症状| 坚果都有什么| 子宫内膜异位症有什么症状表现| 什么是靶向药| 长期拉肚子是什么原因| 老年人心慌是什么原因| 什么力气| 耳朵上有痣代表什么| 吃什么食物能降低胆固醇| 什么饮料解渴| 扁桃体发炎吃什么中成药| 举的部首是什么| 女人梦见蛇缠身是什么预兆| 角头是什么意思| hcd是什么意思| 壁虎在家里是什么征兆| dna由什么组成| 眼睛干涩模糊用什么药| 心肌炎用什么药治疗最好| 什么花能吃| gh是什么激素| 晨尿很黄是什么原因| 手上的三条线分别代表什么| 孕妇吃维生素c有什么好处| 什么名字最好听| 上海青是什么菜| 胃胀痛吃什么药| 606是什么意思| 拉风是什么意思| 一个女一个以念什么| 心动过缓是什么意思| 香皂和肥皂有什么区别| 女性外痔擦什么药膏好| 液基薄层细胞学检查是什么| sama是什么药| 幽灵蛛为什么不能打死| 为什么阴道会排气| 慢性浅表性胃炎是什么意思| 促排是什么意思| 巴基斯坦是什么语言| 女性做结扎手术对身体有什么危害| 吃了吐是什么原因| 提手旁的字与什么有关| 十月九号什么星座| 爬虫什么意思| 梦见吃酒席是什么预兆| 血虚吃什么中成药最好| 今天吃什么菜好呢| 蛇最怕什么药| 小孩子不吃饭是什么原因引起的| 耳朵痛吃什么药| 神经梅毒有什么症状| 百度

新闻中心

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

嚣张是什么意思

作者:嵌入式芯视野 时间:2025-08-04 来源:今日头条 收藏
百度 5、地市审核点下拉菜单为什么无显示内容?可能是省级管理机构未设置审核点,请联系当地人事考试机构进行设置后再进行操作。

在嵌入式开发中,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

评论


相关推荐

技术专区

关闭
黑莲花是什么意思 再生牙技术什么时候能实现 长期失眠吃什么药 甘薯是什么 私生子是什么意思
方圆脸适合什么发型 女人梦到小蛇什么预兆 儿童说话晚去医院挂什么科 别出心裁什么意思 脉压是什么意思
飞蛾吃什么 欧了是什么意思 嗓子发苦是什么原因 梦见下雪了是什么意思 你有一双会说话的眼睛是什么歌
十月十九是什么星座 头孢是治什么的 娃哈哈纯净水是什么水 奶奶的奶奶叫什么 暗财是什么意思
麻醉剂是什么hcv7jop9ns4r.cn 四个火读什么hcv8jop2ns7r.cn 雍正叫什么名字hcv9jop6ns2r.cn 火车不能带什么hcv8jop9ns5r.cn 什么肉好消化hcv9jop0ns7r.cn
减肥早餐吃什么好hcv8jop5ns1r.cn 脑干出血是什么原因造成的wuhaiwuya.com 良性反应性改变是什么意思bysq.com 沙眼是什么hcv9jop7ns4r.cn zw是什么意思hcv9jop7ns4r.cn
ccp抗体是什么意思hcv8jop3ns9r.cn 中午饭吃什么hcv8jop5ns7r.cn 皮疹用什么药hcv8jop9ns4r.cn 口苦什么原因hcv7jop9ns4r.cn 6.5号是什么星座hcv8jop3ns1r.cn
眼泡是什么意思jinxinzhichuang.com 陈皮有什么功效hcv7jop6ns5r.cn 法警是干什么的hcv8jop0ns1r.cn 脚抽筋是什么原因hcv9jop5ns6r.cn 一个提手一个京念什么huizhijixie.com
百度