STM32F4–Flash读写操作

一般在代码调节参数时,比如在调PID的时候,如果每次改参数就重新烧写代码就十分的麻烦。我们可以利用stm32内部flash的读写功能,实现数据保存。

可以从数据手册中查找Flash内存地址

可以看到F4的主存储器基地址位0x0800 0000,有12个扇区,我们可以在头文件中宏定义这些扇区。

flash.h

#ifndef _flash_H
#define _flash_H#include "stm32f4xx.h"#define  TEST_ERROR    -1
#define  TEST_SUCCESS  0 #define DATA_FLASH_SAVE_NUM 2   //存储数据个数#define FLASH_SAVE_ADDR  ADDR_FLASH_SECTOR_4    //扇区有64kb的大小 一般寸几个数据已经足够
//FLASH 扇区的起始地址
#define ADDR_FLASH_SECTOR_0     ((u32)0x08000000)   //扇区0起始地址, 16 Kbytes
#define ADDR_FLASH_SECTOR_1     ((u32)0x08004000)   //扇区1起始地址, 16 Kbytes
#define ADDR_FLASH_SECTOR_2     ((u32)0x08008000)   //扇区2起始地址, 16 Kbytes
#define ADDR_FLASH_SECTOR_3     ((u32)0x0800C000)   //扇区3起始地址, 16 Kbytes
#define ADDR_FLASH_SECTOR_4     ((u32)0x08010000)   //扇区4起始地址, 64 Kbytes
#define ADDR_FLASH_SECTOR_5     ((u32)0x08020000)   //扇区5起始地址, 128 Kbytes
#define ADDR_FLASH_SECTOR_6     ((u32)0x08040000)   //扇区6起始地址, 128 Kbytes
#define ADDR_FLASH_SECTOR_7     ((u32)0x08060000)   //扇区7起始地址, 128 Kbytes
#define ADDR_FLASH_SECTOR_8     ((u32)0x08080000)   //扇区8起始地址, 128 Kbytes
#define ADDR_FLASH_SECTOR_9     ((u32)0x080A0000)   //扇区9起始地址, 128 Kbytes
#define ADDR_FLASH_SECTOR_10    ((u32)0x080C0000)   //扇区10起始地址,128 Kbytes
#define ADDR_FLASH_SECTOR_11    ((u32)0x080E0000)   //扇区11起始地址,128 Kbytes  uint16_t STMFLASH_GetFlashSector(u32 addr);  void write_to_flash(void);
void read_from_flash(void);         void read_flash(uint16_t *FlashReadBuf);
int write_flash(uint16_t *FlashWriteBuf);#endif

flash.c

#include "flash.h"uint16_t write_data[DATA_FLASH_SAVE_NUM];
uint16_t read_data[DATA_FLASH_SAVE_NUM];//通过地址获取扇区位置
uint16_t STMFLASH_GetFlashSector(u32 addr)
{if(addr<ADDR_FLASH_SECTOR_1)return FLASH_Sector_0;else if(addr<ADDR_FLASH_SECTOR_2)return FLASH_Sector_1;else if(addr<ADDR_FLASH_SECTOR_3)return FLASH_Sector_2;else if(addr<ADDR_FLASH_SECTOR_4)return FLASH_Sector_3;else if(addr<ADDR_FLASH_SECTOR_5)return FLASH_Sector_4;else if(addr<ADDR_FLASH_SECTOR_6)return FLASH_Sector_5;else if(addr<ADDR_FLASH_SECTOR_7)return FLASH_Sector_6;else if(addr<ADDR_FLASH_SECTOR_8)return FLASH_Sector_7;else if(addr<ADDR_FLASH_SECTOR_9)return FLASH_Sector_8;else if(addr<ADDR_FLASH_SECTOR_10)return FLASH_Sector_9;else if(addr<ADDR_FLASH_SECTOR_11)return FLASH_Sector_10; return FLASH_Sector_11;
}//将数据写入内存 16位数据
int write_flash(uint16_t *FlashWriteBuf)
{uint32_t StartAddr;StartAddr = FLASH_SAVE_ADDR;FLASH_Unlock();    //解锁FLASH_ClearFlag(FLASH_FLAG_EOP | FLASH_FLAG_OPERR | FLASH_FLAG_WRPERR | FLASH_FLAG_PGAERR | FLASH_FLAG_PGPERR|FLASH_FLAG_PGSERR);if (FLASH_COMPLETE != FLASH_EraseSector(STMFLASH_GetFlashSector(StartAddr),VoltageRange_2)) //擦除扇区内容{     return TEST_ERROR;}for (int i = 0; i < DATA_FLASH_SAVE_NUM; i++){if (FLASH_COMPLETE != FLASH_ProgramHalfWord(StartAddr, FlashWriteBuf[i]))   //写入16位数据{          return TEST_ERROR;}StartAddr += 2;    //16位数据偏移两个位置}FLASH_Lock(); //上锁return TEST_SUCCESS;
}//从内存读数据 16位数据
void read_flash(uint16_t *FlashReadBuf)
{uint32_t StartAddr = FLASH_SAVE_ADDR;for (int i = 0; i < DATA_FLASH_SAVE_NUM; i++){FlashReadBuf[i] = *(__IO uint16_t*)StartAddr;StartAddr += 2;}
}void write_to_flash(void)
{memset(write_data, 0, sizeof(write_data));/*//这里就可以写入一些参数 如kp、kiwrite_data[0] = kp;write_data[1] = ki;*/if(TEST_SUCCESS!=write_flash(write_data))   return;  //写入错误}void read_from_flash(void)
{memset(read_data, 0, sizeof(read_data));read_flash(read_data);/*//这里读取数据kp = read_data[0];ki = read_data[1];*/
}

main.c

#include "stm32f4xx.h"
#include "delay.h"
#include "flash.h"int main(void)
{//...read_from_flash();    //这个函数必须在执行一次 write_to_flash() 后在加入这行,否则可能读取到内存一些不正常的数据//...while (1){//...write_to_flash();  //可在修改完参数后执行//...}
}
//每次重新启动32后,参数数据就是从内存读取的数据

STM32F4—Flash读写相关推荐

  1. STM32F4系列 HAL Flash 读写

    前言 注意:F0F1系列和F4系列的Flash读写操作不相同 一.STM32CubeMX怎么查看芯片的Flash分布? 二.擦除F4系列Flash 本例程使用的是F411CEU6的型号芯片 1.擦除F ...

  2. 单片机编程php,STC单片机内部FLASH读写程序(最新整理)

    <STC单片机内部FLASH读写程序(最新整理)>由会员分享,可在线阅读,更多相关<STC单片机内部FLASH读写程序(最新整理)(6页珍藏版)>请在人人文库网上搜索. 1.S ...

  3. stm32 Flash读写[库函数]

    stm32 的内置可编程Flash在许多场合具有十分重要的意义.如其支持ICP特性使得开发人员对stm32可以警醒调试开发,可以通过JTAG和SWD接口对stm32进行程序烧写:支持IAP特性使得开发 ...

  4. NAND FLASH读写原理

    NAND FLASH读写原理 一.结构分析  S3C2410处理器集成了8位Nand Flash控制器.目前市场上常见的8位NandFlash有三星公司的k9f1208.k9f1g08.k9f2g08 ...

  5. 模拟NAND FLASH 读写BCH ECC校验

    一.模拟NAND FLASH 读写BCH ECC校验 将内核源码里的bch校验程序分离出来,从而可以手动修改原始数据和bch校验码,达到模拟出错纠正过程. 源码 bch.c.bch.h.types.h ...

  6. NAND FLASH 读写操作 简介

    NAND FLASH 内存详解与读写寻址方式 一.内存详解 NAND闪存阵列分为一系列128kB的区块(block),这些区块是 NAND器件中最小的可擦除实体.擦除一个区块就是把所有的位(bit)设 ...

  7. 通过mtd读写flash_NOR Flash读写原理及驱动

    本文主要是关于NOR Flash的相关介绍,并着重对NOR Flash读写原理及驱动进行了详尽的阐述. NOR Flash NOR Flash是现在市场上两种主要的非易失闪存技术之一.Intel于19 ...

  8. flash读写导致死机问题分析

    有个项目需要将原NXP1766芯片移植到国民N32芯片中,但是移植过程会出现死机现象.记录下分析过程. 1.现象分析 当PC发送通信申请命令后,STM32动态申请内存空间存储数据并进行处理: 当出现死 ...

  9. 瑞萨e2studio(15)----Code FlashData Flash读写

    瑞萨e2studio.15--Code Flash&Data Flash读写 概述 硬件准备 新建工程 工程模板 保存工程路径 芯片配置 工程模板选择 FLASH配置 FLASH属性配置 设置 ...

最新文章

  1. SAP PM入门系列30 - IW39 Display Orders
  2. eclipse 插件,直接打开文件路径
  3. 历年计算机一级考试题库及答案,全国计算机一级考试试题库及答案
  4. 生产环境elasticsearch5.0.1和6.3.2集群的部署配置详解
  5. Android两个tab吸顶,Android scrollView和viewpager嵌套 指示器吸顶 根据viewpager每
  6. C++ static静态成员函数
  7. oracle的.aud文件,Oracle 11g 在audit_file_dest目录下产生大量的aud文件
  8. 管理感悟:维护每日工作列表
  9. CentOS 安装SVN客户端
  10. Spring四个核心包
  11. Linux Debian11 Podman容器常用命令
  12. FFmpeg flv视频如何转出mp3格式
  13. Java mybatis-plus详解
  14. idapython 手册
  15. 别惊讶,我真的不建议你考华为认证,点进来看原因~
  16. pdo mysql 教程_PDO入门教程
  17. vue+elemnt ul 图片上传隐藏按钮+图片回显
  18. 刘东明应邀赴台湾担任金手指网络奖终审评委
  19. 人流量统计api接口_人数统计_区域人数实时统计
  20. 舒亦梵:4.24非农周即将来临,作为投资者的你做好准备了吗

热门文章

  1. 拼多多直通车推广做好关键性的一步:商品标题如何引流?
  2. Android远程桌面助手(B1309)
  3. 117. 请简述文本文件和二进制文件的区别
  4. 一个故事带你了解集线器、交换机与路由器
  5. JAVA类运行时,报错“Error occurred during initialization of boot layer”
  6. 域名解析ip地址的过程
  7. 相关子查询和不相关子查询
  8. 详解联通无线上网资费:
  9. [已授权] 互联网定位技术小谈
  10. 蓝牙调试器 接收处理 hc-05蓝牙上传数据