物联网Lora模块从入门到精通(九)Flash的读取与存储--结题

news2025/1/11 15:03:34

一、前言

        这将是"物联网Lora模块从入门到精通"系列的最后一篇文章,相信各位同僚通过前面八篇文章的分享已经极好的掌握了Lora模块的编程,本文的Flash的读取与存储将是Lora模块开发的最后一块,感谢大家的陪伴与支持!

        希望大家能在学习的道路上越走越远,不忘初心,砥砺前行!

二、代码实现

        本次的任务要求是记录程序重启的次数。

        在提供给我们的标准例程中,为我们提供了操作Flash的方法,包括读和写。这些方法包含在flash.c的库中:

/**********************************************************************************************
*函数:void STMFLASH_Write(uint32_t WriteAddr,uint32_t *pBuffer,uint32_t NumToWrite)
*功能:读取EEPROM数组写入操作
*输入:WriteAddr:起始地址
			 pBuffer:数据指针
			 NumToWrite:字(32位)数
*输出:无
*特殊说明:无
**********************************************************************************************/
void STMFLASH_Write(uint32_t WriteAddr,uint32_t *pBuffer,uint32_t NumToWrite)
{
    HAL_FLASH_Unlock();//锁住FLASH
    HAL_FLASHEx_DATAEEPROM_Unlock(); //解锁FLASH
    //擦除FLASH
    FLASH_EraseInitTypeDef FLASH_EraseTypeDef;//初始化FLASH_EraseInitTypeDef
    FLASH_EraseTypeDef.TypeErase = FLASH_TYPEERASE_PAGES;
    FLASH_EraseTypeDef.PageAddress = WriteAddr;
    FLASH_EraseTypeDef.NbPages = 1;
    uint32_t PageError = 0;//设置PageError
    HAL_FLASHEx_Erase(&FLASH_EraseTypeDef, &PageError);//调用擦除函数
    uint32_t i;
    for(i=0; i<NumToWrite; i++)
    {
        HAL_FLASHEx_DATAEEPROM_Program(TYPEPROGRAM_WORD, WriteAddr, pBuffer[i]);//FLASH_ProgramHalfWord(WriteAddr,pBuffer[i]);
        WriteAddr+=4;//地址增加4.
    }
    HAL_FLASHEx_DATAEEPROM_Lock();//锁住FLASH
    HAL_FLASH_Lock();//锁住FLASH
}

//从指定地址开始读出指定长度的数据
//ReadAddr:起始地址
//pBuffer:数据指针
//NumToWrite:字(32位)数
void STMFLASH_Read(uint32_t ReadAddr,uint32_t *PBuffer,uint32_t NumToRead)
{
    uint32_t i;
    for(i=0; i<NumToRead; i++)
    {
        PBuffer[i]=STMFLASH_ReadWord(ReadAddr);//读取4个字节.
        ReadAddr+=4;//偏移4个字节.
    }
}

        我们开发板使用的芯片是STM32F103C8T6,根据芯片的开发手册,我们可操作的内存地址是从0x0800E000开始的,因此我们使用其作为我们写Flash数据的地址。

        根据上述函数的描述,我们先声明一个uint32_t类型的数组,将其作为数据存储的容器。

        由于我们需要记录程序重启的次数,因此我们需要先对该地址写一个初值0。

        随后,我们可以正式开始我们的代码工作,即上电后将数据读出,对数据执行+1操作后再次存入Flash。

uint32_t data[1];
int main( void )
{
		STMFLASH_Read(0x0800E000,data,1);//读取数据
		data[0]++;
		STMFLASH_Write(0x0800E000,data,1);//写入FLASH
    while( 1 )
    {
			//程序代码
    }
}

        至此,我们便完成了FLASH的读取与存储操作。

        我们增加任务内容,即可以使用按键控制增加、减少、或清空记录数。

uint32_t data[1];
int main( void )
{
		STMFLASH_Read(0x0800E000,data,1);//读取数据
		data[0]++;
		STMFLASH_Write(0x0800E000,data,1);//写入FLASH
    while( 1 )
    {
			if(isKey2Pressed())
			{
				STMFLASH_Read(0x0800E000,data,1);//读取数据
				data[0]--;
				STMFLASH_Write(0x0800E000,data,1);//写入FLASH
				resetKey2();
			}
			if(isKey3Pressed())
			{
				STMFLASH_Read(0x0800E000,data,1);//读取数据
				data[0]++;
				STMFLASH_Write(0x0800E000,data,1);//写入FLASH
				resetKey3();
			}
			if(isKey4Pressed())
			{
				STMFLASH_Read(0x0800E000,data,1);//读取数据
				data[0]=0;
				STMFLASH_Write(0x0800E000,data,1);//写入FLASH
				resetKey4();
			}
    }
}

        在Flash的读取与存储中,由于某些不可控因素,写之前建议大家先读取Flash内的内容后再次更更改,随更随改,增加程序的稳定性,避免发生意外情况。

三、总结

        至此,我们也已经完成了Lora模块的全部学习,后续我会继续分享STM32开发的其他知识,感谢大家关注。

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

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

相关文章

SpringCloud(五)

文章目录 负载均衡策略自定义负载均衡策略饥饿加载 负载均衡策略 负载均衡的规则都定义在IRule接口中&#xff0c;而IRule有很多不同的实现类&#xff1a; 不同规则的含义如下&#xff1a; 内置负载均衡规则类规则描述RoundRobinRule简单轮询服务列表来选择服务器。它是Ribb…

Redis高级特性之慢查询的基本概念

慢查询概念 作为存储系统&#xff0c;Mysql等等&#xff0c;提供慢查询日志帮助开发和运维人员定位系统存在的满操作。慢查询日志就是系统在命令执行前后计算每条命令的执行时间&#xff0c;当超过预期阈值&#xff0c;便会将这条命令的相关信息。例如发生的时间&#xff0c;耗…

【零基础学JS - 10 】javaScript 中的比较和逻辑运算符

&#x1f468;‍&#x1f4bb; 作者简介&#xff1a;程序员半夏 , 一名全栈程序员&#xff0c;擅长使用各种编程语言和框架&#xff0c;如JavaScript、React、Node.js、Java、Python、Django、MySQL等.专注于大前端与后端的硬核干货分享,同时是一个随缘更新的UP主. 你可以在各个…

mysql8安装【含mysql安装包】

mysql8安装【含mysql安装包】 安装包等资源安装流程 安装包等资源 安装包下载地址【CSDN免费】&#xff1a;https://download.csdn.net/download/qq_47168235/87881866 如果上面的个下载不了&#xff0c;就通过百度网盘吧 百度网盘连接&#xff1a;https://pan.baidu.com/s/1G…

pycharm使用之torch_sparse安装

正式安装之前要先查看一下torch的版本 一、查看torch版本 1、winR &#xff0c;输入cmd 2、输入python 3、 输入import torch&#xff0c;然后输入torch.__version__&#xff0c;最后回车 可以看到我的torch版本是1.10.0 二、下载合适的torch_sparse版本 1、打开链接 https…

[LsSDK][tool] ls_syscfg_gui2.1 and ls_syscfg_debug1.0

文章目录 一、简介1.工具的目的2. 更新点下个更新 三、配置文件 一、简介 1.工具的目的 ① 可视化选择IO口功能。 ② 自由配置IO支持的功能。 ③ 适用各类MCU&#xff0c;方便移植和开发。 ④ 功能配置和裁剪&#xff08;选项-syscfg-待完成–需要适配keil语法有些麻烦&#…

只需一个Prompt,ChatGPT秒变万能导师,轻松学习任意领域知识

AI正在改变我们生活的方方面面&#xff0c;包括我们学习的方式。AI已经证明自己有能力成为我们的助手甚至是老师&#xff0c;帮助我们更有效地获取知识。 拿ChatGPT来说&#xff0c;我们平时有什么问题都可以向它提问&#xff0c;不过想让它更高效的帮助我们&#xff0c;还是需…

C++多态和文件读写

C黑马&#xff0c;每天1.5倍速2个视频&#xff08;1小时&#xff09;&#xff0c;看到9月1日完成314个视频 目录 &#x1f511;多态 &#x1f333;基本语法 &#x1f333;原理剖析 &#x1f333;案例1 -- 计算器类 &#x1f333;纯虚函数和抽象类 &#x1f333;案例2 --…

区块链世界的大数据入门之zkMapReduce简介

1. 引言 跨链互操作性的未来将围绕多链dapp之间的动态和数据丰富的关系构建。Lagrange Labs 正在构建粘合剂&#xff0c;以帮助安全地扩展基于零知识证明的互操作性。 2. ZK大数据栈 Lagrange Labs 的ZK大数据栈 为一种专有的证明结构&#xff0c;用于在任意动态分布式计算的…

Nginx本地启动前端Vue项目

1.Nginx下载及安装 下载地址&#xff1a;nginx: download 下载stable稳定版本&#xff0c;解压安装包 2.前端项目打包 使用cnpm/npm run serve 或 yarn serve将前端项目打包&#xff0c;记录dist文件夹路径 3.nginx.conf 填写 根目录下conf文件夹有nginx.conf文件&#xf…

Linux——Centos系统中网络连接的三种方式(如何修改VMware的IP地址?)

一、CentOS系统中&#xff0c;三种常见的网络连接模式 我们在前面搭建Linux环境中使用了虚拟机的方式进行&#xff08;后续也会发文演示用Docker来搭建Linux环境&#xff09;。在虚拟机中选择安装CentOS系统&#xff0c;然后当时在安装流程的时候选择了NAT模式&#xff0c;但是…

MySQL基础知识:索引

一、索引基础知识 &#xff08;一&#xff09;辅助索引/二级索引 叶子节点除了包含键值以外&#xff0c;每个叶子节点中的索引行中还包含了一个书签( bookmark) &#xff08;每个索引一颗B树&#xff0c;不包含行记录的全部数据&#xff09; &#xff08;二&#xff09; 回表…

第一章 数据处理篇:数据集读取和构建

说在前面的话 满打满算工作也有三年了&#xff0c;还是没有感觉到自己和刚毕业相比有什么明显的进步。 严格来讲&#xff0c;代码力确实有提升&#xff0c;对各类工具的使用也更加熟练。但是对算法的理解和从0开始编程的能力仍然没有什么长进。归根到底&#xff0c;是因为在工作…

算法学习day18

文章目录 513.找树左下角的值递归迭代 112 .路径总和递归迭代 113.路径总和II递归 106.从中序与后序遍历序列构造二叉树递归 105.从前序与中序遍历序列构造二叉树卡尔递归版本递归优化 总结 513.找树左下角的值 给定一个二叉树的 根节点 root&#xff0c;请找出该二叉树的 最底…

PPT里文字太多如何排版-一口气教你7种布局瞬间让PPT高大上起来

简介 这是我们学PPT处于初级到中级进化阶段常做的一件事,就是拿了这种纯文字类版面来做布局。而且这种文字都是政企类的、相当苦涩难懂、无法创意。 因此我们会要求使用7种排版来优化这个版面。这和达芳奇画鸡蛋很像,这样的练习需要坚持一段时间,就是拿了纯文字来beautifu…

【Flutter】如何给按钮添加圆角 自定义圆角按钮样式

文章目录 一、前言二、创建基本按钮三、如何在 Flutter 中创建圆角按钮四、自定义圆角按钮1.修改按钮颜色2.修改圆角半径 五、完整代码示例六、总结 一、前言 欢迎来到 Flutter 的世界&#xff01;在这篇文章中&#xff0c;我们将探索 Flutter 的一些基础知识。但是&#xff0…

【IC设计】Synopsys数字IC设计流程

文章目录 数字IC设计流程前端设计RTL编写和HDL仿真逻辑综合门级仿真形式化验证 后端设计数据准备set mw_phys_refs *set link_library *数据准备 (SDC)数据准备 (RC Techfile) set_tlu_plus_files floor planFloorplan阶段的主要内容&#xff1a;常用命令&#xff1a; placemen…

BiFPN,one-stage,two-stage

目录 BiFPN 语义信息 单stage物体检测算法 双stage skip connection,low-level feature,high level-feature,top-dowm path backbone通常分为几个stage BiFPN BiFPN是双向特征金字塔网络的缩写&#xff0c;是计算机视觉中用于目标检测和分割任务的一种神经网络架构。 …

碳排放预测模型 | Python实现基于传统Holt winter时间序列的碳排放预测模型(预测未来发展趋势)

文章目录 效果一览文章概述研究内容环境准备源码设计学习总结参考资料效果一览 文章概述 碳排放预测模型 | Python实现基于传统Holt winter时间序列的碳排放预测模型(预测未来发展趋势) 研究内容 这是数据集的链接:https://github.com/owid/co2-data/blob/master/owid-co2-d…

一个好的接口自动化测试脚本是怎么写出来的?

目录 前言 1、某个用例的测试目的是什么 2、接口信息的来源 3、一些基本原则 4、断言那些事 5、脚本的后期维护 6、关于测试数据的准备 总结&#xff1a; 前言 谈到接口测试&#xff0c;大家关注更多的是哪个工具更优秀&#xff0c;更好用。但是很少人关注到接口测试用…