32FLASH闪存

目录

一.FLASH简介

二.代码实现

(1)读写内部FLASH

(2)读取芯片ID


一.FLASH简介

存储器地址要记得累

系统存储器是原厂写入的Bootloader程序(用于串口下载),是不允许修改的

闪存存储器接口是外设,用于管理FLASH

OTA,程序升级

IAP:自定义一个Bootloader在FLASH中,当需要更新程序时,就从程序代码跳转到Bootloader,接收程序更新数据然后覆盖原程序,重新再跳回到原程序

整个升级过程,都可以自主完成

 

 整块擦除,信息块的内容不受影响

FPEC会自动计算反码

 

 在编程过程中,任何读写闪存的操作都会使CPU暂停,会导致中断函数执行的暂停

当闪存保护选项由“保护”变为“未保护”时,会自动执行整片擦除

二.代码实现

void FLASH_Unlock(void);//解锁
void FLASH_Lock(void);//加锁FLASH_Status FLASH_ErasePage(uint32_t Page_Address);//擦除某一页,返回状态
FLASH_Status FLASH_EraseAllPages(void);//全擦除
FLASH_Status FLASH_EraseOptionBytes(void);//擦除选项字节
FLASH_Status FLASH_ProgramWord(uint32_t Address, uint32_t Data);
FLASH_Status FLASH_ProgramHalfWord(uint32_t Address, uint16_t Data);
//选项字节的写入
FLASH_Status FLASH_ProgramOptionByteData(uint32_t Address, uint8_t Data);自定义的Data0和1
FLASH_Status FLASH_EnableWriteProtection(uint32_t FLASH_Pages);写保护
FLASH_Status FLASH_ReadOutProtection(FunctionalState NewState);读保护
FLASH_Status FLASH_UserOptionByteConfig(uint16_t OB_IWDG, uint16_t OB_STOP, uint16_t OB_STDBY);用户选项的配置位操作返回的状态
typedef enum
{ FLASH_BUSY = 1,忙FLASH_ERROR_PG,编程错误FLASH_ERROR_WRP,写保护错误FLASH_COMPLETE,FLASH_TIMEOUT等待超时
}FLASH_Status;uint32_t FLASH_GetUserOptionByte(void);//获取用户选项的3个配置位
uint32_t FLASH_GetWriteProtectionOptionByte(void);//获取写保护状态
FlagStatus FLASH_GetReadOutProtectionStatus(void);//获取读保护状态
FlagStatus FLASH_GetPrefetchBufferStatus(void);//获取预取缓冲区状态
void FLASH_ITConfig(uint32_t FLASH_IT, FunctionalState NewState);
FlagStatus FLASH_GetFlagStatus(uint32_t FLASH_FLAG);
void FLASH_ClearFlag(uint32_t FLASH_FLAG);
FLASH_Status FLASH_GetStatus(void);//获取状态
FLASH_Status FLASH_WaitForLastOperation(uint32_t Timeout);//等待上一次操作,等待BUSY为0

(1)读写内部FLASH

MyFLASH.c

#include "stm32f10x.h"                  // Device header
uint32_t MyFLASH_ReadWord(uint32_t Address)
{return *((__IO uint32_t *)(Address));//这里的括号逻辑要规范
}
uint16_t MyFLASH_ReadHalfWord(uint32_t Address)//在32中地址永远是32位的
{return *((__IO uint16_t *)(Address));
}
uint8_t MyFLASH_ReadByte(uint32_t Address)
{return *((__IO uint8_t *)(Address));
}
void MyFLASH_EraseAllPages(void)
{FLASH_Unlock();FLASH_EraseAllPages();FLASH_Lock();
}
void MyFLASH_ErasePages(uint32_t Address)
{FLASH_Unlock();FLASH_ErasePage(Address);FLASH_Lock();
}
void MyFLASH_ProgramWord(uint32_t Address,uint32_t Data)
{FLASH_Unlock();FLASH_ProgramWord(Address,Data);FLASH_Lock();
}
void MyFLASH_ProgramHalfWord(uint32_t Address,uint16_t Data)
{FLASH_Unlock();FLASH_ProgramHalfWord(Address,Data);FLASH_Lock();}

 Store.c

#include "stm32f10x.h"                  // Device header
#include "MyFLASH.h"   
#define STORE_START_ADDRESS     0x0800FC00
#define STORE_COUNT             512
//利用SRAM缓存数组来管理FLASH的最后一页
uint16_t Store_Data[STORE_COUNT];//512个数据每个数据16位,2个字节,对应闪存的一页1024字节
void Store_Init(void)
{uint16_t  i;//下面的地址一定要写对,查了半天if(MyFLASH_ReadHalfWord(STORE_START_ADDRESS) != 0xA5A5)//规定标志位,判断是否第一次读写该页{MyFLASH_ErasePages(STORE_START_ADDRESS);MyFLASH_ProgramHalfWord(STORE_START_ADDRESS,0xA5A5);for(i = 1;i<STORE_COUNT;i++){MyFLASH_ProgramHalfWord(STORE_START_ADDRESS + i*2,0x0000);}}for(i = 0;i<STORE_COUNT;i++){Store_Data[i] = MyFLASH_ReadHalfWord(STORE_START_ADDRESS + i*2);}}
void Store_Save(void)
{uint16_t  i;MyFLASH_ErasePages(STORE_START_ADDRESS);for(i = 0;i<STORE_COUNT;i++){MyFLASH_ProgramHalfWord(STORE_START_ADDRESS + i*2,Store_Data[i]);}	
}
void Store_Clear(void)
{uint16_t  i;for(i = 1;i<STORE_COUNT;i++)//这里不要将标志位清零{Store_Data[i] = 0x0000;}Store_Save();//保证数组和闪存数据一样
}

 main.c

#include "stm32f10x.h"                  // Device header
#include "Delay.h"  
#include "OLED.h" 
#include "Store.h" 
#include "Key.h" 
uint8_t Num;
int main()
{Key_Init();OLED_Init();Store_Init();OLED_ShowString(1,1,"Flag:");OLED_ShowString(2,1,"Data:");Store_Save();while(1){Num = Keynum();if(Num == 1){Store_Data[1] ++;Store_Data[2] +=2;Store_Data[3] +=3;Store_Data[4] +=4;Store_Save();}else if (Num == 2){Store_Clear();}OLED_ShowHexNum(1,6,Store_Data[0],4);OLED_ShowHexNum(3,1,Store_Data[1],4);OLED_ShowHexNum(3,6,Store_Data[2],4);OLED_ShowHexNum(4,1,Store_Data[3],4);OLED_ShowHexNum(4,6,Store_Data[4],4);}	
}

注:

使用完

要记得断开连接,避免STM32被占用,keil无法下载程序

小端模式存储:低位字节存储在低位地址

OLED有显存,可以保存最后一次显示的内容

页擦除后,程序损坏,也没有办法自动运行

 

前3个数相加得到的就是程序占用闪存的大小

后两个数相加得到的就是占用SRAM的大小

(2)读取芯片ID

#include "stm32f10x.h"                  // Device header
#include "Delay.h"  
#include "OLED.h" 
int main()
{OLED_Init();OLED_ShowString(1,1,"FSIZE:");OLED_ShowHexNum(1,7,*((__IO uint16_t *)(0x1FFFF7E0)),4);//存储器时16位的OLED_ShowString(2,1,"UID:");OLED_ShowHexNum(2,5,*((__IO uint16_t *)(0x1FFFF7E8)),4);//存储器可以以半字,字,字节读取OLED_ShowHexNum(2,11,*((__IO uint16_t *)(0x1FFFF7E8+0x02)),4);//要加上地址偏移OLED_ShowHexNum(3,1,*((__IO uint32_t *)(0x1FFFF7E8+0x04)),8);//OLED_ShowHexNum(4,1,*((__IO uint32_t *)(0x1FFFF7E8+0x08)),8);//while(1){}	
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/694199.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

04.结构体和结构体数组

1.结构体 struct stu{int id;string name;float grade; };2.结构体数组的排序 sort算法如果是非自定义类型可以缺省&#xff0c;默认升序排序&#xff0c;但自定义类型必须自己重写比较规则&#xff0c;因为系统没法知道你怎么比较 sort(首元素地址&#xff0c;尾元素下一位…

Python 写网络监控

大家好&#xff01;我是爱摸鱼的小鸿&#xff0c;关注我&#xff0c;收看每期的编程干货。 网络监控是保障网络可靠性的一项重要任务。通过实时监控网络性能&#xff0c;我们可以及时发现异常&#xff0c;迅速采取措施&#xff0c;保障网络畅通无阻。本文将以 Python为工具&…

Debug系列 GroupNorm和BatchNorm出现Nan或inf的情况

Debug系列 GroupNorm和BatchNorm出现Nan或inf的情况 前言这两个函数做了什么可能出现的问题解决方法train和evalbatchsize或channel设置过小可训练参数的问题数值溢出其它的方法 前言 在复现别人论文的实验结果时&#xff0c;按照README乖乖做完之后&#xff0c;却发现损失函数…

Windows / Linux dir 命令

Windows / Linux dir 命令 1. dir2. dir *.* > data.txt3. dir - list directory contentsReferences 1. dir 显示目录的文件和子目录的列表。 Microsoft Windows [版本 10.0.18363.900] (c) 2019 Microsoft Corporation。保留所有权利。C:\Users\cheng>dir驱动器 C 中…

线性代数:向量组的秩

目录 回顾“秩” 及 向量组线性表示 相关特性 向量组的秩 例1 例2 矩阵的“秩” 及 向量组线性表示 相关特性 向量组的秩 例1 例2

@Async引发的spring循环依赖的问题,

今天发现一个很有意思的问题&#xff0c;正常解决项目中产生的循环依赖&#xff0c;是找出今天添加的注入代码&#xff0c;然后一个个加lazy试过去&#xff0c;会涉及到类中新增的注入 但是今天修改了某个serviceimpl的方法&#xff0c;加入了Async方法后 就发生循环依赖了 ai…

【职场经验】关于自动化用例设计的思考

为什么要设计用例&#xff1f; 作为质量保证(QA)人员&#xff0c;设计测试用例的重要性不亚于开发人员编写技术实现方案。如果实现方案设计不周&#xff0c;编码阶段将可能遇到许多问题&#xff1b;同理&#xff0c;如果我们未能设计测试用例&#xff0c;产品质量就难以得到充…

如何实现一个K8S DevicePlugin?

什么是device plugin k8s允许限制容器对资源的使用&#xff0c;比如CPU和内存&#xff0c;并以此作为调度的依据。 当其他非官方支持的设备类型需要参与到k8s的工作流程中时&#xff0c;就需要实现一个device plugin。 Kubernetes提供了一个设备插件框架&#xff0c;你可以用…

机器视觉系统选型-为什么还要选用工业光源控制器

工业光源控制器最主要的用途是给光源供电&#xff0c;实现光源的正常工作。 1.开关电源启动时&#xff0c;电压是具有波浪的不稳定电压&#xff0c;其瞬间峰值电压超过了LED灯的耐压值&#xff0c;灯珠在多次高压冲击下严重降低了使用寿命&#xff1b; 2.使用专用的光源控制器&…

【算法学习】搜索算法之深度优先搜索

深度优先搜索 DFS 1.算法介绍 深度优先搜索(DFS)算法是一种用于遍历或搜索树或图的算法。它的基本思想是尽可能深地搜索图的分支,直到到达叶节点或无法再深入为止,然后回溯到前一个节点,继续探索其他分支。这种搜索策略可以确保图中的每个节点都被访问到,除非它是一个环。…

inBuilder低代码平台新特性推荐-第十六期

各位友友们&#xff0c;大家好~今天来给大家介绍一下inBuilder低代码平台社区版中的系列特性之一 —— 构件热加载&#xff01; 01 概述 构件热加载指的是&#xff1a;构件代码修改后&#xff0c;无需重启应用&#xff0c;通过WebIDE的部署或发布工程后&#xff0c;即可正常调…

08-静态pod(了解即可,不重要)

我们都知道&#xff0c;pod是kubelet创建的&#xff0c;那么创建的流程是什么呐&#xff1f; 此时我们需要了解我们k8s中config.yaml配置文件了&#xff1b; 他的存放路径&#xff1a;【/var/lib/kubelet/config.yaml】 一、查看静态pod的路径 [rootk8s231 ~]# vim /var/lib…

代码的复用——Mixin使用例子

Mixin&#xff08;混入&#xff09;是一种在Sass和Vue.js等框架中常用的技术&#xff0c;用于分发和重用代码。以下是Sass和Vue.js中Mixin的使用举例。 在Sass中&#xff0c;Mixin允许你定义可以在整个样式表中重复使用的样式。以下是一个Sass中Mixin的使用例子&#xff1a; …

华为配置直连三层组网直接转发示例

华为配置直连三层组网直接转发示例 组网图形 图1 配置直连三层组网直接转发示例组网图 业务需求组网需求数据规划配置思路配置注意事项操作步骤配置文件扩展阅读 业务需求 企业用户接入WLAN网络&#xff0c;以满足移动办公的最基本需求。且在覆盖区域内移动发生漫游时&#xff…

标题:从预编译到链接:探索C/C++程序的翻译环境全貌

引言 在软件开发的世界里&#xff0c;我们通常会遇到两种不同的环境——翻译环境与运行环境。今天&#xff0c;我们将聚焦于前者&#xff0c;深入剖析C/C程序生命周期中至关重要的“翻译环境”&#xff0c;即从源代码到可执行文件这一过程中涉及的四个关键阶段&#xff1a;预编…

三七互娱,顺丰24春招内推

三七互娱&#xff0c;顺丰24春招内推 ①三七互娱 【介绍】知名上市游戏企业&#xff0c;24届本科及以上可投递&#xff0c;使用内推码&#xff0c;面试快人一步&#xff01; 【岗位】美术设计类&#xff0c;运营类&#xff0c;游戏研发类&#xff0c;策划类&#xff0c;市场推广…

设备改造经历干扰处理

设备改造完了,终于松了口气。没过几天,客户打电话过来,刚松了的那口气立马又吊了起来。通过客户描述,感觉麻烦来了。 客户每台机器都用了4台伺服,国产某品牌的,之前就经常发生液压站压力变送器损坏、某个环节偶尔不工作等情况,通过增加滤波电路、分开走线等措施解决了。…

开发的软件如何在安卓市场上架

要在安卓市场上架开发的软件&#xff0c;你需要遵循一系列步骤来确保你的应用符合市场的要求和标准。以下是一个基本的上架流程&#xff1a; 1. 注册开发者账号 在Android安卓市场&#xff08;如Google Play Store&#xff09;上注册一个开发者账号。提供必要的信息&#xff…

LeetCode 算法题 (数组)存在连续3个奇数的数组

问题&#xff1a; 输入一个数组&#xff0c;并输入长度&#xff0c;判断数组中是否存在连续3个元素都是奇数的情况&#xff0c;如果存在返回存在连续3个元素都是奇数的情况&#xff0c;不存在返回不存在连续3个元素都是奇数的情况 例一&#xff1a; 输入&#xff1a;a[1,2,3…

数论 - 博弈论(Nim游戏)

文章目录 前言一、Nim游戏1.题目描述输入格式输出格式数据范围输入样例&#xff1a;输出样例&#xff1a; 2.算法 二、台阶-Nim游戏1.题目描述输入格式输出格式数据范围输入样例&#xff1a;输出样例&#xff1a; 2.算法 三、集合-Nim游戏1.题目描述输入格式输出格式数据范围输…