HAL读写FLASH笔记

2023-11-01

HAL读写FLASH笔记

1. 整理数据

FLASH写入函数HAL_FLASH_Program可以写入16bit,32bit,64bit,实际最终调用FLASH_Program_HalfWord写入的是16bit,所以在写入之前要先把数据存到16bit数组里,然后按照16位写。
其实不用麻烦,直接存8位数组里,然后按照16位和32位写就可以了。

/**
  * @brief  Program a half-word (16-bit) at a specified address.
  * @param  Address specify the address to be programmed.
  * @param  Data    specify the data to be programmed.
  * @retval None
  */
static void FLASH_Program_HalfWord(uint32_t Address, uint16_t Data)

/**
  * @brief  Program halfword, word or double word at a specified address
  * @note   The function HAL_FLASH_Unlock() should be called before to unlock the FLASH interface
  *         The function HAL_FLASH_Lock() should be called after to lock the FLASH interface
  *
  * @note   If an erase and a program operations are requested simultaneously,    
  *         the erase operation is performed before the program one.
  *  
  * @note   FLASH should be previously erased before new programmation (only exception to this 
  *         is when 0x0000 is programmed)
  *
  * @param  TypeProgram:  Indicate the way to program at a specified address.
  *                       This parameter can be a value of @ref FLASH_Type_Program
  * @param  Address:      Specifies the address to be programmed.
  * @param  Data:         Specifies the data to be programmed
  * 
  * @retval HAL_StatusTypeDef HAL Status
  */
HAL_StatusTypeDef HAL_FLASH_Program(uint32_t TypeProgram, uint32_t Address, uint64_t Data)

2. 解锁

直接调用函数就可以了,实际是在FLASH->KEYR寄存器分别写入FLASH_KEY1,FLASH_KEY2.

/**
  * @brief  Unlock the FLASH control register access
  * @retval HAL Status
  */
HAL_StatusTypeDef HAL_FLASH_Unlock(void)

3.擦除扇区

FLASH擦除结构体,定义擦除类型TypeErase为页擦除,定义擦除地址PageAddress,定义擦除页数NbPages

/**
  * @brief  FLASH Erase structure definition
  */
typedef struct
{
  uint32_t TypeErase; /*Mass erase or page erase*/
  uint32_t Banks;       /*!< Select banks to erase when Mass erase is enabled */    
  uint32_t PageAddress; /*!< PageAdress: Initial FLASH page address to erase when mass erase is disabled
                             This parameter must be a number between Min_Data = 0x08000000 and Max_Data = FLASH_BANKx_END 
                             (x = 1 or 2 depending on devices)*/
  
  uint32_t NbPages;     /*!< NbPages: Number of pagess to be erased.
                             This parameter must be a value between Min_Data = 1 and Max_Data = (max number of pages - value of initial page)*/
                                                         
} FLASH_EraseInitTypeDef;

4.写入数据

调用HAL_FLASH_Program函数写入

/**
  * @brief  Program halfword, word or double word at a specified address
  * @note   The function HAL_FLASH_Unlock() should be called before to unlock the FLASH interface
  *         The function HAL_FLASH_Lock() should be called after to lock the FLASH interface
  *
  * @note   If an erase and a program operations are requested simultaneously,    
  *         the erase operation is performed before the program one.
  *  
  * @note   FLASH should be previously erased before new programmation (only exception to this 
  *         is when 0x0000 is programmed)
  *
  * @param  TypeProgram:  Indicate the way to program at a specified address.
  *                       This parameter can be a value of @ref FLASH_Type_Program
  * @param  Address:      Specifies the address to be programmed.
  * @param  Data:         Specifies the data to be programmed
  * 
  * @retval HAL_StatusTypeDef HAL Status
  */
HAL_StatusTypeDef HAL_FLASH_Program(uint32_t TypeProgram, uint32_t Address, uint64_t Data)

5.上锁

HAL_FLASH_Lock();

代码整理

写函数

/**
  * @brief  写若干页
  * @param  地址
  * @param  数组
  * @param  长度,8bit
  * @retval None
  */
int Flash_write(uint32_t appxaddr,uint32_t *appbuf,uint32_t appsize)
{
	static FLASH_EraseInitTypeDef EraseInitStruct;
	uint32_t SECTORError = 0;
	uint32_t Address = 0x00;				//记录写入的地址
//	printf("\nFLASH:%d ",appbuf[0]%0x100);
//	printf("\nFLASH:%d ",appbuf[0] );
  /* 解锁 */
	HAL_FLASH_Unlock();
	
  /* 擦除 */
	EraseInitStruct.TypeErase     = FLASH_TYPEERASE_PAGES;
	EraseInitStruct.NbPages       = appsize/2048+1;
	EraseInitStruct.PageAddress   = appxaddr;
  if (HAL_FLASHEx_Erase(&EraseInitStruct, &SECTORError) != HAL_OK)
	{
		return -1;
	}
	
  /* 向内部FLASH写入数据 */
	Address = appxaddr;
	uint32_t i=0;
	while(Address < appxaddr + appsize)
	{
		if(HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD, Address,appbuf[i]) == HAL_OK)
		{
		  Address = Address + 4;
			i+=1;
		}
		else
		{
		  /*写入出错,返回,实际应用中可加入处理 */
				return -1;
		}
	}
	
	/* 上锁 */
  HAL_FLASH_Lock();
	
	return 0;
}

写函数调用

Flash_write(FLASH_APP1_ADDR,(u32 *)USART_RX_BUF,Uart1.Length);

读函数

读的时候直接用memcpy就可以了

memcpy((uint8_t *)USART_TX_BUF+2,(uint8_t *)FLASH_APP1_ADDR,Uart1.Length-4);

注意

写入的数据是串口接收到的8bit数据,写是按照32bit写的,中间有四倍的差别。可以在调用函数的时候处理,也可以在写的时候处理

效果截图

在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

HAL读写FLASH笔记 的相关文章

  • ActionScript 3.0 中缺少运算符重载

    我在 ActionScript 中最怀念的事情之一是缺少运算符重载 特别是 我通过在我的类中添加 Compare 方法来解决这个问题 但这在很多情况下没有帮助 比如当你想使用内置字典之类的东西时 有没有好的方法来解决这个问题 Nope 但添
  • 用圆形减去(遮盖掉?)路径

    我正在使用 Spark Path 在 Flex 中绘制一条路径 我想从这条路径中减去一个圆形 如下图所示 道路又黑又宽 有任何想法吗 我尝试使用 Shape 对象创建蒙版 但无法完全创建其中有圆孔的蒙版 找到了 不涉及口罩 我拿了Path并
  • 是否可以使用 S3 进行 Flash 伪流?

    我一直在使用 S3 来存储和提供 FLV 和 MP4 视频 它效果很好 但内容是渐进下载的 我想知道是否有可能让所谓的 伪流 与 S3 一起使用 伪流允许观看者在下载完整视频之前在视频中向前搜索 并仅将必要的位发送到 Flash 播放器 我
  • Adobe Flash 项目的版本控制

    我正在处理一个非常复杂的 Flash 项目 该项目是我们为客户使用而部署的全套服务的一部分 对于我们的大多数软件源 Java PHP Javascript HTML 和一些其他语言的支持脚本 我们使用 subversion 进行版本控制和管
  • Flex 与 ActionScript

    我正在尝试构建 实现一个 Flash 视频播放器来播放视频 我研究了 Flex 并仅使用 VideoElement 构建了一个基本应用程序 它在没有静态链接库的情况下编译为 41k 在链接库时编译为 300k 我生成了报告 但仍然不确定为什
  • 将数组从 Flash (AS3) 发送到 JavaScript

    是否可以使用ExternalInterface 调用将数组从Flash AS3 发送到JavaScript 我目前正在 Flash 内的 foreach 循环中多次调用一个函数 但速度太快 JavaScript 无法跟上 我的想法是创建一个
  • 如何通过命令行将Flash .fla编译为.swf? [复制]

    这个问题在这里已经有答案了 如何在基于 Windows 的操作系统上通过命令行将 Flash fla 文件编译为 swf 需要安装的命令行工具就可以了 谁能建议我该怎么做 以直接的方式 谢谢 您可以使用JSFL为 Flash IDE 编写脚
  • html 可嵌入 flash wav 播放器

    我需要一个可在 IE FF 和 Chrome 中播放 wav 文件的嵌入式音频播放器 目前无法转换为 mp3 或任何其他格式 该播放器应该非常简单 只有一个播放 暂停按钮 也许还有一个时间轴栏 用户可以单击该时间轴栏来转到音频的特定部分 还
  • 处理照片上传的最佳方式是什么?

    我正在为一个家庭成员的婚礼制作一个网站 他们要求的一个功能是一个照片部分 所有客人都可以在婚礼结束后前往并上传他们的照片 我说这是一个很棒的想法 然后我就去实现它 那么只有一个问题 物流 上传速度很慢 现代相机拍摄的照片很大 2 5 兆 我
  • FloorPlanner 应用程序的 SVG/Canvas 与 Flash

    我计划创建一个平面图应用程序 允许用户使用鼠标绘制 调整大小 移动和旋转对象 我只是想知道使用 Flash 或 Javascript 是否会更好 如果使用 Javascript 我应该使用 canvas 还是 SVG 该应用程序将允许拖动选
  • 为什么我不应该使用 Flash?

    我多次听说我的网站应该避免使用 Flash 但没有人告诉我这样做的充分理由 我搜索了原因 发现很多不真实的情况 例如 Flash 中的文本无法被搜索引擎索引 或者不一定是真实的或足够重要的 占用更多带宽 JS 等效项会更大还是更小 我的网站
  • 在浏览器上录制视频并上传到LAMP服务器

    我已经尝试了很多东西 red5 jquery 网络摄像头 html5 但这些解决方案都没有录制视频并准备好上传到服务器 无论如何 html5 flash 等等 更好的跨浏览器解决方案 最好的 上传视频 音频 并将结果上传到服务器 我猜是通过
  • iOS:适用于 iOS 的基于 Flash 的编程应用程序?

    我想知道 有没有办法支持 iOS 的基于 Flash 的编程应用程序 它可以是本机 混合或网络应用程序 我想知道 是否有可能为 iOS 设备开发基于 Flash 的应用程序 我看过论坛 到处都说这是不可能的 所以只想在开始任何开发之前确认一
  • 自定义上下文菜单未显示,因为显示对象位于“顶部”

    作为这里另一个问题的后续 我已经在 Flash 应用程序中构建了一个自定义上下文菜单项 但遇到了有时不显示的问题 我发现问题是另一个精灵位于带有自定义上下文菜单的项目的 顶部 然而 即使将 mouseEnabled 和 mouseChild
  • Adobe Air 与 Flash Player 10.1 运行时

    Adobe Flash Player 是一个浏览器 插件提供的优势 用户和内容创作者 浏览器 包括能够 在浏览器中交付 RIA Adobe AIR 融合了最初的技术 在 Flash Player 中开发并启用 丰富的互联网应用 桌面 Ado
  • ExternalInterface 是否适用于 file: 协议?

    任何人都可以确认ExternalInterface可以在file 协议 或者指向一些说不会的文档 开始看起来这行不通了 says 在两者之间的任一方向编写脚本 本地 HTML 文件和本地 SWF 文件 例如 使用 外部接口类 要求 HTML
  • 初学者 Actionscript 参考

    我八岁的儿子要求 教他 Flash 编程 有人可以参考好的在线 Actionscript 学习资源吗 我们拥有的 Flash 版本是 Flash MX 先感谢您 看看这是否符合您的要求 http www scribd com doc 940
  • 读取STM32 MCU SPI数据寄存器的值

    有很多类似的问题 但似乎没有一个问题完全相同 我正在将 STML4 MCU 连接到 6 轴传感器 LSM6DS3 我已经成功地在 I2C 中实现了所有内容 但想要 SPI 的额外速度 和 DMA 如果我能让这些第一步工作起来的话 因此 第一
  • STM32F4 定时器 - 计算周期和预分频,以生成 1 ms 延迟

    我在用STM32F407VGT6 with CubeMX 因此 我从通用定时器开始 但我被预分频值和周期值所困扰 基本上我想每隔一段时间生成一个定时器中断n 其中 n 1 2 3 ms 并执行一些任务 计算周期和预分频值的公式有很多变化 公
  • Flash AS3 EventDispatcher - 有什么方法可以获取已注册侦听器的列表吗?

    有没有什么方法可以获取注册监听器的列表EventDispatcher 我知道EventDispatcher有hasEventListener方法告诉您是否注册了任何侦听器 但是有没有一种简单的方法来询问EventDispatcher找出听众

随机推荐

  • 竖式问题

    找出所有形如abc de 三位数乘以两位数 的算式 使得在完整的竖式中 所有数字都属于一个特定的数字集合 输入数字集合 相邻数字之间没有空格 输出所有竖式 每个竖式前应有编号 之后应有一个空行 最后输出解的总数 具体格式见样例输出 为了便于
  • jQuery easyUI的datagrid在翻页之后记录被选中的行

    最近修改一个以前的项目 前端有一个地方是用到 jQuery 的 datagrid 框架 需求是实现 datagrid 在翻页之后记录被选中的行 返回之前的页时选中项还在 所以就记录了一下实现过程 大概思路如下 1 设置 idField pk
  • 如何安装win10和linux双系统。以及引导系统问题。

    1 安装环境介绍 首先 出于本人学习需要 要用到linux系统 但是经常又会用到win10 因此迫切需要双系统的电脑 所在本人就琢磨着怎么在不删除原来win10的情况下可以装一个linux的ubuntu系统 2 常见的安装步骤 2 1首先在
  • MySQL的基本语句(1)—增删改查

    前言 MySQL由于其体积小 速度快 总体拥有成本低 尤其是开放源码这一特点 一般中小型和大型网站的开发都选择 MySQL 作为网站数据库 所以我准备在此处记录一下比较常用的几种语句 每一种语句只介绍一条如何操作 之后我会全面的写一个 建表
  • 杂项系列:代码分析工具Understand中文乱码

    参考 https blog csdn net ll480 article details 89575357 总结 project gt configure project gt file options gt File encode gt
  • QT学习之signals

    QT中增加了signals和slots 即信号与槽 从字面上来看我们也能大概知道这两个概念的意义 信号与槽的作用便是在两者关联后通过发射信号触发槽的反应 可以一个信号对应一个槽 可以一个信号对应多个槽 也可以多个信号对应一个槽 虽然相对来说
  • wait和sleep的区别

    sleep 是线程类 Thread 的静态类方法 导致此线程暂停执行指定时间 给执行机会给其他线程 但是监控状态依然保持 到时后会自动恢复 调用sleep 不会释放对象锁 sleep 谁调用的谁去睡觉 即使在a线程里调用了b的sleep方法
  • Windows域内密码凭证获取 (゚益゚メ) 渗透测试

    文章目录 域凭证介绍 获取域内专属凭证 ntds dit 卷影复制服务 Volume Shadow Copy Service VSS 使用 ntdsutil 使用 vssadmin 使用 vshadow 快照挂载 NinjaCopy脚本 凭
  • 在uniapp中配置和使用原生小程序组件的方法

    在uniapp中配置和使用原生小程序组件的方法 一 在项目中创建wxcomponents文件夹 将原生组件或自定义组件放入文件夹中 如下图 二 在 pages json 对应页面的 style gt usingComponents 引入组件
  • XML详解

    1 什么是xml eXtensible markup language 可扩展标记语言 被设计用来传输 存储数据 纯文本 自行定义标签 自我描述 HTML旨在显示数据 注 声明不属于XML本身的组成部分 XML元素的格式如下 lt 标记名称
  • IDEA设置新建XML文件

    1 原始菜单新建无法创建XML文件 2 file setting gt Editor gt File and Code Templates复制XML格式 3 点击 新建模板 gt 将刚才复制的模板粘贴到新建的内容 gt 更改xml名称为XM
  • Redis的发布与订阅

    什么是发布和订阅 一般来说 发布与订阅 又称pub sub 的特点是订阅者 listener 负责订阅频道 channel 发布者 publisher 负责向频道发送二进制字符串消息 binary string message 每当有消息被
  • Express 源码分析及简易封装

    原文出自 https www pandashen com 前言 Express 是 NodeJS 的 Web 框架 与 Koa 的轻量相比 功能要更多一些 依然是当前使用最广泛的 NodeJS 框架 本篇参考 Express 的核心逻辑来实
  • JavaSE学习总结:常用类

    Java常用类 1 java lang Object 1 1常见的方法 2 包装类 2 1目的 2 2包装类 2 3装箱 2 3拆箱 2 4包装类的其他的应用 3 Scanner类 1 java lang Object 它是所有类的根父类
  • word文件不小心被删怎么恢复

    有时候我们把电脑借给朋友家的熊孩子玩 或者是借给一些不太懂电脑的人玩 原本存在电脑里非常重要的word文件不小心被他们删除了 这可怎么办呢 如果放在以前科技不发达的时候 是肯定没有任何办法的 但是好在我们活在现在 可以使用word数据恢复软
  • 入门级题解143. 重排链表

    写在前面 链表的题 1 取独立节点 保存接口 接口即 gt next 2 会用哑节点 return dummy gt next 3 最重要的是 gt next 理解 理解再理解 并随时能够掌握它的最新变化 给定一个单链表 L 的头节点 he
  • 毕业论文尾注和参考文献

    毕业论文在正文中引用参考文献的方式主要有两种 交叉引用和尾注 交叉引用比较简单 这里不介绍 添加尾注出现的问题 插入尾注 尾注直接出现在文档的最后边 将致谢 作者简介等都引用到尾注中 导致致谢 作者简介等在标题栏中消失 添加尾注的原理 首先
  • 计算机图形学实验错误及解决方法,计算机图形学实验课实验总解决方案.doc

    西南交通大学信息科学与技术学院 计算机图形学实验课 2015 2016 学年 第II学期 实 验 报 告 学号 姓名 朱彦荣 专业 软件工程 班级 软件工程2 课程名称 计算机图形学 班级 软件工程2 学号 姓名 朱彦荣 实验日期 2016
  • MATLAB关掉ColorBar的刻度线

    MATLAB使用colorbar显示时默认会带有刻度线 文章里的图一般是没有刻度线的 可以用下面命令关掉刻度线 colorbar Ticks
  • HAL读写FLASH笔记

    HAL读写FLASH笔记 目录 HAL读写FLASH笔记 1 整理数据 2 解锁 3 擦除扇区 4 写入数据 5 上锁 代码整理 写函数 读函数 注意 效果截图 1 整理数据 FLASH写入函数HAL FLASH Program可以写入16