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存储位置正确且加密算法可靠。

  • 以上文本经过优化,您可以将其应用于技术文档或博客,内容结构清晰,便于搜索引擎理解。

    上一篇:《c语言深度剖析》读书笔记(一)关键字
    下一篇:Keil 查看文件路径的方法

    发表评论

    最新留言

    留言是一种美德,欢迎回访!
    [***.207.175.100]2025年04月28日 03时42分53秒