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,一经查实,立即删除!

相关文章

Python 写网络监控

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

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…

如何实现一个K8S DevicePlugin?

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

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

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

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…

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

华为配置直连三层组网直接转发示例 组网图形 图1 配置直连三层组网直接转发示例组网图 业务需求组网需求数据规划配置思路配置注意事项操作步骤配置文件扩展阅读 业务需求 企业用户接入WLAN网络&#xff0c;以满足移动办公的最基本需求。且在覆盖区域内移动发生漫游时&#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.题目描述输入格式输出格式数据范围输…

React18原理: React核心对象之ReactElement对象和Fiber对象

React中的核心对象 在React应用中&#xff0c;有很多特定的对象或数据结构.了解这些内部的设计&#xff0c;可以更容易理解react运行原理列举从react启动到渲染过程出现频率较高&#xff0c;影响范围较大的对象&#xff0c;它们贯穿整个react运行时 如 ReactElement 对象如 Fi…

IO 作业 24/2/21

1、使用多线程完成两个文件的拷贝&#xff0c;第一个线程拷贝前一半&#xff0c;第二个线程拷贝后一半&#xff0c;主线程回收两个线程的资源 #include <myhead.h> //定义分支线程1 void *task1(void *arg) {int fdr-1;//只读打开被复制文件if((fdropen("./111.txt…

2024光伏展

2024年光伏展是一个专业的光伏行业展览会&#xff0c;旨在展示最新的光伏技术和产品&#xff0c;并促进光伏行业的发展和合作。 该展览会预计将吸引来自全球各地的光伏制造商、供应商、投资者和专业人士。参展的公司将有机会展示他们的最新产品和技术&#xff0c;与其他行业领导…

HTTP协议要点总结

一、什么是 HTTP 协议 1. 超文本传输协议 (HTTP &#xff0c; HyperText Transfer Protocol) 是互联网上应用广泛的一种网络协议。 是工作在 tcp/ip 协议基础上的 , 所有的 WWW 文件都遵守这个标准。 2. http1.0 短连接 http1.1 长连接 3. http 是 TCP/IP 协议的一个…

react实现转盘抽奖功能

看这个文章不错&#xff0c;借鉴 这个博主 的内容 样式是背景图片直接&#xff0c;没有设置。需要的话应该是 #bg { width: 650px; height: 600px; margin: 0 auto; background: url(turntable-bg.jpg) no-repeat; position: relative; } img[src^"pointer"] {positi…

马斯克称首位受试者可凭思维操控鼠标;字节低调推出视频模型丨 RTE 开发者日报 Vol.148

开发者朋友们大家好&#xff1a; 这里是 「RTE 开发者日报」 &#xff0c;每天和大家一起看新闻、聊八卦。我们的社区编辑团队会整理分享 RTE &#xff08;Real Time Engagement&#xff09; 领域内「有话题的 新闻 」、「有态度的 观点 」、「有意思的 数据 」、「有思考的 文…

微信小程序uniapp校园在线报修系统维修系统java+python+nodejs+php

管理员的主要功能有&#xff1a; 1.管理员输入账户登陆后台 2.个人中心&#xff1a;管理员修改密码和账户信息 3.用户管理&#xff1a;对注册的用户信息进行删除&#xff0c;查询&#xff0c;添加&#xff0c;修改 4.维修工管理&#xff1a;对维修工信息进行添加&#xff0c;修…

SpringBoot+MybatisPlus+Mysql实现批量插入万级数据多种方式与耗时对比

场景 若依前后端分离版本地搭建开发环境并运行项目的教程&#xff1a; 若依前后端分离版手把手教你本地搭建环境并运行项目_本地运行若依前后端分离-CSDN博客 若依前后端分离版如何集成的mybatis以及修改集成mybatisplus实现Mybatis增强&#xff1a; https://blog.csdn.net…

28/100二叉树的中序遍历 29/100不同的二叉搜索树(TODO) 30/100验证二叉搜索树 31/100对称二叉树

题目&#xff1a;28/100 二叉树的中序遍历 给定一个二叉树的根节点 root &#xff0c;返回 它的 中序 遍历 。 题解&#xff1a; /*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* TreeNode *right;* TreeNode() …