蓝桥杯物联网竞赛_STM32L071KBU6_对于EEPROM的新理解

news/2024/12/22 18:47:05/

EEPROM写函数:

void Function_GetEepromData(){Function_EepromRead(4, BUFF);OLED_ShowChar(0, 0, BUFF[0] + '0');OLED_ShowChar(0, 2, BUFF[1] + '0');	BUFF[0] ++;BUFF[1] ++;HAL_FLASHEx_DATAEEPROM_Unlock();HAL_FLASHEx_DATAEEPROM_Program(FLASH_TYPEPROGRAMDATA_WORD, 4 + DATA_EEPROM_BASE, *BUFF);HAL_FLASHEx_DATAEEPROM_Lock();
}

流程很简单其实:就是一个开锁写或者读再上锁的过程

HAL_FLASHEx_DATAEEPROM_Unlock();

从函数名可以看出叫FLASH扩展函数,EPPROM数据区开锁

HAL_FLASHEx_DATAEEPROM_Program

program指的是烧录,意思是将数据烧录到EEPROM数据区域

FLASH_TYPEPROGRAMDATA_WORD

按整个字烧录

烧录函数一次只能写一个数据进去

读取函数:

void Function_EepromRead(uint32_t address, uint32_t* buff){uint32_t* TrueValue = (uint32_t* )(DATA_EEPROM_BASE + address);HAL_FLASHEx_DATAEEPROM_Unlock();I = 2;while(I --){*buff ++ = *TrueValue ++;}HAL_FLASHEx_DATAEEPROM_Lock();
}

DATA_EEPROM_BASE就是获取EEPROM数据区地址,然后开锁,读取关锁

对于*buff ++ = *TrueValue ++ 这部分代码我又额外分析了一下

#include <stdio.h>
#include <stdint.h>
uint32_t DATA[5] = {1, 2, 3};
uint32_t* ADDRESS = DATA; 
int main(){printf("ADDRESS地址:%p\n", ADDRESS);printf("*ADDRESS的值:%d\n", *ADDRESS);uint32_t temp = *ADDRESS ++;printf("temp的值:%d *ADDRESS操作后的值:%d\n", temp, *ADDRESS);printf("ADDRESS操作后的值:%p", ADDRESS);
} 

在这里插入图片描述
通过输出不难看出++操作的优先级是比*的优先级要低的,且uint32_t每个占空间4字结,这也是为什么address要是4的倍数否者就读不出来了

有意思的是:

#include <stdio.h>
#include <stdint.h>char a = 1;
uint32_t b = 3;
char* q = &a;
uint32_t* d = &b;int main(){printf("q: %p, d: %p\n", q, d);q = q + 1;d = d + 1;printf("(q + 1) : %p, (d + 1) : %p\n", q, d);
} 

在这里插入图片描述

对于char类型占1字节地址+ 1那么地址真是增加1,而对于uint32_t即32位的来说+1操作是地址向后挪4位刚好一个uint32_t的距离


http://www.ppmy.cn/news/1466303.html

相关文章

Flutter 中的 CustomMultiChildLayout 小部件:全面指南

Flutter 中的 CustomMultiChildLayout 小部件&#xff1a;全面指南 Flutter 是一个由 Google 开发的开源移动 UI 框架&#xff0c;它允许开发者使用 Dart 语言来构建高性能、美观的移动应用。在 Flutter 的丰富组件库中&#xff0c;CustomMultiChildLayout 是一个强大的布局小…

基于Java+SpringBoot+Mybaties-plus+Vue+elememt + uniapp 新闻资讯 的设计与实现

一.项目介绍 本系统分为 后端 和 小程序端 后端&#xff1a;点击登录按钮 设置个人中心、 管理员账号数据维护、 基础数据维护、 短视频信息维护(包括查看短视频留言、短视频收藏)、 论坛维护(增删改查帖子信息&#xff0c;包括查…

开源VS闭源:大模型发展路径之争,你站哪一派?

文章目录 引言一、数据隐私1.1开源大模型的数据隐私1.2 闭源大模型的数据隐私1.3 综合考量 二、商业应用2.1 开源大模型的商业应用2.2 闭源大模型的商业应用2.3 商业应用的综合考量 三、社区参与3.1 开源大模型的社区参与3.2 闭源大模型的社区参与3.3 综合考量 结论 引言 在人…

Linux 僵尸进程和孤儿进程

一.Z(zombie)-僵尸进程 1.僵死状态&#xff08;Zombies&#xff09;是一个比较特殊的状态。当进程退出并且父进程&#xff08;使用wait()系统调用后&#xff09;没有读取到子进程退出的返回代码时就会产生僵死(尸)进程 2.僵死进程会以终止状态保持在进程表中&#xff0c;并且会…

开源博客项目Blog .NET Core源码学习(29:App.Hosting项目结构分析-17)

本文学习并分析App.Hosting项目中后台管理页面的按钮管理页面。   按钮管理页面用于显示、新建、编辑、删除页面按钮数据&#xff0c;以便配置后台管理页面中每个页面的工具栏、操作栏、数据列中的按钮的事件及响应url。按钮管理页面附带一新建及编辑页面&#xff0c;以支撑新…

面试题:手动实现一个sizeof

面试题&#xff1a;手动实现一个sizeof 前几天在网上看到这样一个面试题&#xff0c;好像是腾讯的。 就是手动实现一个sizeof操作符&#xff0c;实际上面试官想要的考点应该是通过偏移量来实现检测sizeof的功能。即使明白这个考点&#xff0c;如果没有准备的话实现起来也是不…

配置 HTTP 代理 (HTTP proxy)

配置 HTTP 代理 [HTTP proxy] 1. Proxies2. curl2.1. Environment2.2. Proxy protocol prefixes 3. Use an HTTP proxy (使用 HTTP 代理)3.1. Using the examples (使用示例)3.1.1. Linux or macOS3.1.2. Windows Command Prompt 3.2. Authenticating to a proxy (向代理进行身…

小米路由器如何设置去广告功能,如何设置小米路由器的自定义Hosts(小米路由器如何去除小米广告、去除小米电视盒子开屏广告、视频广告)

文章目录 📖 介绍 📖🏡 演示环境 🏡📒 实现方案 📒📝 操作步骤📝 注意事项⚓️ 相关链接 ⚓️📖 介绍 📖 小米设备的广告一直是用户头疼的问题,无论是开屏广告、应用内广告还是系统广告,都影响了用户体验。本文将详细介绍如何通过小米路由器实现去除广告…