Stm32F401RCT6内部FLASH数据擦除读写方法

news2025/1/22 21:59:35

Stm32F401RCT6内部FLASH数据的分区和F103的已经不一样了,读写格式化的方法网上内容不多,自己摸索了一下,基本可以,还存在一个问题
读取:

  uint16_t f[5];
  uint8_t tx[10];
  f[0] = *(volatile uint16_t*)0x08020000; 		//STMFLASH_ReadHalfWord(0x0803F000);
  f[1] = *(volatile uint16_t*)0x08020002; 		//STMFLASH_ReadHalfWord(0x0803F000);
  f[2] = *(volatile uint16_t*)0x08020004; 		//STMFLASH_ReadHalfWord(0x0803F000);
  f[3] = *(volatile uint16_t*)0x08020006; 		//STMFLASH_ReadHalfWord(0x0803F000);
  f[4] = *(volatile uint16_t*)0x08020008; 		//STMFLASH_ReadHalfWord(0x0803F000);
  //f[0] = 0x1234;
  tx[0] = f[0]>>8;
  tx[1] = f[0] & 0xff;
  tx[2] = f[1]>>8;
  tx[3] = f[1] & 0xff;
  tx[4] = f[2]>>8;
  tx[5] = f[2] & 0xff;
  tx[6] = f[3]>>8;
  tx[7] = f[3] & 0xff;
  tx[8] = f[4]>>8;
  tx[9] = f[4] & 0xff;
  HAL_UART_Transmit(&huart1, tx, 10, 0xff);//查看数据

如果没有任何数据写入的时候读取应该都是0xFF的数据。

写入:

  HAL_FLASH_Unlock();
  HAL_FLASH_Program(FLASH_TYPEPROGRAM_HALFWORD, 0x8020000, dat[0]);
  HAL_Delay(10);
  dat[0] = 0x0052;
  HAL_FLASH_Program(FLASH_TYPEPROGRAM_HALFWORD, 0x8020002, dat[0]);
  HAL_Delay(10);
  dat[0] = 0xff00;
  HAL_FLASH_Program(FLASH_TYPEPROGRAM_HALFWORD, 0x8020004, dat[0]);
  HAL_Delay(10);
  dat[0] = 0x55AA;
  HAL_FLASH_Program(FLASH_TYPEPROGRAM_HALFWORD, 0x8020006, dat[0]);
  HAL_Delay(10);
  dat[0] = 0xf0f4;
  HAL_FLASH_Program(FLASH_TYPEPROGRAM_HALFWORD, 0x8020008, dat[0]);
  HAL_Delay(10);
  HAL_FLASH_Lock();

测试数据随便写的,写入后再次读取,数据是刚刚写入的数据,应该是成功的。

格式化扇区:
FLASH全盘格式化后,数据都是0xFF的,如果写入会产生不同的数据,但是数据是不能删除的,只能通过扇区格式化来删除数据,格式化后又恢复到0xFF的,不能单独删除某个字节的。
在这里插入图片描述
该芯片的flash分的扇区是上图的情况

格式化扇区

	  HAL_FLASH_Unlock();

	  HAL_StatusTypeDef FlashStatus = HAL_OK;
	  uint32_t SectorError = 0;
	  FLASH_EraseInitTypeDef FlashEraseInit;
	  FlashEraseInit.TypeErase = FLASH_TYPEERASE_SECTORS;     	//擦除类型,扇区擦除
	  FlashEraseInit.Sector = FLASH_SECTOR_5; 					//要擦除的扇区
	  FlashEraseInit.NbSectors = 1;                           //一次只擦除一个扇区
	  //FlashEraseInit.VoltageRange = FLASH_VOLTAGE_RANGE_3;    //电压范围,VCC=2.7~3.6V之间!!
	  if (HAL_FLASHEx_Erase(&FlashEraseInit, &SectorError) != HAL_OK)
	  {
		  uint8_t tx[5] = "error";
		  HAL_UART_Transmit(&huart1, tx, 5, 0xff);
		  //break; //发生错误了
	  }else{
		  uint8_t tx[2] = "ok";
		  HAL_UART_Transmit(&huart1, tx, 2, 0xff);
	  }
	  FlashStatus = FLASH_WaitForLastOperation(FLASH_WAITETIME); //等待上次操作完成
	  while(FlashStatus != HAL_OK ){}


//	  FLASH_Erase_Sector(FLASH_SECTOR_4, FLASH_VOLTAGE_RANGE_3);
	  HAL_Delay(10);
		HAL_FLASH_Lock();
		

格式化也是正常的,因为格式化后读取的数据变成了0xFF。
不过最后还存在一个严重的问题未解决:
在格式化后,想再次刷写数据产生错误:
在这里插入图片描述
目前还没有想出方法解决,只能重新用programmer软件全盘格式化来解决。不知道问题出在哪里。

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

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

相关文章

同旺科技 USB TO SPI / I2C --- 调试W5500_读写网关地址

所需设备: 内附链接 1、USB转SPI_I2C适配器(专业版); 首先,连接W5500模块与同旺科技USB TO SPI / I2C适配器,如下图: 这里的网关地址设置为192.168.1.1 先将网关地址写入寄存器,然后再读取出来:

【SpringBoot】讲清楚日志文件lombok

文章目录 前言一、日志是什么?二、⽇志怎么⽤?三.自定义打印日志3.1在程序中得到日志对象3.2使用日志打印对象 四.⽇志级别4.1日志级别有什么用4.2 ⽇志级别的分类与使⽤ 五.日志持久化六.lombok6.1添加lobok依赖注意:使⽤ Slf4j 注解&#x…

Linux命令与shell脚本编程大全【读书笔记 + 思考总结】

Linux命令与shell脚本编程大全 第 1 章 初识Linux shellLinux的组成及关系结构图是什么?Linux系统内核的作用是什么?内核的主要功能是什么?(4点)物理内存和虚拟内存是什么关系?内核如何实现虚拟内存&#x…

idea不需安装插件,自动生成mybatis-plus对应的实体类entity,带注解@TableName、@TableId、@TableField

目录 1、修改Generate poJOs.groovy文件 2、idea中连接数据库 3、生成entity代码 4、查看生成的实体类 1、修改Generate poJOs.groovy文件 在项目下方点击Scratches and Consoles→ Extensions→ Database Tools and SQL箭头→schema→ Generate POJOs.groovy 替换为以下文…

ssl下载根证书和中间证书

为了保证客户端和服务端通过HTTPS成功通信,您在安装SSL证书时,也需要安装根证书和中间证书。本文介绍如何获取根证书和中间证书。 使用说明 如果您的业务用户通过浏览器访问您的Web业务,则您无需关注根证书和中间证书,因为根证书…

如何学习 Spring ?学习 Spring 前要学习什么?

整理了一下Spring的核心概念BeanDefinitionBeanDefinition表示Bean定义,BeanDefinition中存在很多属性用来描述一个Bean的特点。比如:class,表示Bean类型scope,表示Bean作用域,单例或原型等lazyInit:表示Be…

PyQt6 QDialogButtonBox组合按钮控件

锋哥原创的PyQt6视频教程: 2024版 PyQt6 Python桌面开发 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili2024版 PyQt6 Python桌面开发 视频教程(无废话版) 玩命更新中~共计34条视频,包括:2024版 PyQt6 Python桌面开发 视频教程(无废话版…

【开源威胁情报挖掘3】开源威胁情报融合评价

基于开源信息平台的威胁情报挖掘综述 写在最前面5. 开源威胁情报关联分析5.1 开源威胁情报网络狩猎:技术、方法和最新研究应用实例和未来方向 5.2 开源威胁情报态势感知关键技术和方法应用实例和未来方向 5.3 开源威胁情报恶意检测关键技术和方法应用实例和未来方向…

【PTA题目】7-18 6翻了 分数 15

7-18 6翻了 分数 15 全屏浏览题目 切换布局 作者 陈越 单位 浙江大学 “666”是一种网络用语,大概是表示某人很厉害、我们很佩服的意思。最近又衍生出另一个数字“9”,意思是“6翻了”,实在太厉害的意思。如果你以为这就是厉害的最高境界&…

Mindspore实现手写数字识别

废话不多说,首先说一下我使用的环境: python3.9 mindspore 2.1 使用jupyter notebook Step1:导入相关依赖的包 import os from matplotlib import pyplot as plt import numpy as np import mindspore as ms import mindspore.context a…

【SpringMVC】Spring Web MVC入门(一)

文章目录 前言什么是Spring Web MVC?什么是MVC什么是Spring MVC? Spring Boot 和 Spring MVC 的区别什么是Spring Boot?关系和区别 Spring MVC 学习注解介绍1. SpringBootApplication2. RestController3. RequestMapping3.1 RequestMapping 使…

CSS3 修改滚动条样式

上图: 上代码: /* 修改垂直滚动条 */ .right-list::-webkit-scrollbar {width: 2px; /* 修改宽度 */height: 5px; /* 修改高度 */ } /* 修改滚动条轨道背景色 */ .right-list::-webkit-scrollbar-track {background-color: #f1f1f1; } /* 修改滚动条滑块…

找不到DNS地址的解决方案

找不到DNS地址的解决方案 第一种解决方案:刷新DNS缓存第二种解决方案: 配置Internet协议版本4(TCP/IPv4)配置IP地址配置DNS地址 如何查看本机IPv4地址、子网掩码与默认网关 第一种解决方案:刷新DNS缓存 WINR输入cmd回…

GEE:Sobel算子卷积

作者:CSDN _养乐多_ 本文将深入探讨边缘检测中的一个经典算法,即Sobel算子卷积。我们将介绍该算法的基本原理,并演示如何在Google Earth Engine中应用Sobel算子进行图像卷积操作。并以试验区NDVI为例子,研究区真彩色影像、NDVI图…

python毕业设计论文选题管理系统b615y

毕业论文管理方式效率低下,为了提高效率,特开发了本毕业论文管理系统。本毕业论文管理系统主要实现的功能模块包括学生模块、导师模块和管理员模块三大部分,具体功能分析如下: (1)导师功能模块:…

站群优化工具,站群优化方案策略

站群优化,作为网络推广的一项重要策略,站群的构建和优化对于提升网站在搜索引擎中的排名、吸引目标流量、增加用户粘性等方面有着不可忽视的作用。 站群优化方案 站群优化并非简单的堆积大量网站,更要注重质量和策略。在构建站群时&#xff…

大数据技术之Flume(超级详细)

大数据技术之Flume(超级详细) 第1章 概述 1.1 Flume定义 Flume是Cloudera提供的一个高可用的,高可靠的,分布式的海量日志采集、聚合和传输的系统。Flume基于流式架构,灵活简单。 1.2 Flume组成架构 Flume组成架构如…

WPF绘图---Canvas中Polygon屏幕居中显示

问题描述 在一个Canvas中绘制了多个Polygon&#xff0c;由于坐标可能超出界面显示范围&#xff0c;需要将绘制的Polygon居中显示&#xff0c;并且缩放至界面大小&#xff0c;效果如下&#xff1a; xaml代码 <Borderx:Name"border"Background"#fff"Cli…

三个写法统计整数前导0个数

从键盘输入一个整数(可能有前导0)&#xff0c;编程统计其前导0个数&#xff0c;其法有三。 (笔记模板由python脚本于2023年12月03日 12:32:32创建&#xff0c;本篇笔记适合对python整型int和字符型str熟悉的coder翻阅) 【学习的细节是欢悦的历程】 Python 官网&#xff1a;http…

C++17中的结构化绑定

C17中的结构化绑定(structured binding):将指定名称绑定到初始化程序的子对象或元素。简而言之&#xff0c;它们使我们能够从元组或结构中声明多个变量。与引用一样&#xff0c;结构化绑定是现有对象的别名&#xff1b;与引用不同&#xff0c;结构化绑定不必是引用类型(referen…