STM32·

STM32篇——读写内部 FLASH

ronger

ronger

5971 0

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擦除失败!\r\n");
    //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("\r\n\r\n------------------内部FLASH读写测试------------------\r\n\r\n");
    uint32_t addr = 0x08010000;//确保该地址内部FLASH是空余的!
    uint32_t WrData = 0x01234567;//待写入数据
    uint32_t RdData = 0;//存储读取数据

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

5. 编译下载

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

6. 小结

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

所属系列

从当前文章继续阅读它所在合集中的前后内容。

关于我和 Hugh 学嵌入式开发这件事 —— STM32 篇 第 11 / 17 篇
查看合集

> 本作品集内教程基于 [Hugh](https://rymcu.com/user/hugh) 的创作基础上进行修订发布 关于我和 Hugh 学嵌入式开发这件事

相关文章

优先推荐同专题、同标签和同作者内容,补足热门文章。

评论 0

登录 后参与评论

评论

成为第一个评论的人