
STM32外设使用(九) Flash
发布日期:2021-05-13 00:01:59
浏览次数:17
分类:精选文章
本文共 2019 字,大约阅读时间需要 6 分钟。
一、简介
STM32芯片内部包含一个Flash存储器,主要用于存储代码。在项目开发阶段,通过编写应用程序并使用下载器,将编译后的代码文件烧录到内部Flash存储器中。由于Flash存储器具有非易失性特性,即使在断电后,运行时恢复时仍能从内部Flash加载并执行程序。
此外,STM32在运行状态下也支持对内部Flash存储器进行读写操作。如果内部Flash存储了完整应用程序且还有剩余空间,可以将其类似外部SPI-FLASH一样利用,存储运行时产生的需要电制保存的数据。相比之下,内部Flash的访问速度大大高于外部Flash,因此常用于紧急状态下关键记录存储。为了防止程序被盗用,有时会在第一次运行时添加加密 Region,并记录加密信息,最终删除加密代码。
二、STM32内部结构简介
STM32芯片的Flash存储器分为两部分:一部分用于存储系统内核及其配置,另一部分则为用户空间。用户空间Flash(USER_FLASH_BASE)通常提供了16 KB以上的空间,适用于存储用户程序。这一区域的擦除和编程操作需要通过专门的接口进行,需注意首先解锁Flash,然后选择合适的页面进行操作,最后再次上锁。
三、代码示例
以下示例展示了对Flash存储器进行半字节读写操作的方法:
// 半字节写操作void Write_Flash_HalfWord(u32 addr, u16 data) { FLASH_Unlock(); // 解锁Flash FLASH_ErasePage USER_FLASH_BASE; // 擦除指定页面 FLASH_ProgramHalfWord(addr, data); // 写入半字节数据 FLASH_Lock(); // 锁定Flash}// 半字节读操作u16 Read_Flash_HalfWord(u32 addr) { return *(u16*)addr;}// 大字节数组写入void Write_Flash_Array(u32 addr, u16* buf, u8 len) { u8 j = 0; FLASH_Unlock(); FLASH_ErasePage USER_FLASH_BASE; while (len--) { FLASH_ProgramHalfWord(addr, buf[j]); addr += 2; j++; } FLASH_Lock();}// 大字节数组读取void Read_Flash_Array(u32 addr, u16* buf, u8 len) { u8 j = 0; while (len--) { buf[j++] = *(u16*)addr; addr += 2; }}// 示例主函数int flash_test() { const u16 in_words[] = {0x0000, 0x1111, 0x2222, 0x3333, 0x4444, 0x5555, 0x6666, 0x7777, 0x8888, 0x9999}; u16 out_words[LEN]; Write_Flash_Array(USER_FLASH_BASE, in_words, LEN); while (true) { Read_Flash_Array(USER_FLASH_BASE, out_words, LEN); for (u8 i = 0; i < LEN; i++) { UART3_SendByte((u8)out_words[i]); } }}
此代码示例涵盖了Flash存储器的基本操作方法,包括擦除、读取和编程操作,适用于需要在芯片运行时对Flash存储器进行操作的场景。
四、遇到的问题与解决方法
Flash擦除不完全
- 问题描述:擦除操作中未完全擦除某页面。
- 解决方法:确保擦除操作覆盖所有需要清除的区域,或使用擦除全区功能。
Flash编程失败
- 原因:正确的上锁、解锁操作未执行。
- 解决:检查Flash状态,确保已解锁后再进行操作。
闪存容量不足
- 问题:项目需求导致Flash存储器空间不足。
- 解决:在设计阶段预留足够的空间,或使用外部存储扩展。
加密存储方案失败
- 原因:加密Key的存储或加密算法实现错误。
- 解决:重新设计加密方案,确保Key存储位置正确且加密算法可靠。
以上文本经过优化,您可以将其应用于技术文档或博客,内容结构清晰,便于搜索引擎理解。
发表评论
最新留言
留言是一种美德,欢迎回访!
[***.207.175.100]2025年04月28日 03时42分53秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
关于JS中的内存溢出与内存泄漏
2019-03-09
JS实现防抖与节流(使用按钮触发事件)
2019-03-09
React 学习笔记 —— refs 属性的三种书写方式
2019-03-09
CCF 模拟2-1 夏令营
2019-03-09
第八届蓝桥杯——杨辉三角
2019-03-09
算法训练——字符串合并
2019-03-09
信息学奥赛一本通【题目索引 + 解答】
2019-03-09
什么时候需要重写HashCode()
2019-03-09
2021-04-23
2019-03-09
Linux编程基础之创建两个子进程而不创建孙子进程
2019-03-09
hadoop 分布式文件系统的计算和高可用
2019-03-09
【Linux】VMware Workstation 不可恢复错误: (vcpu-0)
2019-03-09
VS中 fatal error LNK1123: 转换到 COFF 期间失败 的解决方法
2019-03-09
关于Img标签在固定宽高的容器内部以图片比例缩放存在
2019-03-09
pyhton---异常处理的终极语法、网页访问基本读取、网页访问异常处理
2019-03-09
linux下编程出现 对'sem_wait'未定义的引用解决方案
2019-03-09
ant design pro v5去掉右边content区域的水印
2019-03-09
web_求和(练习)
2019-03-09
JavaScript——使用iterator遍历迭代map,set集合元素
2019-03-09