STM32F030F4P6 Flash容量问题

本文探讨了STM32F030F4P6微控制器的Flash特性,发现其实际可用容量超出官方规格。尽管4~7Sector无法直接通过STLink下载程序,但仍可通过软件解锁进行读写。Keil调试时,即使选择16KB烧录,也会按32KB擦除,揭示了芯片潜在的额外存储空间。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

昨天读了一下手头常用的STM32F030F4P6的Flash,发现除了官方标定的0~3 Sector,4~7 Sector也可以正常的读写,但用STLink无法下载程序到该位置。
问了下老师,老师说可能030F4P6这个片子是降级片子,跟以前103RB(没记清)应该是同一情况。
虽然程序不能通过直接烧录的方式写进4~7 Sector,但在程序中可以通过解锁Flash来实现对其的修改。

有一件事很值得注意,我在Keil在线调试,选中 Erase Flash 参数后,写在4~7 Sector的数据也会被清除掉。
这说明即使在Keil选中16KB的烧录算法,但他实际上是按照32KB来进行擦除的。现在不清楚Keil使用STLink擦除MCU Flash的具体实现,所以也不太好说能否通过直接烧录的方式完全使用32KB的flash,但对于使用了IAP之类的开发人员,这个芯片的这种特性可以放入高达32KB的程序,实在是很令人惊喜。

### STM32F030F4P6 FLASH读写教程 对于STM32F030F4P6微控制器而言,在执行内部FLASH的读写操作前,需先完成特定初始化过程。具体来说,要向`FLASH_KEYR`寄存器写入解锁序列以便获得对`FLASH_CR`控制寄存器的操作权限[^1]。 #### 解锁Flash存储区 为了使能编程/擦除功能并允许更改闪存选项字节,必须遵循如下流程: - 向`FLASH_KEYR`寄存器连续两次写入指定键值:首先是`KEY1 (0x45670123)`,接着是`KEY2 (0xCDEF89AB)`。这一步骤确保了后续可以安全地修改闪存设置而不影响现有数据完整性。 ```c /* Unlock the Flash to enable the flash control register access */ __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_EOP | FLASH_FLAG_WRPERR | FLASH_FLAG_PGERR); HAL_FLASH_Unlock(); /* Write two keys into key registers */ FLASH->KEYR = 0x45670123; FLASH->KEYR = 0xCDEF89AB; ``` #### 配置与准备 利用HAL库简化开发工作流时,建议基于最新版驱动文件进行项目搭建,比如提到过的Keil.STM32F0xx_DFP.2.1.1版本[^2]。这样可以获得更稳定可靠的功能支持以及错误处理机制。 #### 编程或擦除扇区 一旦成功解锁后,则可根据需求选择相应API函数来进行单页或多页的数据更新或是整个扇区的内容清除动作。值得注意的是,默认情况下仅可访问前四个sector(即Sector 0至Sector 3),尽管某些特殊条件下能够触及更高地址范围内的sectors(如Sector 4到Sector 7),但这部分区域并不受标准工具链的支持用于常规应用程序部署[^3]。 ```c // Example of erasing a page and writing data using HAL library functions. uint32_t address = ADDR_FLASH_PAGE_1; /* Define target address here */ if(HAL_OK != HAL_FLASHEx_Erase(&eraseInitStruct, &PAGEError)) { // Error occurred while erase. } for(i=0;i<sizeof(aText)/sizeof(*aText);i++) { if(HAL_OK != HAL_FLASH_Program(TYPEPROGRAM_WORD,address,(uint32_t)aText[i])) { // Error occurred while writing data in Flash memory. } address += 4; } ``` 上述代码片段展示了如何通过调用`HAL_FLASHEx_Erase()`方法来抹去选定页面上的原有记录,并借助于`HAL_FLASH_Program()`接口逐个单元格填充新数值。 #### 结束操作 最后记得重新锁定Flash以防意外篡改重要参数,并清理任何可能存在的状态标志位。 ```c /* Lock the Flash to disable the flash control register access */ HAL_FLASH_Lock(); ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值