关于stm32(CubeMX+HAL库)的掉电检测以及flash读写

1.掉电检测

CubeMX配置

只需使能PVD中断即可

但是使能了PVD中断后还需要自行配置一些PWR寄存器中的参数,我也通过HAL库进行编写

void PVD_config(void)
{//配置PWRPWR_PVDTypeDef sConfigPVD;                    sConfigPVD.PVDLevel = PWR_PVDLEVEL_7;            //低于2.9V触发掉电中断sConfigPVD.Mode = PWR_PVD_MODE_IT_RISING;        //掉电后PVDO会置一,因此选择上升沿触发HAL_PWR_ConfigPVD(&sConfigPVD);                  //HAL库配置PVD函数//使能PVDHAL_PWR_EnablePVD();        //开启掉电中断
}

因为我们使用了CubeMX配置了中断优先级,因此此处不需要再次配置,

优先级在void HAL_MspInit(void)中配置

2.Flash的读写

我使用的是stm32f103c8t6       flash最大地址为        0x08010000

这里我把数据存放在0x0800C000

a).flash的擦除

在写之前需要擦除flash中的内容

flash擦除函数

HAL_StatusTypeDef HAL_FLASHEx_Erase(FLASH_EraseInitTypeDef *pEraseInit,uint32_t *SectorError)
描述    :    擦除指定的Flash页
返回    :    状态    HAL_OK    HAL_ERROR    HAL_TIMEOUT
参数1    :    擦除flash时使用的结构体指针
参数2    :    错误信息擦除flash时使用的结构体指针
typedef struct
{uint32_t    TypeErase;        //擦除方式 : 批量擦除或页面擦除uint32_t    Banks;            //uint32_t    PageAddress;    //要擦除的首地址    (0x08000000        -    FLASH_BANKx_END)uint32_t    NbPages;        //待擦除的页面数    (1    -    max number of pages - value of initial page)
} FLASH_EraseInitTypeDef;擦除方式
#define FLASH_TYPEERASE_PAGES     0x00U          /*!<Pages erase only*/
#define FLASH_TYPEERASE_MASSERASE 0x02U      /*!<Flash mass erase activation*/FLASH_BANKx_END		stm32f103c8t6的最大地址是0x08010000(64kb)

b).flash的写入

flash写入函数
 

HAL_StatusTypeDef HAL_FLASH_Program(uint32_t TypeProgram, uint32_t Address, uint64_t Data)
描述	:	向flash中的一页写入数据
返回	:	状态	HAL_OK	HAL_ERROR	HAL_TIMEOUT
参数1	:	传输的数据类型
参数2	:	要写入的首地址
参数3	:	要写入的数据传输的数据类型
#define FLASH_TYPEPROGRAM_HALFWORD			0x01U
#define FLASH_TYPEPROGRAM_WORD				0x02U
#define FLASH_TYPEPROGRAM_DOUBLEWORD		0x03U

c).flash的读取

*(__IO uint32_t *)Flash_Addr;

Flash_Addr        :    要读取的首地址

在擦除和写入前都需要解锁flash结束后需要上锁

    //解锁
    HAL_FLASH_Unlock();

    //上锁
    HAL_FLASH_Lock();

实例代码

/******************************************************************************
function : void erase_flash(uint32_t addr)
describtion : 擦除flash的一个扇区
input : uint32_t addr		//擦除的首地址
return : void
******************************************************************************/
void erase_flash(uint32_t addr)
{uint32_t Errcode = 0;//初始化擦除结构体FLASH_EraseInitTypeDef Erase;Erase.TypeErase = FLASH_TYPEERASE_PAGES;Erase.PageAddress = FLASH3_ADDR;Erase.NbPages = 1;//解锁HAL_FLASH_Unlock();//擦除要写入的扇区if(HAL_FLASHEx_Erase(&Erase,&Errcode) != HAL_OK){return;}//上锁HAL_FLASH_Lock();
}/******************************************************************************
function : uint16_t read_flash(uint32_t addr)
describtion : 读flash中的一个16位数据
input : uint32_t addr		//读取的首地址
return : uint16_t			//读到的数据
******************************************************************************/
uint16_t read_flash(uint32_t addr)
{return *((__IO uint32_t *)addr);
}/******************************************************************************
function : void write_flash(uint32_t addr , uint16_t w_data)
describtion : 将一个十六位数据写入flash
input : void
return : void
******************************************************************************/
void write_flash(uint32_t addr , uint16_t w_data)
{	//解锁HAL_FLASH_Unlock();//写入数据if(HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD,addr,w_data) != HAL_OK){return;}//上锁HAL_FLASH_Lock();
}

如果要实现掉电写入数据,只需要在程序读完数据后擦除flash,然后在掉电中断的回调函数中写入flash即可

注:不可以在掉电回调函数中擦除,因为擦除比较费时,掉电的时间可能不够!

有哪里写的不好欢迎在评论区讨论!

 

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

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

相关文章

什么是进程??????

大纲 进程&#xff1a; 故事&#xff1a; 城里人有城里人的规矩&#xff0c;城中有个专门管辖你们的城管&#xff08;操作系统&#xff09;&#xff0c;人家让你休息就休息&#xff0c;让你工作就工作&#xff0c;毕竟摊位不多&#xff0c;每个人都要占这个摊位来工作&#x…

广州虚拟动力 | AI智能交互型虚拟数字人解决方案

广州虚拟动力整合自研的AI数字人技术与AI大语言模型技术&#xff0c;推出AI智能交互型虚拟数字人解决方案&#xff0c;面向旅游景区、博物馆、银行、医院、营业厅、酒店住宿、大型商场等&#xff0c;以AI数字人为载体&#xff0c;承担公共服务职能&#xff0c;根据各行业特性和…

权限管理系统-0.4.1

5.4 权限管理前端开发 5.4.1 src/components 新建ParentView文件夹&#xff0c;并在文件夹中新建index.vue文件。 并在index.vue中加入以下内容&#xff1a; <template><router-view /> </template>5.4.2 layout/components/Sidebar/index.vue routes() …

Antd中s-table组件某字段进行排序

Antd中s-table组件某字段进行排序 提前说明&#xff0c;s-table组件包含分页等功能 <s-tableref"table":columns"columns":data"loadData"bordered:row-key"(record) > record.id"></s-table>而其中loadData为获取表数…

光电测径仪亦能对透明胶管进行在线测径

关键词&#xff1a;光电测径仪,胶管测径仪,透明胶管测径仪,在线测径 现在各种胶管产品的生产都在使用测径仪进行外径的实时检测与控制&#xff0c;但现在的在线测径仪都是光学检测设备&#xff0c;而透明胶管是透光的&#xff0c;因此很多人会有顾虑&#xff0c;在线测径仪是否…

腾讯云服务器地域选择方法,神仙教程,看这一篇就够了

腾讯云服务器地域怎么选择&#xff1f;不同地域之间有什么区别&#xff1f;腾讯云哪个地域好&#xff1f;地域选择遵循就近原则&#xff0c;访客距离地域越近网络延迟越低&#xff0c;速度越快。腾讯云百科txybk.com告诉大家关于地域的选择还有很多因素&#xff0c;地域节点选择…

26-Java访问者模式 ( Visitor Pattern )

Java访问者模式 摘要实现范例 访问者模式&#xff08;Visitor Pattern&#xff09;使用了一个访问者类&#xff0c;它改变了元素类的执行算法&#xff0c;通过这种方式&#xff0c;元素的执行算法可以随着访问者改变而改变访问者模式中&#xff0c;元素对象已接受访问者对象&a…

聚氨酯封孔剂因为热爱

忙忙碌碌又一天,对每个顾客都用心服务,因为热爱,所以不辛苦,因为热爱,即使无数遍的重复也不会厌倦。 聚氨酯封孔材料的主要性能特点&#xff1a; 1、粘度低&#xff0c;易渗入微小裂隙&#xff1b; 2、粘合能力很强&#xff0c;具有持久强粘结性&#xff1b; 3、柔韧性.越&am…

如何注册Devin-首个全自主AI软件工程师

最近devin大火&#xff0c;具体的就不说了&#xff0c;大家应该都知道&#xff0c;写代码非常nb&#xff0c;这里说一下devin的注册方式&#xff0c;目前devin的内测已经开启。 官网https://www.cognition-labs.com/blog注册网址Your reliable AI software engineerhttps://pr…

机器学习模型—支持向量机 (SVM)

机器学习模型—支持向量机 (SVM) 支持向量机 (SVM) 是一种强大的机器学习算法,用于线性或非线性分类、回归,甚至异常值检测任务。SVM 可用于各种任务,例如文本分类、图像分类、垃圾邮件检测、笔迹识别、基因表达分析、人脸检测和异常检测。SVM 在各种应用中具有适应性和高效…

SpringBoot启动过程

构建SpringApplication对象 这里分为2部分,先new一个SpringApplication对象【入参是启动类】,再去调用这个对象的run方法。 1.primarySources属性记录传进来的启动类是什么,当做spring的配置类 2.有可能不是web应用,也能是Springboot java应用【recative是响应式的 Servle…

如何使用vue定义组件之——父组件调用子组件数据

首先&#xff0c;准备父子容器&#xff1a; <div class"container"><my-father></my-father><my-father></my-father><my-father></my-father><!-- 此处无法调用子组件&#xff0c;子组件必须依赖于父组件进行展示 --&…