STM32基础/读写内部flash

 STM32 读写内部 Flash 的详细过程:

一、STM32 内部 Flash 的基础知识

  1. 存储结构
    • STM32 的内部 Flash 通常被划分为多个扇区,不同型号的 STM32 芯片其 Flash 的容量和扇区大小各不相同。例如,STM32F103 系列的某些型号可能具有 128KB 或 256KB 的 Flash,扇区大小通常为 1KB 或 2KB 等。
  2. 地址范围
    • 内部 Flash 有其固定的地址范围,编程时需要根据芯片的数据手册来确定具体的地址范围。比如,STM32F103 系列的内部 Flash 起始地址通常为 0x08000000。

二、编程前的准备工作

  1. 开启相关时钟
    • 在操作内部 Flash 之前,需要确保 Flash 接口时钟已经开启。对于 STM32F103 系列,可以通过设置 RCC 寄存器来开启。例如:
RCC_APB2PeriphClockCmd(RCC_APB2Periph_FLASH, ENABLE);

三、写入数据到内部 Flash

  1. 解锁 Flash
    • 为了防止误操作,STM32 在对 Flash 进行写入操作之前需要先解锁。解锁操作通常需要按照特定的顺序向 FLASH_KEYR 寄存器写入两个特定的值。例如:
FLASH_Unlock();
  1. 擦除扇区
    • Flash 的写入操作只能将数据从 1 变为 0,而不能从 0 变为 1。因此,在写入新数据之前,如果扇区内有需要从 0 变为 1 的数据,就需要先对整个扇区进行擦除操作。擦除操作是按照扇区进行的,并且需要检查擦除操作是否完成。例如:
FLASH_ErasePage(Page_Address);
while (FLASH_GetStatus()!= FLASH_COMPLETE);

其中Page_Address是要擦除的扇区的起始地址。

  1. 写入数据
    • 擦除完成后,可以开始写入数据。写入操作是通过将数据按字(32 位)写入指定的 Flash 地址来实现的,并且需要检查写入操作是否完成。例如:
*(__IO uint32_t*)Address = Data;
while (FLASH_GetStatus()!= FLASH_COMPLETE);

其中Address是写入数据的目标地址,Data是要写入的 32 位数据。

  1. 锁定 Flash
    • 写入操作完成后,为了保证数据的安全性,需要对 Flash 进行锁定。例如:
FLASH_Lock();

四、从内部 Flash 读取数据

  1. 直接读取
    • 从内部 Flash 读取数据相对简单,只需要直接从指定的 Flash 地址读取数据即可。由于 Flash 是按字(32 位)进行读取的,因此需要根据数据的存储方式和地址对齐要求进行相应的处理。例如,如果要读取一个字节的数据,可以先按字读取,然后再进行字节提取。
uint32_t dataRead = *(__IO uint32_t*)readAddress;

其中readAddress是读取数据的起始地址。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值