STM32系列单片机的内部FLASH(闪存)是其重要组成部分,用于存储程序代码和部分配置数据。以下是对其功能及应用的详解:
1. 内部FLASH的特点
- 类型:STM32使用NOR型闪存,具有快速读取速度和可靠性。
- 容量范围:从数十KB到数MB不等,视不同型号(如STM32F0、STM32F4、STM32H7系列)。
- 分块结构:通常划分为多个扇区(Sector)或页(Page),支持独立擦除与写入。
- 访问时间:一般支持零等待状态访问(Zero Wait State),但在高频率工作时可能需要配置等待周期。
- 耐久性:写/擦除循环次数通常为1万次(10k)至10万次(100k)。
2. 内部FLASH的操作
- 写入数据:
- 写入前需要擦除目标扇区。
- 使用内置的编程接口或片上Bootloader进行数据写入。
- 擦除操作:
- 按扇区或整片擦除(对大数据量更新更高效)。
- 擦除操作通常较慢,受限于FLASH特性。
- 读操作:
- 直接读取内存映射地址,速度快,通常不需要额外操作。
示例:FLASH写入伪代码
HAL_FLASH_Unlock(); // 解锁FLASH控制器
FLASH_EraseInitTypeDef EraseInit;
EraseInit.TypeErase = FLASH_TYPEERASE_SECTORS;
EraseInit.Sector = FLASH_SECTOR_2;
EraseInit.NbSectors = 1;
uint32_t SectorError = 0;
HAL_FLASHEx_Erase(&EraseInit, &SectorError); // 擦除扇区
HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD, Address, Data); // 写入数据
HAL_FLASH_Lock(); // 重新锁定
3. FLASH的分区与用途
- 主存储区:存储主程序代码。
- 系统存储区:
- 固定区域,用于内置Bootloader。
- 支持UART、SPI、CAN等多种接口加载程序。
- 保护机制:
- 读保护(RDP):防止非法读取。
- 写保护:防止重要代码被误写或擦除。
- ECC校验:高端系列支持,用于检测/纠正存储错误。
4. 应用与注意事项
- 固件升级:内部FLASH常被用作Bootloader和应用区,支持在线升级(OTA)。
- 数据存储:
- 可用部分扇区存储用户配置数据。
- 为延长寿命,建议实现磨损均衡(Wear Leveling)。
- 性能优化:
- 使用预取缓冲区(Prefetch Buffer)提高读取速度。
- 避免频繁写擦操作,尤其是在寿命敏感应用中。
5. 常见问题及解决方法
- 写入失败:
- 检查是否解锁FLASH控制器。
- 确认写入地址是否对齐(一般按字或半字对齐)。
- 保护触发:
- 解除RDP或重新配置扇区写保护。
- 意外中断:
- 写/擦期间需禁用全局中断或仅允许安全中断。
STM32的FLASH特性和操作因系列差异较大,建议结合ST官方文档和参考手册获取具体型号的详细信息。
发布者:myrgd,转载请注明出处:https://www.object-c.cn/4567