当前位置:首页 > 嵌入式 > 嵌入式分享
[导读]在嵌入式产品开发中,将关键信息(如序列号、版本号、配置参数)固化到Flash的指定地址是常见的需求。本文以STM32系列MCU为例,介绍如何在0x08030000地址写入4字节数据0x11 0x22 0x33 0x44的实现方法,其他品牌MCU原理类似但API存在差异。


在嵌入式产品开发中,将关键信息(如序列号、版本号、配置参数)固化到Flash的指定地址是常见的需求。本文以STM32系列MCU为例,介绍如何在0x08030000地址写入4字节数据0x11 0x22 0x33 0x44的实现方法,其他品牌MCU原理类似但API存在差异。


一、Flash写入基础原理

MCU Flash存储器具有以下特性:


页编程限制:通常以页(如256字节)为单位擦除,但可按字节/字写入

对齐要求:写入地址需满足特定对齐(如32位对齐)

写保护机制:部分区域受保护,需先解锁

写入次数限制:通常1万-10万次,需避免频繁擦写

二、关键实现步骤(以STM32 HAL库为例)

1. 解锁Flash控制寄存器

c

#include "stm32f4xx_hal.h"  // 根据型号选择正确头文件


void Flash_Unlock(void) {

   HAL_FLASH_Unlock();  // 解锁主存储区

   // 若需操作选项字节等特殊区域,还需调用额外解锁函数

}

2. 擦除目标区域(必要时)

c

FLASH_EraseInitTypeDef eraseInit;

uint32_t sectorError;


bool Flash_Erase(uint32_t address) {

   // 计算扇区号(以STM32F4为例,0x08030000位于Sector11)

   uint32_t sector = FLASH_SECTOR_11;

   

   eraseInit.TypeErase = FLASH_TYPEERASE_SECTORS;

   eraseInit.Sector = sector;

   eraseInit.NbSectors = 1;

   eraseInit.VoltageRange = FLASH_VOLTAGE_RANGE_3; // 3.3V供电

   

   return HAL_FLASHEx_Erase(&eraseInit, &sectorError) == HAL_OK;

}

3. 写入数据到指定地址

c

bool Flash_Write(uint32_t address, uint32_t data) {

   // 检查地址对齐(32位写入需4字节对齐)

   if(address % 4 != 0) return false;

   

   HAL_StatusTypeDef status = HAL_FLASH_Program(

       FLASH_TYPEPROGRAM_WORD,  // 32位写入

       address,

       data

   );

   

   // 验证写入结果

   uint32_t readData = *(__IO uint32_t*)address;

   return (status == HAL_OK) && (readData == data);

}

4. 完整操作示例

c

int main(void) {

   uint32_t targetAddr = 0x08030000;

   uint32_t dataToWrite[4] = {0x11223344, 0x55667788, ...}; // 示例数据

   

   Flash_Unlock();

   

   // 擦除目标扇区(首次写入时需要)

   if(!Flash_Erase(targetAddr)) {

       // 错误处理

   }

   

   // 写入数据(分多次32位写入)

   for(int i=0; i<4; i++) {

       if(!Flash_Write(targetAddr + i*4, dataToWrite[i])) {

           // 错误处理

       }

   }

   

   HAL_FLASH_Lock(); // 重新上锁

   while(1);

}

三、工程化注意事项

地址计算:不同MCU的Flash扇区划分不同,需参考参考手册

中断处理:Flash操作期间建议禁用中断

电源稳定性:确保供电稳定,避免写入过程断电

校验机制:建议增加CRC校验确保数据完整性

生产工具链:可通过J-Flash等工具配合脚本实现自动化写入

四、替代方案对比

方案 优点 缺点

直接编程 无需额外工具,灵活性强 需处理底层细节,易出错

IAP升级 支持现场更新 需要预留Bootloader区域

专用编程器 可靠高效,适合大批量生产 需要额外硬件投入

实际项目中,建议结合产品生命周期选择方案:研发阶段采用直接编程,量产阶段使用专用编程器,售后阶段考虑IAP升级。对于简单的出厂数据写入,本文介绍的直接编程方法是最经济高效的选择。

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读
关闭