Air32 | 合宙Air001单片机内部FLASH读写示例

Air32 | 合宙Air001单片机内部FLASH读写示例


代码已经通过测试,开发环境KEIL-MDK 5.36。

测试代码

void FLASH_RdWrTest(void)
{uint32_t Address;uint32_t PageReadBuffer[FLASH_PAGE_SIZE >> 2];uint32_t PageWriteBuffer[FLASH_PAGE_SIZE >> 2];memset(PageWriteBuffer, 0XAA, sizeof(PageWriteBuffer));for(Address = 0x08003000; Address < 0x08008000; Address += FLASH_PAGE_SIZE)  // 16K~32K{FLASH_Write(Address, PageWriteBuffer, sizeof(PageReadBuffer) >> 2);memset(PageReadBuffer, 0, sizeof(PageReadBuffer));FLASH_Read(Address, PageReadBuffer, sizeof(PageReadBuffer) >> 2);if(memcmp(PageReadBuffer, PageWriteBuffer, sizeof(PageReadBuffer)) == 0){printf("page[%04d]  0x%08X read & write %s \r\n", (Address - FLASH_BASE) / FLASH_PAGE_SIZE, Address, "ok");}else{printf("page[%04d]  0x%08X read & write %s \r\n", (Address - FLASH_BASE) / FLASH_PAGE_SIZE, Address, "failed");}}
}

头文件


/*** @brief Create by AnKun on 2019/10/10*/#ifndef FLASH_H__
#define FLASH_H__#include "air001xx_hal.h"/// 导出函数声明 
void FLASH_Init(void);
void FLASH_Read(uint32_t Address, uint32_t *Buffer, uint32_t NumToRead);
void FLASH_Write(uint32_t Address, const uint32_t *Buffer, uint32_t NumToWrite);
void FLASH_WritePage_NoCheck(uint32_t Address, const uint32_t* Buffer);
void FLASH_ErasePage(uint32_t Address);
void FLASH_SetReadProtectionState(int state);#endif // !__FLASH_H

源文件


/*** @file  flash.c** @brief Create by AnKun on 2023/7/20**/#include "flash.h"
#include <string.h>static uint32_t FlashBuffer[FLASH_PAGE_SIZE >> 2];void FLASH_Init(void)
{HAL_FLASH_Unlock();__HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_ALL_ERRORS);  /* Clear SR register */HAL_FLASH_Lock();
}void FLASH_Read(uint32_t Address, uint32_t *Buffer, uint32_t NumToRead)
{while(NumToRead--){*Buffer++ = (*((volatile unsigned int *)Address));Address += 4;}
}void FLASH_WritePage_NoCheck(uint32_t Address, const uint32_t* Buffer)
{HAL_FLASH_Lock();    //解锁HAL_FLASH_Program(FLASH_TYPEPROGRAM_PAGE, Address, (uint32_t *)Buffer);HAL_FLASH_Unlock();  //上锁
}void FLASH_ErasePage(uint32_t Address)
{uint32_t PageError = 0;FLASH_EraseInitTypeDef EraseInitStruct = {0};HAL_FLASH_Unlock();EraseInitStruct.TypeErase   = FLASH_TYPEERASE_PAGEERASE;EraseInitStruct.PageAddress = Address;EraseInitStruct.NbPages     = 1;  /* erase nums pages. */HAL_FLASHEx_Erase(&EraseInitStruct, &PageError);HAL_FLASH_Lock();
}void FLASH_Write(uint32_t Address, const uint32_t *Buffer, uint32_t NumToWrite)
{uint32_t secpos;	   //页地址uint32_t secoff;	   //页内偏移地址(16位字计算)uint32_t secremain;    //页内剩余地址(16位字计算)uint32_t i;uint32_t offaddr;    //去掉0X08000000后的地址HAL_FLASH_Unlock();  //解锁offaddr = Address - FLASH_BASE;		              //实际偏移地址.secpos = offaddr / FLASH_PAGE_SIZE;			       //页地址secoff = (offaddr % FLASH_PAGE_SIZE) >> 2;		   //在页内的偏移(2个字节为基本单位.)secremain = (FLASH_PAGE_SIZE >> 2) - secoff;		   //页剩余空间大小if(NumToWrite <= secremain)secremain = NumToWrite; //不大于该页范围while(1){FLASH_Read(secpos * FLASH_PAGE_SIZE + FLASH_BASE, FlashBuffer, FLASH_PAGE_SIZE >> 2); //读出整个页的内容for(i = 0; i < (FLASH_PAGE_SIZE >> 2); i++) //校验数据{if(FlashBuffer[i] != 0XFFFFFFFF){uint32_t PageError = 0;FLASH_EraseInitTypeDef EraseInitStruct = {0};EraseInitStruct.TypeErase   = FLASH_TYPEERASE_PAGEERASE;EraseInitStruct.PageAddress = Address;EraseInitStruct.NbPages     = 1;  /* erase nums pages. */HAL_FLASHEx_Erase(&EraseInitStruct, &PageError);break;}}for(i = 0; i < secremain; i++) //复制{FlashBuffer[i + secoff] = Buffer[i];}HAL_FLASH_Program(FLASH_TYPEPROGRAM_PAGE, secpos * FLASH_PAGE_SIZE + FLASH_BASE, (uint32_t *)FlashBuffer);  //写入整个页if(NumToWrite == secremain)break; //写入结束了else//写入未结束{secpos++;				//页地址增1secoff = 0;				//偏移位置为0Buffer += secremain;  	//指针偏移Address += secremain;	//写地址偏移NumToWrite -= secremain;	//字节(16位)数递减if(NumToWrite > (FLASH_PAGE_SIZE >> 2)) secremain = (FLASH_PAGE_SIZE >> 2); //下一个页还是写不完else secremain = NumToWrite; //下一个页可以写完了}}HAL_FLASH_Lock();  //解锁
}void FLASH_SetReadProtectionState(int onoff)
{FLASH_OBProgramInitTypeDef OptionsBytesStruct;HAL_FLASH_Unlock();HAL_FLASH_OB_Unlock();HAL_FLASH_OBGetConfig(&OptionsBytesStruct);if(onoff){if(OptionsBytesStruct.RDPLevel == OB_RDP_LEVEL_0){OptionsBytesStruct.OptionType = OPTIONBYTE_RDP;OptionsBytesStruct.RDPLevel   = OB_RDP_LEVEL_1;HAL_FLASH_OBProgram(&OptionsBytesStruct);HAL_FLASH_OB_Launch();}}else{if(OptionsBytesStruct.RDPLevel == OB_RDP_LEVEL_1){OptionsBytesStruct.OptionType = OPTIONBYTE_RDP;OptionsBytesStruct.RDPLevel   = OB_RDP_LEVEL_0;HAL_FLASH_OBProgram(&OptionsBytesStruct);HAL_FLASH_OB_Launch();}}HAL_FLASH_OB_Lock();HAL_FLASH_Lock();
}void FLASH_RdWrTest(void)
{uint32_t Address;uint32_t PageReadBuffer[FLASH_PAGE_SIZE >> 2];uint32_t PageWriteBuffer[FLASH_PAGE_SIZE >> 2];memset(PageWriteBuffer, 0XAA, sizeof(PageWriteBuffer));for(Address = 0x08003000; Address < 0x08008000; Address += FLASH_PAGE_SIZE)  // 16K~32K{FLASH_Write(Address, PageWriteBuffer, sizeof(PageReadBuffer) >> 2);memset(PageReadBuffer, 0, sizeof(PageReadBuffer));FLASH_Read(Address, PageReadBuffer, sizeof(PageReadBuffer) >> 2);if(memcmp(PageReadBuffer, PageWriteBuffer, sizeof(PageReadBuffer)) == 0){printf("page[%04d]  0x%08X read & write %s \r\n", (int)((Address - FLASH_BASE) / FLASH_PAGE_SIZE), Address, "ok");}else{printf("page[%04d]  0x%08X read & write %s \r\n", (int)((Address - FLASH_BASE) / FLASH_PAGE_SIZE), Address, "failed");}}
}

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

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

相关文章

b站视频标题的获取(xpath、jsonpath的一个简单应用)

目录 1.目的2.代码的演示 注&#xff1a;该篇文章为本人原创&#xff0c;由于本人学习有限&#xff0c;若有错误或者笔误或者有问题&#xff0c;欢迎大家进行批评指正&#xff0c;谢谢。 1.目的 在b站大学上&#xff0c;为了更好的写笔记&#xff0c;本人根据学到的Python(即Py…

springboot家政服务管理系统java家务保姆资源 jsp源代码mysql

本项目为前几天收费帮学妹做的一个项目&#xff0c;Java EE JSP项目&#xff0c;在工作环境中基本使用不到&#xff0c;但是很多学校把这个当作编程入门的项目来做&#xff0c;故分享出本项目供初学者参考。 一、项目描述 springboot家政服务管理系统 系统1权限&#xff1a;管…

挑战Open AI!!!马斯克宣布成立xAI.

北京时间7月13日凌晨&#xff0c;马斯克在Twitter上宣布&#xff1a;“xAI正式成立&#xff0c;去了解现实。”马斯克表示&#xff0c;推出xAI的原因是想要“了解宇宙的真实本质”。Ghat GPT横空出世已有半年&#xff0c;国内外“百模大战”愈演愈烈&#xff0c;AI大模型的现状…

nginx部署以及反向代理多域名实现HTTPS访问

nginx部署以及反向代理多域名实现 1.nginx部署 1.1 编写nginx部署文件 docker-compose.yml version: 3 services: nginx:restart: always image: nginx:1.20container_name: nginx-mainports:- 80:80- 443:443volumes: # 基础配置- /opt/nginx_main/nginx-info/nginx.conf:/…

【C++】STL——stack和queue的模拟实现、空间适配器、deque的介绍、增删查改函数的简单实现

文章目录 1.deque的简单介绍2.模拟实现stack3.模拟实现queue 1.deque的简单介绍 deque的介绍文档 deque(双端队列)&#xff1a;是一种双开口的"连续"空间的数据结构&#xff0c;双开口的含义是&#xff1a;可以在头尾两端进行插入和删除操作&#xff0c;且时间复杂度…

ElastAlert通过飞书机器人发送报警通知

前言 公司采用ELK架构搜集业务系统的运行日志&#xff0c;以前开发人员只有在业务出现问题的时候&#xff0c;才会去kibana上进行日志搜索操作&#xff0c;每次都是被用户告知系统出问题了&#xff0c;这简直是被啪啪打脸~ 于是痛定思痛&#xff0c;决定主动出击&#xff0c;…

(树) 剑指 Offer 54. 二叉搜索树的第k大节点 ——【Leetcode每日一题】

❓剑指 Offer 54. 二叉搜索树的第k大节点 难度&#xff1a;简单 给定一棵二叉搜索树&#xff0c;请找出其中第 k 大的节点的值。 示例 1: 输入: root [3,1,4,null,2], k 13/ \1 4\2 输出: 4示例 2: 输入: root [5,3,6,2,4,null,null,1], k 35/ \3 6/ \2 4/1 输出…

Nacos安装(centos7)

安装版本2.0.2&#xff0c;下载地址 Release 2.0.2 (Jun 11th, 2021) alibaba/nacos GitHub 安装 启动 到bin目录下 sh startup.sh -m standalone 访问http://192.168.23.130:8848/nacos 输入nacos/nacos登入

opencv-32 图像平滑处理-高斯滤波cv2.GaussianBlur()

在进行均值滤波和方框滤波时&#xff0c;其邻域内每个像素的权重是相等的。在高斯滤波中&#xff0c;会将中心点的权重值加大&#xff0c;远离中心点的权重值减小&#xff0c;在此基础上计算邻域内各个像素值不同权重 的和。 基本原理 在高斯滤波中&#xff0c;卷积核中的值不…

研究人员发现特斯拉汽车能被越狱,可免费解锁付费功能

Bleeping Computer 网站披露&#xff0c;柏林工业大学&#xff08;Technical University of Berlin&#xff09;的研究人员开发出一种新技术&#xff0c;可以破解特斯拉近期推出所有车型上使用的基于 AMD 的信息娱乐系统&#xff0c;并使其运行包括付费项目在内的任何软件。 实…

【Spring】创建一个Spring项目与Bean对象的存储

目录 一、创建Spring项目 1、创建Maven项目 2、配置maven国内源 3、引入spring依赖 4、添加启动类 二、将Bean对象存储到Spring&#xff08;IoC容器&#xff09; 1、创建Bean对象 2、将Bean存储到spring&#xff08;容器&#xff09;中 3、获取Bean对象 3.1、Applicatio…

黑马机器学习day1

1.sklearn数据集 sklearn.datasets datasets.load_*() 获取小规模的数据集 datasets.fetch_*(data_homeNone) 获取大规模数据集 函数的第一个参数是data_home,标识数据集下载目录&#xff0c;默认/scikit_learn_data/ 1.1sklearn小数据集 sklearn.da…

3dmax好用插件CG Magic专业版上线,批量渲染,智能优化

CG Magic是一款基于3ds Max深度开发的智能化辅助插件&#xff0c;上千项实用功能&#xff0c;降低渲染时长&#xff0c;节省时间和精力&#xff0c;最大程度简化工作流程&#xff0c;助力高效完成创作。 CG MAGIC是基于3ds Max深度开发的智能化辅助设计插件&#xff0c;目前有两…

JavaWeb 速通Cookie

目录 一、关于base标签 1.引入 : 2.介绍 : 3.实例 : 4.细节 : 二、Cookie的引入 1.会话技术 : 1 什么是会话技术&#xff1f; 2 会话技术用于解决什么问题&#xff1f; 2.Cookie介绍 1 Cookie有什么用&#xff1f; 2 Cookie通讯机制 三、Cookie的基本使用 1.创建Cookie…

Pandas 的Merge函数详解

在日常工作中&#xff0c;我们可能会从多个数据集中获取数据&#xff0c;并且希望合并两个或多个不同的数据集。这时就可以使用Pandas包中的Merge函数。在本文中&#xff0c;我们将介绍用于合并数据的三个函数 merge、 merge_ordered、 merge_asofmerge merge函数是Pandas中…

如何实现对主机的立体监控?

主机监控是保证系统稳定性和性能的重要环节之一&#xff0c;那应该如何实现对主机的立体监控&#xff1f; 本期EasyOps产品使用最佳实践&#xff0c;我们将为您揭晓&#xff1a; 主机应该如何分组和管理&#xff1f; 主机监控应该关注哪些关键性指标&#xff1f; 背 景 通…

MySQL建表和增添改查

1.创建一个名为mydb的数据库 mysql> show database mydb; 查询 mysql> show database mydb; 2.创建一个学生信息表 mysql> create table mydb.student_informtion( -> student_id int UNSIGNED NOT NULL PRIMARY KEY, //非空&#xff08;不允许为空&#xff0…

FastAPI(七)应用配置

目录 一、在apps下新建文件夹config 二、新建配置文件app_conf.py 一、在apps下新建文件夹config 二、新建配置文件app_conf.py from functools import lru_cachefrom pydantic.v1 import BaseSettingsclass AppConfig(BaseSettings):app_name: str "Windows10 插件&qu…

WGS_1984_UTM、WGS_1984_Mercator坐标转化为经纬度坐标python

1、遥感影像的PROJECTION有哪些 遥感影像常见的投影类型有很多&#xff0c;具体选择哪种投影方式取决于数据的特性和使用需求。以下列举了一些常见的遥感影像投影类型&#xff1a; UTM (Universal Transverse Mercator) 投影&#xff1a;最常见的投影类型之一&#xff0c;将地…

uboot详解

uboot入口 在PC机上引导程序一般由BIOS开始执行&#xff0c;然后读取硬盘中位于MBR(Main Boot Record&#xff0c;主引导记录)中的Bootloader(例如LILO或GRUB),并进一步引导操作系统的启动。然而在嵌入式系统中通常没有像BIOS那样的固件程序&#xff0c;因此整个系统的加载启动…