STM32F103_Bootloader程序开发02 - Bootloader程序架构与STM32F103ZET6的Flash内存规划

news2025/5/26 5:24:36

导言


在这里插入图片描述
在工业设备和机器人项目中,固件远程升级能力已成为提升设备维护性与生命周期的关键手段。本文将围绕STM32平台,系统性介绍一个简洁、可靠的Bootloader程序设计思路。
我们将Bootloader核心流程划分为五大功能模块:

  1. 启动入口与升级模式判断
  2. 通讯协议与指令解析
  3. 固件接收与缓存校验
  4. Flash操作与写入
  5. App跳转

每个模块各司其职,既保证了流程的清晰、易维护,又为后续功能拓展(如安全保护、异常处理)预留了接口。通过模块化设计,能够高效实现与上位机的安全固件升级,显著提升系统的可靠性和可维护性。

一、Flash内存规划


在这里插入图片描述

  1. bootloader区

    • 起始地址:0x08000000
    • 结束地址:0x0800FFFF
    • 大小:64KB,64KB 对于STM32F1系列的Bootloader来说很充裕,哪怕实现了自检、协议解析、升级管理、App校验等功能,也有足够空间。典型的Bootloader通常只用16~32KB就够了,这里预留较大,是为了后续扩展或协议变化更灵活,属于稳健做法。
  2. App区

    • 起始地址:0x08010000
    • 结束地址:0x0803FFFF
    • 大小:192KB,192KB 足够一般工业/机器人App使用(一般完整功能带RTOS、通信协议、复杂逻辑都能放下)。保证了App区块独立、可整体擦写与升级,方便Bootloader进行管理。
  3. App缓存区(固件下载区)

    • 起始地址:0x08040000
    • 结束地址:0x0806FFFF
    • 大小:192KB
    • 下载新固件时,通常Bootloader先将完整固件文件存入缓存区,校验无误后再整体拷贝到App区,这样升级失败不会影响当前运行的App。
    • 192KB 与App区同样大小,保证可下载“完整体积的App”,合理且安全。避免了外部Flash,采用片上Flash空间做双区,适合资源有限的场合。
  4. 参数区(自由使用)

    • 起始地址:0x08070000
    • 结束地址:0x0807FFFF
    • 大小:64KB,64KB 远大于通常的参数/配置/校准区需求(实际很多项目12页即816KB即可),你这里留足余量,方便后续做历史数据、日志、频繁参数备份等。参数区建议采用“页擦写+参数备份+断电校验”策略,提高可靠性。

二、代码


2.1、flash_map.h

将上面的分区细节,落实到代码flash_map.h。

/**
 * @file    flash_map.h
 * @brief   STM32F103ZET6 Flash分区地址与大小常量定义
 * @author  Wallace.zhang
 * @date    2025-05-25
 * @version 1.0.0
 * @copyright
 * (C) 2025 Wallace.zhang. 保留所有权利.
 * @license SPDX-License-Identifier: MIT
 */

#ifndef __FLASH_MAP_H
#define __FLASH_MAP_H

#ifdef __cplusplus
extern "C" {
#endif

/** 
 * @brief STM32F103ZET6 Flash 基础参数
 */
#define STM32_FLASH_BASE_ADDR      0x08000000U      /**< Flash起始基地址 */
#define STM32_FLASH_SIZE           (512 * 1024U)    /**< Flash总大小(字节) */
#define STM32_FLASH_PAGE_SIZE      (2 * 1024U)      /**< Flash单页大小(字节) */

/**
 * @brief Bootloader区
 */
#define FLASH_BOOT_START_ADDR      0x08000000U      /**< Bootloader起始地址 */
#define FLASH_BOOT_END_ADDR        0x0800FFFFU      /**< Bootloader结束地址 */
#define FLASH_BOOT_SIZE            (FLASH_BOOT_END_ADDR - FLASH_BOOT_START_ADDR + 1) /**< Bootloader区大小 */

/**
 * @brief 主程序App区
 */
#define FLASH_APP_START_ADDR       0x08010000U      /**< App起始地址 */
#define FLASH_APP_END_ADDR         0x0803FFFFU      /**< App结束地址 */
#define FLASH_APP_SIZE             (FLASH_APP_END_ADDR - FLASH_APP_START_ADDR + 1)   /**< App区大小 */

/**
 * @brief App缓存区(新固件下载区)
 */
#define FLASH_DL_START_ADDR        0x08040000U      /**< 下载区起始地址 */
#define FLASH_DL_END_ADDR          0x0806FFFFU      /**< 下载区结束地址 */
#define FLASH_DL_SIZE              (FLASH_DL_END_ADDR - FLASH_DL_START_ADDR + 1)     /**< 下载区大小 */

/**
 * @brief 参数区(用户参数、历史数据等)
 */
#define FLASH_PARAM_START_ADDR     0x08070000U      /**< 参数区起始地址 */
#define FLASH_PARAM_END_ADDR       0x0807FFFFU      /**< 参数区结束地址 */
#define FLASH_PARAM_SIZE           (FLASH_PARAM_END_ADDR - FLASH_PARAM_START_ADDR + 1) /**< 参数区大小 */

#ifdef __cplusplus
}
#endif

#endif /* __FLASH_MAP_H */

三、Keil配置


3.1、bootloader程序的Keil配置

在这里插入图片描述

3.2、App程序的Keil配置

在这里插入图片描述

四、细节补充


4.1、STM32F103ZET6的Flash布局

在这里插入图片描述
STM32F103ZET6属于大容量产品,内存块划分为256个2K字节页。 从这个知识可以得到如下信息:

  1. Bootloader:第0页到第31页(共32页)
  2. App:第32页到第127页(共96页)
  3. App缓存区:第128页到第223页(共96页)
  4. 参数区:第224页到第255页(共32页)
    在这里插入图片描述

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

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

相关文章

通过Auto平台与VScode搭建远程开发环境(以Stable Diffusion Web UI为例)

文章目录 Stable Diffusion Web UI一、&#x1f3af;主要功能概述二、&#x1f9e0;支持的主要模型体系三、&#x1f4e6;安装方式简述✅ 一、前提准备✅ 二、安装步骤混乱版本&#xff08;仅用于记录测试过程&#xff09;第一步&#xff1a;克隆仓库&#xff08;使用清华大学镜…

Unity 打包程序全屏置顶无边框

该模块功能: 1. 打包无边框 2. 置顶 3. 不允许切屏 4.多显示器状态下,程序只在主显示上运行 5.全屏 Unity 打包设置: 如果更改打包设置,最好将Version版本增加一下,否则可能不会覆盖前配置文件 代码: 挂在场景中即可 using UnityEngine; using System; // 确保这行存…

GAMES104 Piccolo引擎搭建配置

操作系统&#xff1a;windows11 家庭版 inter 17 12 th 显卡&#xff1a;amd 运行内存&#xff1a;>12 1、如何构建&#xff1f; 在github下载&#xff1a;网址如下 https://github.com/BoomingTech/Piccolo 下载后安装 git、vs2022 Git Visual Studio 2022 IDE - …

用service 和 SCAN实现sqlplus/jdbc连接Oracle 11g RAC时负载均衡

说明 11.2推出的SCAN &#xff0c;简化了客户端连接&#xff08;当增加或者减少RAC实例时&#xff0c;不需要修改客户端配置&#xff0c;并且scan listener有各个实例的负载情况&#xff0c;可以实现连接时负载均衡。 不过客户端需要使用专门建立的service,而不能用RAC数据库…

防火墙流量管理

带宽管理介绍 针对企业用户流量&#xff0c;防火墙提供了带宽管理功能&#xff0c;基于出/入接口、源/目的安全区域、源/目的地址、时间段、报文DSCP优先级等信息&#xff0c;对通过自身的流量进行管理和控制。 带宽管理提供带宽限制、带宽保证和连接数限制功能&#xff0c;可…

Linux系统移植①:uboot概念

Linux系统移植①&#xff1a;uboot概念 uboot概念 1、uboot是一个比较复杂的裸机程序。 2、uboot就是一个bootloader,作用就是用原于启动Linux或其他系统。uboot最主要的工作就是初始化DDR。因为Linux是运行再DDR里面的。一般Linux镜像zImage&#xff08;uImage&#xff09;设…

DAY 35

import torch import torch.nn as nn import torch.optim as optim from sklearn.datasets import load_iris from sklearn.model_selection import train_test_split from sklearn.preprocessing import MinMaxScaler import time import matplotlib.pyplot as plt# 设置GPU设…

AWS EC2实例安全远程访问最佳实践

EC2 远程连接方案对比 远程访问 Amazon EC2 实例主要有以下四种方式&#xff1a; Secure Shell (SSH) 远程访问AWS Systems Manager 会话管理器适用于 Linux 实例的 EC2 Serial ConsoleAmazon EC2 Instance Connect SSH 远程访问 SSH&#xff08;Secure Shell&#xff09;广…

【强化学习】#7 基于表格型方法的规划和学习

主要参考学习资料&#xff1a;《强化学习&#xff08;第2版&#xff09;》[加]Richard S.Suttion [美]Andrew G.Barto 著 文章源文件&#xff1a;https://github.com/INKEM/Knowledge_Base 本章更是厘清概念厘到头秃&#xff0c;如有表达不恰当之处还请多多指教—— 概述 环境…

EasyRTC嵌入式音视频通信SDK一对一音视频通信,打造远程办公/医疗/教育等场景解决方案

一、方案概述​ 数字技术发展促使在线教育、远程医疗等行业对一对一实时音视频通信需求激增。传统方式存在低延迟、高画质及多场景适配不足等问题&#xff0c;而EasyRTC凭借音视频处理、高效信令交互与智能网络适配技术&#xff0c;打造稳定低延迟通信&#xff0c;满足基础通信…

网络安全-等级保护(等保) 3-2-1 GB/T 28449-2019 第6章 方案编制活动

################################################################################ GB/T 28449-2019《信息安全技术 网络安全等级保护测评过程指南》是规定了等级测评过程&#xff0c;是纵向的流程&#xff0c;包括&#xff1a;四个基本测评活动:测评准备活动、方案编制活…

【免费使用】剪Y专业版 8.1/CapCut 视频编辑处理,素材和滤镜

—————【下 载 地 址】——————— 【​本章下载一】&#xff1a;https://pan.xunlei.com/s/VOQxk38EUe3_8Et86ZCH84JsA1?pwdkp7h# 【​本章下载二】&#xff1a;https://pan.quark.cn/s/388008091ab4 【​本章下载三】&#xff1a;https://drive.uc.cn/s/d5ae5c725637…

实现rpc通信机制(待定)

一、概述 &#xff08;1&#xff09;rpc&#xff08;remote procedure call, 远程接口调用&#xff09;,就像在本地调用函数一样&#xff0c;是应用组成服务内部分布式的基础功能。应用场景是在内网中的计算&#xff0c;比如&#xff1a;(a) 为上传的一张图片加水印、&#xf…

代码随想录打卡|Day45 图论(孤岛的总面积 、沉没孤岛、水流问题、建造最大岛屿)

图论part03 孤岛的总面积 代码随想录链接 题目链接 视频讲解链接 思路&#xff1a;既然某个网格在边界上的岛屿不是孤岛&#xff0c;那么就把非 孤岛的所有岛屿变成海洋&#xff0c;最后再次统计还剩余的岛屿占据的网格总数即可。 dfs&#xff1a; import java.util.Scanner…

SpringCloud实战:使用Sentinel构建可靠的微服务熔断机制

上篇文章简单介绍了SpringCloud系列Gateway的基本用法以及Demo搭建&#xff0c;今天继续讲解下SpringCloud Gateway实战指南&#xff01;在分享之前继续回顾下本次SpringCloud的专题要讲的内容&#xff1a; 本教程demo源码已放入附件内 技术准备 读者须知&#xff1a; 本教程…

张 Prompt Tuning--中文数据准确率提升:理性与冲动识别新突破

Prompt Tuning–中文数据准确率提升:理性与冲动识别新突破 中文数据,准确率 数据标签三类:冲动21,理性21,(中性设为理性40:说明prompt 修正的有效性) 测试数据:冲动4,理性4,中性设为理性10 为了可视化做了 词嵌入 空间的相似文本计算,但是实际当loss 比较小的时…

深入解析 MySQL 中的 SHOW_ROUTINE 权限

目录 前言 权限作用 授权方法 MySQL8.0.20以上 MySQL8.0.20以下 总结 前言 SHOW_ROUTINE 是 MySQL 中用于控制用户查看存储过程和函数定义的权限。拥有该权限的用户可以通过 SHOW CREATE PROCEDURE 和 SHOW CREATE FUNCTION 等语句查看存储过程和函数的详细定义&#xff…

电脑网络如何改ip地址?ip地址改不了怎么回事

在日常使用电脑上网时&#xff0c;我们有时会遇到需要更改IP地址的情况&#xff0c;比如访问某些受限制的网站、解决网络冲突问题&#xff0c;或者出于隐私保护的需求。然而&#xff0c;许多用户在尝试修改IP地址时可能会遇到各种问题&#xff0c;例如IP地址无法更改、修改后无…

打开小程序提示请求失败(小程序页面空白)

1、小程序代码是商城后台下载的还是自己编译的 &#xff08;1&#xff09;要是商城后台下载的&#xff0c;检查设置里面的域名是不是https的 &#xff08;2&#xff09;要是自己编译的&#xff0c;检查app.js里面的接口域名是不是https的&#xff0c;填了以后有没有保存 注&a…

一张纸决定的高度

从我捧起《格局》这个本书开始&#xff0c;转眼间两个月过去了。 回头望一望&#xff0c;好似还在昨天。 这两个月&#xff0c;心态在变&#xff0c;前进的方向在变&#xff0c;但唯一不变的就是每天晚上睡前&#xff0c;留给自己十分钟的读书时光。 我也从来没想过&#xf…