嵌入式开发之STM32学习笔记day22

news2025/6/7 19:14:04

STM32F103C8T6  FLASH闪存

1 FLASH简介

        STM32F1系列微控制器的FLASH存储器是一种非易失性存储器,它在微控制器中扮演着至关重要的角色。以下是对STM32F1系列FLASH存储器及其相关编程方式的扩展说明:

        【FLASH存储器的组成部分】

  1. 程序存储器:这是FLASH存储器的主要部分,用于存储微控制器运行的程序代码。程序存储器的大小取决于具体的STM32F1系列型号,通常从几KB到几十KB不等。

  2. 系统存储器:这部分存储器用于存储微控制器的启动代码和系统配置数据。系统存储器通常较小,但对微控制器的启动和运行至关重要。

  3. 选项字节:选项字节用于配置微控制器的一些特定功能,如启动模式选择、读写保护等。通过编程选项字节,可以灵活地配置微控制器的行为。

        【FLASH存储器的读写用途】

  1. 保存用户数据:利用程序存储器的剩余空间来保存掉电不丢失的用户数据。这种数据通常包括配置参数、用户设置、传感器校准数据等。

  2. 程序自我更新:通过在程序中编程(IAP),实现程序的自我更新。IAP允许微控制器在运行过程中更新其程序存储器中的内容,而无需外部编程器。

        在线编程(In-Circuit Programming – ICP)是一种通过微控制器的外部接口(如JTAG、SWD协议或系统加载程序Bootloader)下载程序的方法。ICP允许开发者在不拆卸微控制器的情况下更新程序存储器的全部内容,这在产品开发和调试阶段非常有用。

        在程序中编程(In-Application Programming – IAP)是一种利用微控制器支持的任一种通信接口(如UART、SPI、I2C等)下载程序的方法。IAP允许微控制器在运行过程中更新其程序存储器中的内容,而无需外部编程器。IAP通常用于实现固件升级、错误修复和功能扩展等。

        FLASH存储器的擦除和编程:STM32F1系列微控制器通过闪存存储器接口(外设)提供了对程序存储器和选项字节的擦除和编程功能。擦除操作通常用于清除存储器中的内容,为新的编程操作做准备。编程操作则用于将新的数据写入存储器。

        【注意事项】

  1. 擦除和编程时间:FLASH存储器的擦除和编程操作需要一定的时间,因此在设计系统时需要考虑这些操作对系统性能的影响。

  2. 擦除和编程次数:FLASH存储器的擦除和编程次数有限,通常在几千到几万次之间。因此,在设计系统时需要合理规划擦除和编程操作,以延长存储器的使用寿命。

  3. 数据保护:为了防止意外擦除或编程,STM32F1系列微控制器提供了读写保护功能。通过编程选项字节,可以启用或禁用存储器的读写保护。

2 闪存模块组织

3 FLASH基本结构

        该图展示了STM32微控制器的存储器结构,其中程序存储器(C8T6-64K)被分为多个1K大小的页面,从0x0800 0000地址开始,共有64个页面,而系统存储器包含Bootloader(2K)和选项字节(16字节),分别位于0x1FFF F000和0x1FFF F800地址。闪存存储器接口/闪存编程和擦除控制器(FPEC)负责管理程序存储器和选项字节的擦除与编程操作,同时配置读写保护,确保存储器的安全和数据的持久性。

4 FLASH解锁

        【FPEC共有三个键值】

  • RDPRT= 0x000000A5
  • KEY1 = 0x45670123
  • KEY2 = 0xCDEF89AB

        【解锁】

  • 复位后,FPEC被保护,不能写入FLASH_CR
  • 在FLASH_KEYR先写入KEY1,再写入KEY2,解锁
  • 错误的操作序列会在下次复位前锁死FPECFLASH_CR

        【加锁】

  • 设置FLASH_CR中的LOCK位锁住FPECFLASH_CR

5 访问存储器

使用指针读指定地址下的存储器:
	uint16_t Data = *((__IO uint16_t *)(0x08000000));

使用指针写指定地址下的存储器:
	*((__IO uint16_t *)(0x08000000)) = 0x1234;

其中:
	#define    __IO    volatile

6 程序存储器编程

代码如下:

FLASH_Status FLASH_ProgramHalfWord(uint32_t Address, uint16_t Data)
{
  FLASH_Status status = FLASH_COMPLETE;
  /* Check the parameters */
  assert_param(IS_FLASH_ADDRESS(Address));

  /* Wait for last operation to be completed */
  status = FLASH_WaitForLastOperation(ProgramTimeout);
  
  if(status == FLASH_COMPLETE)
  {
    /* if the previous operation is completed, proceed to program the new data */
    FLASH->CR |= CR_PG_Set;
  
    *(__IO uint16_t*)Address = Data;
    /* Wait for last operation to be completed */
    status = FLASH_WaitForLastOperation(ProgramTimeout);
    
    /* Disable the PG Bit */
    FLASH->CR &= CR_PG_Reset;
  } 
  
  /* Return the Program Status */
  return status;
}

7 程序存储器页擦除

代码如下:

FLASH_Status FLASH_ErasePage(uint32_t Page_Address)
{
  FLASH_Status status = FLASH_COMPLETE;
  /* Check the parameters */
  assert_param(IS_FLASH_ADDRESS(Page_Address));

  /* Wait for last operation to be completed */
  status = FLASH_WaitForLastOperation(EraseTimeout);
  
  if(status == FLASH_COMPLETE)
  { 
    /* if the previous operation is completed, proceed to erase the page */
    FLASH->CR|= CR_PER_Set;
    FLASH->AR = Page_Address; 
    FLASH->CR|= CR_STRT_Set;
    
    /* Wait for last operation to be completed */
    status = FLASH_WaitForLastOperation(EraseTimeout);
    
    /* Disable the PER Bit */
    FLASH->CR &= CR_PER_Reset;
  }

  /* Return the Erase Status */
  return status;
}

8 程序存储器全擦除

代码如下:

FLASH_Status FLASH_EraseAllPages(void)
{
  FLASH_Status status = FLASH_COMPLETE;

  /* Wait for last operation to be completed */
  status = FLASH_WaitForLastOperation(EraseTimeout);
  if(status == FLASH_COMPLETE)
  {
    /* if the previous operation is completed, proceed to erase all pages */
     FLASH->CR |= CR_MER_Set;
     FLASH->CR |= CR_STRT_Set;
    
    /* Wait for last operation to be completed */
    status = FLASH_WaitForLastOperation(EraseTimeout);

    /* Disable the MER Bit */
    FLASH->CR &= CR_MER_Reset;
  }

  /* Return the Erase Status */
  return status;
}

9 选项字节

  • RDP:写入RDPRT键(0x000000A5)后解除读保护
  • USER:配置硬件看门狗和进入停机/待机模式是否产生复位
  • Data0/1:用户可自定义使用
  • WRP0/1/2/3:配置写保护,每一个位对应保护4个存储页(中容量)

 9.1 选项字节编程

  • 检查FLASH_SRBSY位,以确认没有其他正在进行的编程操作
  • 解锁FLASH_CROPTWRE
  • 设置FLASH_CROPTPG位为1
  • 写入要编程的半字到指定的地址
  • 等待BSY位变为0
  • 读出写入的地址并验证数据

9.2 选项字节擦除

  • 检查FLASH_SRBSY位,以确认没有其他正在进行的闪存操作
  • 解锁FLASH_CROPTWRE
  • 设置FLASH_CROPTER位为1
  • 设置FLASH_CRSTRT位为1
  • 等待BSY位变为0
  • 读出被擦除的选择字节并做验证

10 器件电子签名

        电子签名存放在闪存存储器模块的系统存储区域,包含的芯片识别信息在出厂时编写,不可更改,使用指针读指定地址下的存储器可获取电子签名:

闪存容量寄存器

基地址:0x1FFF F7E0

大小:16

产品唯一身份标识寄存器

基地址: 0x1FFF F7E8

大小:96

 

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

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

相关文章

分词算法BBPE详解和Qwen的应用

一、TL;DR BPE有什么问题:依旧会遇到OOV问题,并且中文、日文这些大词汇表模型容易出现训练中未出现过的字符Byte-level BPE怎么解决:与BPE一样是高频字节进行合并,但BBPE是以UTF-8编码UTF-8编码字节序列而非字符序列B…

多线程下使用缓存+锁Lock, 出现“锁失效” + “缓存未命中竞争”的缓存击穿情况,双重检查缓存解决问题

多线程情况下,想通过缓存同步锁的机制去避免多次重复处理逻辑,尤其是I/0操作,但是在实际的操作过程中发现多次访问的日志 2025-06-05 17:30:27.683 [ForkJoinPool.commonPool-worker-3] INFO Rule - [vagueNameMilvusReacll,285] - embeddin…

Playwright 测试框架 - .NET

💖亲爱的技术爱好者们,热烈欢迎来到 Kant2048 的博客!我是 Thomas Kant,很开心能在CSDN上与你们相遇~💖 本博客的精华专栏: 【自动化测试】

命令行以TLS/SSL显式加密方式访问FTP服务器

昨天留了一个小尾巴~~就是在命令行或者代码调用命令,以TLS/SSL显式加密方式,访问FTP服务器,上传和下载文件。 有小伙伴可能说ftp命令不可以吗?不可以哦~~ ftp 命令本身不支持显式加密。要实现 FTP 的显式加密,可以使…

Linux配置yum 时间同步服务 关闭防火墙 关闭ESlinux

1、配置yum 1.1、Could not resolve host: mirrorlist.centos.org; 未知的错误 https://blog.csdn.net/fansfi/article/details/146369946?fromshareblogdetail&sharetypeblogdetail&sharerId146369946&sharereferPC&sharesourceRockandrollman&sharefr…

LLaMA-Factory和python版本的兼容性问题解决

引言 笔者今天在电脑上安装下LLaMA-Factory做下本地的模型调优。 从github上拉取代码git clone https://github.com/hiyouga/LLaMA-Factory.git. pycharm建立工程,按照官网指导如下: LLaMA-Factory 安装 在安装 LLaMA-Factory 之前,请确保您安装了下列依赖: 运行以…

每日算法-250605

每日算法 - 20240605 525. 连续数组 题目描述 给定一个二进制数组 nums , 找到含有相同数量的 0 和 1 的最长连续子数组,并返回该子数组的长度。 思路 前缀和 哈希表 解题过程 核心思想是将问题巧妙地转换为寻找和为特定值的子数组问题。 转换问题:我…

分布式锁-Redisson实现

目录 本地锁的局限性 Redisson解决分布式锁问题 在分布式环境下,分布式锁可以保证在多个节点上的并发操作时数据的一致性和互斥性。分布式锁有多种实现方案,最常用的两种方案是:zookeeper和redis,本文介绍redis实现分布式锁方案…

C++学习-入门到精通【14】标准库算法

C学习-入门到精通【14】标准库算法 目录 C学习-入门到精通【14】标准库算法一、对迭代器的最低要求迭代器无效 二、算法1.fill、fill_n、generate和generate_n2.equal、mismatch和lexicographical_compare3.remove、remove_if、remove_copy和remove_copy_if4.replace、replace_…

HarmonyOS运动语音开发:如何让运动开始时的语音播报更温暖

##鸿蒙核心技术##运动开发##Core Speech Kit(基础语音服务)# 前言 在运动类应用中,语音播报功能不仅可以提升用户体验,还能让运动过程更加生动有趣。想象一下,当你准备开始运动时,一个温暖的声音提醒你“…

vscode使用系列之快速生成html模板

一.欢迎来到我的酒馆 vscode,yyds! 目录 一.欢迎来到我的酒馆二.vscode下载安装1.关于vscode你需要知道2.开始下载安装 三.vscode快速创建html模板 二.vscode下载安装 1.关于vscode你需要知道 Q:为什么使用vscode? A:使用vscode写…

网页前端开发(基础进阶4--axios)

Ajax Ajax(异步的JavaScript和XML) 。 XML是可扩展标记语言,本质上是一种数据格式,可以用来存储复杂的数据结构。 可以通过Ajax给服务器发送请求,并获取服务器响应的数据。 Ajax采用异步交互:可以在不重新加载整个页面的情况下&am…

软件安全:漏洞利用与渗透测试剖析、流程、方法、案例

在数字时代,软件已深度融入生活与工作的方方面面,从手机应用到企业核心系统,软件安全至关重要。而漏洞利用与渗透测试,作为软件安全领域中相互关联的两个关键环节,一个是黑客攻击的手段,一个是安全防护的方…

Haproxy的基础配置

1、参考文档 官方文档:HAProxy version 2.2.22 - Configuration Manual 运维派配置手册:Haproxy-基础配置详解 - 运维派 Haproxy 的配置文件haproxy.cfg由两大部分组成,分别是global和proxies部分。 2、haproxy global 配置 global&…

考研系列—操作系统:冲刺笔记(1-3章)

目录 第一章 计算机系统概述 1.基本概念 2.内核态和用户态 3.中断(外中断)、异常(内中断-与当前执行的) 4.系统调用 5.操作系统引导程序 2021年真题: 6.操作系统结构 大纲新增 (1)分层结构 (2)模块化 (3)外核 7.虚拟机 第二章 进程管理 1.画作业运行的顺序和甘…

Java调用大模型API实战指南

文章目录 前言调用大模型的流程概述和基本原理获取 DeepSeek 的 API keyJava 实现调用大模型 API 的Demo进阶扩展建议 前言 随着大语言模型(如 OpenAI、DeepSeek、通义千问等)的发展,我们可以很方便地用 API 接口调用这些强大的智能助手。在…

单片机0-10V电压输出电路分享

一、原理图 二、芯片介绍 GP8101是一个PWM信号转模拟信号转换器,相当于一个PWM信号输入,模拟信号输出的DAC。此 芯片可以将占空比为0%到100%的PWM信号线性转换成0-5V或者0-10V的模拟电压,并且输出电压 精度小于1%。GP8101M可以处理高频调制的…

大模型模型部署和暴露接口

创建环境 激活案件 安装相关依赖 conda create -n fastApi python3.10 conda activate fastApi conda install -c conda-forge fastapi uvicorn transformers pytorch pip install safetensors sentencepiece protobuf 新建文件夹 mkdir App cd App touch main.py 复制代码…

2025服装收银系统推荐:智能管理助力服装商家高效经营

在服装批发零售行业,一套高效的收银系统不仅能简化日常经营流程,还能通过数据分析帮助商家优化库存、提升销售。随着AI技术的普及,现代收银系统已不再局限于简单的记账功能,而是能提供智能选品、库存预警、精准营销等进阶服务。 …

Microsoft Copilot Studio - 尝试一下Agent

1.简单介绍 Microsoft Copilot Studio以前的名字是Power Virtual Agent(简称PVA)。Power Virutal Agent是2019年出现的,是低代码平台Power Platform的一部分。当时Generative AI还没有出现,但是基于已有的Conversation AI技术,即Microsoft L…