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 解锁 FLASH
    if (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 锁住 FLASH
    HAL_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读取。

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

银河麒麟桌面系统——桌面鼠标变成x,窗口无关闭按钮的解决办法

银河麒麟桌面系统——桌面鼠标变成x&#xff0c;窗口无关闭按钮的解决办法 1、支持环境2、详细操作说明步骤1&#xff1a;用root账户登录电脑步骤2&#xff1a;导航到kylin-wm-chooser目录步骤3&#xff1a;编辑default.conf文件步骤4&#xff1a;重启电脑 3、结语 &#x1f49…

【自动化Selenium】Python 网页自动化测试脚本(上)

目录 1、Selenium介绍 2、Selenium环境安装 3、创建浏览器、设置、打开 4、打开网页、关闭网页、浏览器 5、浏览器最大化、最小化 6、浏览器的打开位置、尺寸 7、浏览器截图、网页刷新 8、元素定位 9、元素交互操作 10、元素定位 &#xff08;1&#xff09;ID定位 &…

【PTA】【数据库】【SQL命令】编程题2

数据库SQL命令测试题2 测试题目录 10-1 查询“李琳”老师所授课程的课程名称10-2 查询成绩比所有课程的平均成绩高的学生的学号及成绩10-3 创建带表达式的视图StuView10-4 从视图PerView中查询数据10-5 查询工资高于在“HR”部门工作的所有员工的工资的员工信息10-6 查询选修的…

深入浅出摸透AIGC文生图产品SD(Stable Diffusion)

hihi,朋友们,时隔半年(24年11月),终于能腾出时间唠一唠SD了🤣,真怕再不唠一唠,就轮不到SD了,技术更新换代是在是太快! 朋友们,最近(24年2月)是真的没时间整理笔记,每天都在疯狂的学习Stable Diffusion和WebUI & ComfyUI,工作实在有点忙,实践期间在飞书上…

蓝桥杯c++算法秒杀【6】之动态规划【下】(数字三角形、砝码称重(背包问题)、括号序列、异或三角:::非常典型的必刷例题!!!)

别忘了请点个赞收藏关注支持一下博主喵&#xff01;&#xff01;&#xff01;! ! ! ! &#xff01; 关注博主&#xff0c;更多蓝桥杯nice题目静待更新:) 动态规划 三、括号序列 【问题描述】 给定一个括号序列&#xff0c;要求尽可能少地添加若干括号使得括号序列变得合…

24.100ASK_T113-PRO 驱动摄像头(V4L2)

1.在buildroot 中使能 V4L库 使用make menuconfig命令之后弹出编译菜单选项&#xff1a; 2.按下 / 输入 "libv4l 后回车进行搜索&#xff0c;有2个搜索结果&#xff0c; 3.按下 1 进行跳转 4.按下 / 输入 fswebcam 后回车进行搜索&#xff0c;有1个搜索结果&#xff0c; …

【测试工具JMeter篇】JMeter性能测试入门级教程(二)出炉,测试君请各位收藏了!!!

上篇文章&#xff1a;CSDN 我们介绍了JMeter的一些原理介绍&#xff0c;以及安装配置和启动流程&#xff0c;本文我们就来讲讲JMeter如何使用。 一、JMeter目录结构组成 1. 根目录 Jmeter安装包解压后的根目录如下图&#xff1a; 1.1 backups目录&#xff1a;脚本备份目录&am…

C语言学习 12(指针学习1)

一.内存和地址 1.内存 在讲内存和地址之前&#xff0c;我们想有个⽣活中的案例&#xff1a; 假设有⼀栋宿舍楼&#xff0c;把你放在楼⾥&#xff0c;楼上有100个房间&#xff0c;但是房间没有编号&#xff0c;你的⼀个朋友来找你玩&#xff0c;如果想找到你&#xff0c;就得挨…

【pyspark学习从入门到精通19】机器学习库_2

目录 估计器 分类 回归 聚类 管道 估计器 估计器可以被看作是需要估算的统计模型&#xff0c;以便对您的观测值进行预测或分类。 如果从抽象的 Estimator 类派生&#xff0c;新模型必须实现 .fit(...) 方法&#xff0c;该方法根据在 DataFrame 中找到的数据以及一些默认或…

微服务篇-深入了解使用 RestTemplate 远程调用、Nacos 注册中心基本原理与使用、OpenFeign 的基本使用

&#x1f525;博客主页&#xff1a; 【小扳_-CSDN博客】 ❤感谢大家点赞&#x1f44d;收藏⭐评论✍ 文章目录 1.0 认识微服务 1.1 单体架构 1.2 微服务 1.3 SpringCloud 框架 2.0 服务调用 2.1 RestTemplate 远程调用 3.0 服务注册和发现 3.1 注册中心原理 3.2 Nacos 注册中心 …

C语言解析命令行参数

原文地址&#xff1a;C语言解析命令行参数 – 无敌牛 欢迎参观我的个人博客&#xff1a;无敌牛 – 技术/著作/典籍/分享等 C语言有一个 getopt 函数&#xff0c;可以对命令行进行解析&#xff0c;下面给出一个示例&#xff0c;用的时候可以直接copy过去修改&#xff0c;很方便…

深度学习:GPT-1的MindSpore实践

GPT-1简介 GPT-1&#xff08;Generative Pre-trained Transformer&#xff09;是2018年由Open AI提出的一个结合预训练和微调的用于解决文本理解和文本生成任务的模型。它的基础是Transformer架构&#xff0c;具有如下创新点&#xff1a; NLP领域的迁移学习&#xff1a;通过最…

过滤条件包含 OR 谓词,如何进行查询优化——OceanBase SQL 优化实践

这篇博客涉及两个点&#xff0c;一个是 “OR Expansion 改写”&#xff0c;另一个是 “基于代价的改写”。 背景 在写SQL查询时&#xff0c;难以避免在过滤条件中使用 OR 谓词&#xff0c;但其往往会导致索引利用效率下降的问题 。本文将分享如何通过查询改写的2种方式进行优化…

C语言函数递归经典题型——汉诺塔问题

一.汉诺塔问题介绍 Hanoi&#xff08;汉诺&#xff09;塔问题。古代有一个梵塔&#xff0c;塔内有3个座A、B、C&#xff0c;开始时&#xff21;座上有64个盘子&#xff0c;盘子大小不等&#xff0c;大的在下&#xff0c;小的在上。有一个老和尚想把这64个盘子从&#xff21;座移…

【Python】九大经典排序算法:从入门到精通的详解(冒泡排序、选择排序、插入排序、归并排序、快速排序、堆排序、计数排序、基数排序、桶排序)

文章目录 1. 冒泡排序&#xff08;Bubble Sort&#xff09;2. 选择排序&#xff08;Selection Sort&#xff09;3. 插入排序&#xff08;Insertion Sort&#xff09;4. 归并排序&#xff08;Merge Sort&#xff09;5. 快速排序&#xff08;Quick Sort&#xff09;6. 堆排序&…

lua除法bug

故事背景&#xff0c;新来了一个数值&#xff0c;要改公式。神奇的一幕出现了&#xff0c;公式算出一个非常大的数。排查是lua有一个除法bug,1除以大数得到一个非常大的数。 function div(a, b)return tonumber(string.format("%.2f", a/b)) end print(1/73003) pri…

STM32 USART串口发送+接收

单片机学习&#xff01; 目录 前言 一、串口发送配置步骤 二、详细步骤 2.1 RCC开启USART和GPIO时钟 2.2 GPIO初始化 2.3 配置USART 2.4 开启USART 2.5 总初始化代码 三、接收数据 3.1 查询方法 3.2 中断方法 3.2.1 中断配置 3.2.2 接收函数 总结 前言 上篇博文介…

网络安全事件管理

一、背景 信息化技术的迅速发展已经极大地改变了人们的生活&#xff0c;网络安全威胁也日益多元化和复杂化。传统的网络安全防护手段难以应对当前繁杂的网络安全问题&#xff0c;构建主动防御的安全整体解决方案将更有利于防范未知的网络安全威胁。 国内外的安全事件在不断增…

AIGC--AIGC与人机协作:新的创作模式

AIGC与人机协作&#xff1a;新的创作模式 引言 人工智能生成内容&#xff08;AIGC&#xff09;正在以惊人的速度渗透到创作的各个领域。从生成文本、音乐、到图像和视频&#xff0c;AIGC使得创作过程变得更加快捷和高效。然而&#xff0c;AIGC并非完全取代了人类的创作角色&am…

【数据结构实战篇】用C语言实现你的私有队列

&#x1f3dd;️专栏&#xff1a;【数据结构实战篇】 &#x1f305;主页&#xff1a;f狐o狸x 在前面的文章中我们用C语言实现了栈的数据结构&#xff0c;本期内容我们将实现队列的数据结构 一、队列的概念 队列&#xff1a;只允许在一端进行插入数据操作&#xff0c;在另一端…