STM32C011开发(3)----Flash操作

STM32C011开发----3.Flash操作

  • 概述
  • 硬件准备
  • 视频教学
  • 样品申请
  • 源码下载
  • 参考程序
  • 生成STM32CUBEMX
  • 串口配置
  • 堆栈设置
  • 串口重定向
  • FLASH
  • 数据初始化
  • FLASH 读写
  • 演示

概述

STM32C011 系列微控制器内置 Flash 存储器,支持程序存储与数据保存,具备页面擦除、双字写入、读写保护等功能。本文将简要介绍 STM32C011 的 Flash 结构与特性,并通过实际代码示例,讲解 Flash 的擦除、写入与读取等基本操作。

最近在弄ST的教程,需要样片的可以加群申请:615061293/925643491 。

硬件准备

首先需要准备一个开发板,这里我准备的是自己绘制的开发板,需要的可以进行申请。
主控为STM32C011F4P6

在这里插入图片描述

视频教学

https://www.bilibili.com/video/BV1KTBtY4EpD

STM32C011开发(3)----Flash操作

样品申请

https://www.wjx.top/vm/OhcKxJk.aspx#

源码下载

参考程序

https://github.com/CoreMaker-lab/STM32C011_TSSOP20

https://gitee.com/CoreMaker/STM32C011_TSSOP20

生成STM32CUBEMX

用STM32CUBEMX生成例程,这里使用MCU为STM32C011F4P6。
配置时钟树,配置时钟为48M。

在这里插入图片描述

串口配置

查看原理图,PA0和PA1设置为开发板的串口。

在这里插入图片描述

配置串口,速率为115200。

在这里插入图片描述

堆栈设置

在这里插入图片描述

若无法正常运行需要修改优化等级。

在这里插入图片描述

串口重定向

打开魔术棒,勾选MicroLIB

在这里插入图片描述

在main.c中,添加头文件,若不添加会出现 identifier “FILE” is undefined报错。

/* USER CODE BEGIN Includes */
#include "stdio.h"
/* USER CODE END Includes */

函数声明和串口重定向:

/* USER CODE BEGIN PFP */
int fputc(int ch, FILE *f){HAL_UART_Transmit(&huart1 , (uint8_t *)&ch, 1, 0xFFFF);return ch;
}
/* USER CODE END PFP */

FLASH

STM32C011 的嵌入式 Flash 通过 AHB 总线与 Cortex-M0+ CPU 连接,支持访问、擦除和编程操作。
Flash 构成:
● 存储单元:Flash 单元为 64 位宽,用于存储代码及数据。
● 主存储器结构:
○ 共 16 页,每页大小为 2 KB,总计 32 KB。
● 信息块区域:
○ 包括选项字节(2 KB)、工程字节(1 KB)、OTP(1 KB)及系统存储器(6 KB)。

在这里插入图片描述
在这里插入图片描述

要向 FLASH 写入数据,需要依次完成以下四个步骤:

  1. 解锁 FLASH
  2. 擦除 FLASH
  3. 写入 FLASH
  4. 锁定 FLASH
    需要注意,FLASH 的擦除只能按页或整块进行。
    STM32C011F4P6 的 FLASH 容量为 16 KB,共分为 8 页,每页大小为 2 KB。
    我们可以将数据写入第 7 页,其地址范围为 0x08003800 - 0x08003FFF。
    单次写入的单位为 64 位(8 字节)。

数据初始化

● WriteFlashData:
○ 这是一个待写入的 64 位数据数组,包含 3 个双字(64 位)数据。
○ 每个元素的大小是 8 字节,总计 24 字节的数据。
● addr 和 Page:
○ addr 是目标地址,表示从 Flash 的第 7 页(Page 7)开始写入。
○ STM32 的 Flash 以 2 KB 为一页,因此第 7 页的起始地址是 0x08003800。

/* USER CODE BEGIN 0 */
uint64_t WriteFlashData[3] = {0x1111222233334444,0x5555666677778888,0x9999AAAABBBBCCCC};//数据uint32_t addr = 0x08003800;//page 7
uint32_t		Page = 7;void PrintFlashTest(uint32_t L,uint32_t Page);
void WriteFlashTest(uint32_t L,uint64_t Data[],uint32_t Page,uint32_t addr);/* USER CODE END 0 */

FLASH 读写

/* USER CODE BEGIN 4 */
/* FLASH 写入程序 */
void WriteFlashTest(uint32_t L, uint64_t Data[], uint32_t Page, uint32_t addr)
{uint32_t i = 0;uint32_t PageError = 0;// 1/4 解锁 FLASHif (HAL_FLASH_Unlock() != HAL_OK){printf("Error: Failed to unlock FLASH.\n");return;}// 2/4 初始化擦除结构体并擦除指定页FLASH_EraseInitTypeDef FlashSet;FlashSet.TypeErase = FLASH_TYPEERASE_PAGES; // 擦除类型:页擦除FlashSet.Page = Page;                       // 页索引FlashSet.NbPages = 1;                       // 一次擦除 1 页if (HAL_FLASHEx_Erase(&FlashSet, &PageError) != HAL_OK){printf("Error: Failed to erase FLASH. PageError: %d\n", PageError);HAL_FLASH_Lock();return;}printf("FLASH Page %u erased successfully.\n", Page);// 3/4 将数据写入指定地址for (i = 0; i < L; i++){if (HAL_FLASH_Program(TYPEPROGRAM_DOUBLEWORD, addr + 8 * i, Data[i]) != HAL_OK){printf("Error: FLASH program failed at address 0x%08X.\n", addr + 8 * i);HAL_FLASH_Lock();return;}}printf("FLASH programming completed successfully.\n");// 4/4 锁住 FLASHHAL_FLASH_Lock();
}/* FLASH 读取并打印程序 */
void PrintFlashTest(uint32_t L, uint32_t addr)
{uint32_t i = 0;uint64_t data = 0;printf("Reading FLASH data from address 0x%08X:\n", addr);for (i = 0; i < L; i++){data = *(__IO uint64_t *)(addr + i * 8); // 按 64 位读取数据printf("Address: 0x%08X, Data: 0x%016llX\n", addr + i * 8, data);}printf("FLASH read completed.\n");
}
/* USER CODE END 4 */

测试 FLASH 写入和读取功能,分为两次写入操作,并在每次写入后进行验证。
● 两次写入操作,分别测试不同数据的写入和读取。
● 验证写入是否正确,通过读取打印结果进行比对。

  /* USER CODE BEGIN 2 */printf("=== First Write and Read ===\n");WriteFlashTest(3,WriteFlashData,Page,addr);PrintFlashTest(3,addr);//WriteFlashData[3] = {0x1111222233334444,0x5555666677778888,0x9999AAAABBBBCCCC};//数据printf("\n=== Modify Data and Rewrite ===\n");WriteFlashData[0]=0x9999;WriteFlashData[1]=0x8888;WriteFlashData[2]=0x7777;WriteFlashTest(3,WriteFlashData,Page,addr);PrintFlashTest(3,addr);/* USER CODE END 2 */

演示

测试结果如下所示。

在这里插入图片描述

第一次写入。

在这里插入图片描述

第二次写入。

在这里插入图片描述

STM32CubeProgrammer读取。

在这里插入图片描述

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

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

相关文章

电商项目高级篇06-缓存

电商项目高级篇06-缓存 1、docker下启动redis2、项目整合redis3、redis改造三级分类业务 缓存 流程图&#xff1a; data cache.load(id);//从缓存加载数据 If(data null){ data db.load(id);//从数据库加载数据 cache.put(id,data);//保存到 cache 中 } return data;在我们…

TypeScript 命名空间与模块

在 TypeScript 中&#xff0c;命名空间和模块是两种不同的代码组织方式&#xff0c;它们都旨在帮助你管理和维护大型代码库。命名空间提供了一种将相关功能组织在一起的方式&#xff0c;而模块则允许你将代码分解成可重用的单元。在本文中&#xff0c;我们将探讨命名空间和模块…

Vue 原理详解

Vue 原理详解 Vue.js 是一个渐进式框架&#xff0c;它通过数据驱动视图更新和响应式编程使得前端开发变得更加简单高效。在 Vue 的内部实现中&#xff0c;编译过程和响应式机制是两个至关重要的组成部分。本文将详细介绍 Vue.js 的编译器、响应式系统和运行时的工作原理&#…

PS的功能学习

背景差色较大&#xff0c;就魔棒 魔棒的连续就是倒水点的跨越问题 魔棒的容差的选择就有点看经验了&#xff0c;看颜色的统一程度选择 Ctrl D 取消当前所有的选区 至于快速选择工具&#xff0c;和对象选择工具也差不多&#xff0c;只不过控制范围变成了一块一块的&#x…

深度学习实验--初步探索数据增强、优化器对模型的影响

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 前言 这次主要是探究&#xff0c;优化器、数据增强对模型训练的影响&#xff1b;基础篇还剩下几个, 后面的难度会逐步提升;越学&#xff0c;越觉得这个东西很…

新型大语言模型的预训练与后训练范式,谷歌的Gemma 2语言模型

前言&#xff1a;大型语言模型&#xff08;LLMs&#xff09;的发展历程可以说是非常长&#xff0c;从早期的GPT模型一路走到了今天这些复杂的、公开权重的大型语言模型。最初&#xff0c;LLM的训练过程只关注预训练&#xff0c;但后来逐步扩展到了包括预训练和后训练在内的完整…

Linux:systemd进程管理【1】

整体理解 要快速掌握Linux的systemd并覆盖80%的使用场景&#xff0c;以下是最重要的20%知识点&#xff1a; Systemd简介与核心功能&#xff1a; Systemd是一个系统和服务管理器&#xff0c;作为Linux系统的PID 1进程&#xff0c;负责启动和管理其他系统组件。它提供并行启动服…

SQL Server管理员sa登录失败原因

文章目录 一、开启混合登录模式二、启用sa三、更改密码四、登录sa一、开启混合登录模式 用Windows身份登录数据库服务。 在连接名上右键→属性。 在安全性选项卡下,选择【SQL Server和Windows身份验证模式】,点击【确定】,提示需要重启服务。 Win+R,输入指令:services.ms…

logminer挖掘日志归档查找问题

--根据发生问题时间点查找归档文件 select first_time,NAME from gv$archived_log where first_time>2016-03-15 17:00:00 and first_time<2016-03-15 21:00:00; 2016-03-15 17:23:55 ARCH/jxdb/archivelog/2016_03_15/thread_1_seq_41588.4060.906577337 2016-03-15 17:…

如何监控Elasticsearch集群状态?

大家好&#xff0c;我是锋哥。今天分享关于【如何监控Elasticsearch集群状态&#xff1f;】面试题。希望对大家有帮助&#xff1b; 如何监控Elasticsearch集群状态&#xff1f; 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 监控 Elasticsearch 集群的状态对于确保…

C# 集合(Collection)

文章目录 前言一、动态数组&#xff08;ArrayList&#xff09;二、哈希表&#xff08;Hashtable&#xff09;三、排序列表&#xff08;SortedList&#xff09;四、堆栈&#xff08;Stack&#xff09;五、队列&#xff08;Queue&#xff09;六、点阵列&#xff08;BitArray&…

TypeScript 迭代器与装饰器

TypeScript 作为 JavaScript 的一个超集&#xff0c;提供了许多高级特性来增强代码的可读性、可维护性和类型安全性。在本文中&#xff0c;我们将探讨两个这样的特性&#xff1a;迭代器和装饰器。迭代器允许我们以一致的方式遍历数据集合&#xff0c;而装饰器则提供了一种特殊的…

浏览器的数据六种存储方法比较 :LocalStorage vs. IndexedDB vs. Cookies vs. OPFS vs. WASM-SQLite

在构建该 Web 应用程序&#xff0c;并且希望将数据存储在用户浏览器中。也许您只需要存储一些小标志&#xff0c;或者甚至需要一个成熟的数据库。 我们构建的 Web 应用程序类型发生了显着变化。在网络发展的早期&#xff0c;我们提供静态 html 文件。然后我们提供动态渲染的 h…

flutter in_app_purchase google支付 PG-GEMF-01错误

问题&#xff1a;PG-GEMF-01错误 flutter 使用in_app_purchase插件升降级订阅时报错PG-GEMF-01。 解决方案&#xff1a; 升降级订阅时&#xff0c;确保不调用 MethodCallHandlerImpl.java文件中的 setObfuscatedAccountId()方法、setObfuscatedProfileId()方法 原因&#xf…

Docker 容器隔离关键技术:Capabilities

Docker 容器隔离关键技术&#xff1a;Capabilities 在 Docker 中&#xff0c;Capabilities 是一种权限管理技术&#xff0c;它将 Linux 系统中传统的超级用户&#xff08;root&#xff09;权限拆分为多个独立的小权限&#xff08;目前为 38 项&#xff09;。这使得我们可以为容…

蓝桥杯备赛笔记(一)

这里的笔记是关于蓝桥杯关键知识点的记录&#xff0c;有别于基础语法&#xff0c;很多内容只要求会用就行&#xff0c;无需深入掌握。 文章目录 前言一、编程基础1.1 C基础格式和版本选择1.2 输入输出cin和cout&#xff1a; 1.3 string以下是字符串的一些简介&#xff1a;字符串…

【Redis】Redis介绍

目录 1.Redis是什么? 2. Redis特性 2.1 速度快 2.2 基于键值对的数据结构服务器 2.3 丰富的功能 2.4 简单稳定 2.5 客户端语言多 2.6 持久化 2.7 主从复制 2.8 高可用和分布式 3. Redis使用场景 3.1 缓存(Cache) 3.2 排行榜系统 3.3 计数器应用 3.4 社交网络 …

Redis使用场景-缓存-缓存穿透

前言 之前在针对实习面试的博文中讲到Redis在实际开发中的生产问题&#xff0c;其中缓存穿透、击穿、雪崩在面试中问的最频繁&#xff0c;本文加了图解&#xff0c;希望帮助你更直观的了解缓存穿透&#x1f600; &#xff08;放出之前写的针对实习面试的关于Redis生产问题的博…

STM32 ADC --- 多通道序列采样

STM32 ADC — 序列通道采样 文章目录 STM32 ADC --- 序列通道采样CubeMX配置代码编写总结 CubeMX配置 使用cubeMX生成HAL工程 扫描模式在配置多个通道时会自动变为Enable&#xff0c;这里需要注意的是需要将连续转换模式配置为Disable&#xff0c;将结束转换选择选择为每个通道…

树莓派2安装jupyterlab以便更好的编程体验

树莓派2 是一款很老的开发板了&#xff0c;但是它还能继续战斗。为了更好的编程体验&#xff0c;准备安装jupyterlab 安装jupyterlab 使用命令&#xff1a; pip install jupyterlab 该过程非常漫长&#xff0c;因为树莓派2是很老的板子&#xff0c;它需要安装一些arm7版本的…