STM32用HAL库写内部FLASH

本文介绍了如何使用STM32的HAL库进行内部FLASH的操作,包括为何选择FLASH存储、写入流程、注意事项以及关键的HAL库函数,如解锁、上锁、擦除和写入数据的步骤。强调了写入数据前需先擦除页,并提到了页的大小和Flash的空间分布检查。
摘要由CSDN通过智能技术生成

介绍使用HAL库对内部FLASH进行写操作

1、为什么要用FLASH存Code:FLASH有掉电保护功能

在这里插入图片描述

主存储器:存放代码和数据常量,平时说的芯片内部FLASH的大小就是指的主存储器的大小。起始地址0x08000000,Boot0、Boot1都接GND时从0x08000000开始运行代码
启动程序代码:存储ST自带的启动程序,用来通过串口下载代码。Boot0接3.3V,Boot1接GND时运行这里面的代码
用户选项字节区:配置Flash读写保护、复位、看门狗等功能,共16字节,由选项控制寄存器控制
接口寄存器:整个FLASH的控制机构

说起Flash肯定会提到扇区、页,其实页就是扇区。页的大小要在《STM32F10x闪存编程参考手册》里找。STM32F10x有256页,每页2KB。

向Flash写数据前必须先将页擦除,因为Flash只能将1置0不能把0置1。页为最小擦除单位。擦除后为0xFFFF…。

2、对内部Flash的写入流程

在这里插入图片描述

3、写FLASH时要注意不应覆盖原有的数据,所以要看好空间分布

查看工程空间分布:Keil的一般编译后在目录里的Listing文件中的.map文件里,翻到后面出现 “Memory Map of the image”
如下,ROM区域的内容就是Flash内的代码,Base是基地址

某工程的 ROM 存储器分布映像

Memory Map of the image  //存储分布映像

  Image Entry point : 0x08000131
/* 程序 ROM 加载空间 */
  Load Region LR_IROM1 (Base: 0x08000000, Size: 0x0000124c, Max: 0x00010000, ABSOLUTE)
/* 程序 ROM 执行空间 */
    Execution Region ER_IROM1 (Exec base: 0x08000000, Load base: 0x08000000, Size: 0x0000123c, Max: 0x00010000, ABSOLUTE)
/* 地址分布列表 */
    Exec Addr    Load Addr    Size         Type   Attr      Idx    E Section Name        Object

    0x08000000   0x08000000   0x00000130   Data   RO            3    RESET               startup_stm32f103xe.o
    0x08000130   0x08000130   0x00000000   Code   RO         1758  * .ARM.Collect$$$$00000000  mc_w.l(entry.o)
    0x08000130   0x08000130   0x00000004   Code   RO         1765    .ARM.Collect$$$$00000001  mc_w.l(entry2.o)
    0x08000134   0x08000134   0x00000004   Code   RO         1768    .ARM.Collect$$$$00000004  mc_w.l(entry5.o)
    0x08000138   0x08000138   0x00000000   Code   RO         1770    .ARM.Collect$$$$00000008  mc_w.l(entry7b.o)
    0x08000138   0x08000138   0x00000000   Code   RO         1772    .ARM.Collect$$$$0000000A  mc_w.l(entry8b.o)
    0x08000138   0x08000138   0x00000008   Code   RO         1773    .ARM.Collect$$$$0000000B  mc_w.l(entry9a.o)
    0x08000140   0x08000140   0x00000004   Code   RO         1780    .ARM.Collect$$$$0000000E  mc_w.
HAL库(Hardware Abstraction Layer,硬件抽象层)是STM32CubeMX的一部分,它提供了一种标准化的方式来访问STM32微控制器的各种功能,包括读内部闪存。在STM32F4系列中,内部Flash通常用于存储程序代码、配置数据等。 以下是使用STM32CubeMX和HAL库通过代码来操作内部Flash的基本步骤: 1. **初始化**: 首先,在你的C代码中,需要包含相关的HAL库头文件,并初始化HAL库,例如 `stm32f4xx_hal_flash.h` 和 `stm32f4xx_hal_flash_ex.h`。 ```c #include "stm32f4xx_hal_flash.h" ... HAL_Init(); FLASH年由HAL_FLASH_Init()函数初始化; ``` 2. **选择Flash分区**: STM32F4有多种Flash分区,如Program Flash、Option Bytes等。你需要明确你要操作的是哪一块分区,比如使用`FLASH分区管理结构体`,如`FLASH分区结构体` (FLASH分区结构体)。 ```c FLASH分区_t flash分区; flash分区.Address = FLASH_REGION_1; // 设置分区地址 ``` 3. **擦除**: 使用`HAL_FLASH erased_ranges`函数选择要擦除的范围并执行擦除操作。 ```c FLASH_EraseOptionsTypeDef erase_options; erase_options.TypeOfOperation = FLASH_TYPEERASE; erase_options.EraseAllPages = ENABLE; HAL_FLASHEx_Erase(&flash分区, &erase_options); ``` 4. **编程**: 使用`HAL_FLASH_Program`函数将数据Flash。 ```c uint8_t data[] = {0x01, 0x02, 0x03}; // 数据字节数组 HAL_FLASH_Program(FLASH_WRITE, flash分区.Address, 0, sizeof(data), data); ``` 5. **等待操作完成**: 对于一些长时间的操作(如擦除),可能会有延时或确认请求,可以使用`HAL_Delay`等待或检查操作状态。 6. **处理异常**:记得捕获和处理可能出现的错误,比如`HAL_StatusTypeDef status = HAL_FLASHEx_WaitForLastOperationUntilEnd()`。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值