RYMCU

STM32篇——读写内部 FLASH

STM32 HAL 库读写内部 FLASH

1. 前期准备

安装好 STM32CubeMX

安装好 Clion

2. 创建项目

STM32 内部 FLASH 主要作用存储用户程序代码,多余的可以用来存储用户数据了。例如 FLASH 总大小为 128K,程序代码只用了 100K,剩下的 28K 可用来存储我们自己的数据了。内部 FLASH 的读写比较繁琐,需要特定的指令才能完成,本章讲解如何利用 HAL 库函数实现内部 FLASH 的读写。

3. 编辑代码

组合以下四个 HAL 库函数实现内部 FLASH 的读写:

HAL_FLASH_Lock();//解锁内部FLASH,允许读写
HAL_FLASH_Unlock();//锁定内部FLASH,禁止非授权的操作
HAL_FLASHEx_Erase();//擦除内部FLASH
HAL_FLASH_Program();//内部FLASH编程
  1. 编写内部 FLASH 写函数 FLASH_Inside_Wr()
/**
  * @brief 往内部FLASH写入数据
  * @param addr 写入地址
  * @param pdata 存储待写数据
  * @retval None
  */
void FLASH_Inside_Wr(uint32_t addr,uint32_t Pdata)
{
    //定义局部变量
    uint32_t PageError = 0;
    HAL_StatusTypeDef HAL_Status;
    //擦除配置信息结构体,包括擦除地址、方式、页数等
    FLASH_EraseInitTypeDef pEraseInit;
    pEraseInit.TypeErase = FLASH_TYPEERASE_PAGES;//按页擦除
    pEraseInit.PageAddress = addr;//擦除地址
    pEraseInit.NbPages = 1;//擦除页数量
    //step1 解锁内部FLASH,允许读写功能
    HAL_FLASH_Unlock();
    //step2 开始擦除addr对应页
    HAL_Status = HAL_FLASHEx_Erase(&pEraseInit,&PageError);//擦除
    if(HAL_Status != HAL_OK) printf("内部FlASH擦除失败!rn");
    //step3 写入数据
    HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD,addr,Pdata);
    //step4 锁定FLASH
    HAL_FLASH_Lock();
}

写入数据前,需解锁并擦除,如上代码所示。

  1. 编写内部 FLASH 读函数 FLASH_Inside_Rd()
/**
  * @brief 读取内部FLASH数据
  * @param addr 读取地址
  * @retval 读出的数据
  */
uint32_t FLASH_Inside_Rd(uint32_t addr)
{
    //定义局部变量
    uint32_t RdData = 0;
    //step1 解锁内部FLASH,允许读写功能
    HAL_FLASH_Unlock();
    RdData = *(__IO uint32_t *)addr;
    //step2 锁定FLASH
    HAL_FLASH_Lock();

    return RdData;
}

直接从内部地址读出数据即可。

4. 内部 FLASH 读写示例

main.c 中调用如下测试函数:

/**
  * @brief 内部FLASH读写测试
  */
void FLASH_Inside_Test(void)
{
    printf("rnrn------------------内部FLASH读写测试------------------rnrn");
    uint32_t addr = 0x08010000;//确保该地址内部FLASH是空余的!
    uint32_t WrData = 0x01234567;//待写入数据
    uint32_t RdData = 0;//存储读取数据

    printf("地址0x%x写入数据:0x%xrn",addr,WrData);
    FLASH_Inside_Wr(addr,WrData);//写入数据
    RdData = FLASH_Inside_Rd(addr);//读取数据
    printf("地址0x%x读出数据:0x%xrn",addr,RdData);
}

5. 编译下载

将程序编译下载至开发板,并将开发板连接至 PC,打开串口调试助手 RYCOM,并设置为:115200+8+N+1,接收结果如下。

6. 小结

本章学习了使用 HAL 库函数读写内部 FLASH

后发布评论