STM32F103C8T6 IAP升级

news2024/10/7 8:29:09

目录

  • 0x00 前言
  • 0x01 flash分区
  • 0x02 Bootloader
  • 0x02 APP设置
  • 0x03 升级程序编写
  • 0x04 固件烧录

0x00 前言

STM32有三种烧录程序的方式:烧录器下载、拉高boot1进行串口下载(ISP)还有通过在 Bootloader中进行flash擦除和写入(IAP)。

在进行开发之前,你需要了解一下Bootloader是什么。

Bootloader是嵌入式系统在加电后执行的第一段代码,也称为引导加载程序。它不属于操作系统内核,而是在操作系统内核或用户程序运行之前运行。

举个简单的例子。例如我的拓竹3D打印机,在开机之后,它的Bootloader会进行硬件自检、联网检查固件等操作,而一旦发现了有新版本的固件可以用,那么它就会提示你需要更新后才能使用,更新后它便会开始执行新的固件。

假设这台3D打印机的用到的芯片是STM32,那么它是如何实现这个操作的呢?

首先你的设备flash中,需要存储下一个Bootloader引导分区,然后是一个app应用分区。
当你的决定升级时,那么你就需要将app应用分区的内容擦除,然后用你的新固件去覆盖。
或者你决定不升级,那么在Bootloader程序结束后,直接进入到app应用分区之中。

那么你现在需要做的,就是编写一个Bootloader程序,然后再编写一个APP程序,并确保在bootloader程序结束后,能够准确的进入到app应用之中。你需要确保你的 STM32 flash够大,可以同时存下这两个程序。如果你有特殊需求,你甚至可以编写多个应用分区,以满足你不同的需求。

STM32的flash起始地址是0x0800 0000,八百万,很好记。意味着你每一次烧录程序,都是将程序从这个地址开始烧录;也代表着系统再运行的时候,每一次都是从这个地址开始加载程序。

至于flash结束地址,与你实际所使用的单片机有关系。本文选用了STM32F103C8T6开发板,最常见的小蓝板。它的flash大小是64kb,所以结束地址是0x0801 0000。

0x01 flash分区

做一件事情,最为重要的就是前期规划,不能想到什么做什么,这也是我最近学到的。

你需要将stm32的flash区间分为两段甚至多段。

我决定将STM32的 0x800 0000 - 0x800 2000 作为我们的Bootloader 地址段,这个段的大小大概是8KB,我之前写的Bootloader大小大概是5.6KB,分配8KB的原因为要为后续程序升级留有余地,否则牵一发而动全身,到时候重新修改flash分区则会导致很多地方需要修改。
在这里插入图片描述

然后我将剩下的flash分为两个大小一致的分区,打算放下两个app分区在里面。

在这里插入图片描述

这个是APP2在flash分区中所占用的地址段
在这里插入图片描述

0x02 Bootloader

在程序启动的时候,程序会从0x0800 0000地址加载代码,然后将其搬运至RAM(0x0200 0000)中以供执行。

所以我们的Bootloader自然是从0x0800 0000 开始。

在Bootloader中,主要需要实现两个功能:

  1. 选择需要进入的分区
  2. 进入选中的分区

在这里我选择了根据按键的状态进入选中的分区,如果按键1 按下,就进入APP1,如果按键2按下,就进入APP2。

主要靠下面的代码进入到APP1分区或APP2分区。

需要关中断和设置栈顶指针

#include "stm32f10x.h"
#include "key.h"

#define 	appxaddr 			 0x08000000
#define	 	FLASH_APP1_ADDR		 0x08002000
#define 	FLASH_APP2_ADDR 	 0x08006000

void iap_load_app(u32 appxaddr)
{
	SysTick->CTRL = 0X00;//禁止SysTick
	SysTick->LOAD = 0;
    SysTick->VAL = 0;
    __disable_irq();
    jump2app=(iapfun)*(vu32*)(appxaddr+4);
    MSR_MSP(*(vu32*)appxaddr);
    jump2app();	
}

int main()
{
	Key_Init();
	while(1)
	{
		if (Key1 == 1)
			iap_load_app(FLASH_APP1_ADDR);
		if (Key2 == 1)
			iap_load_app(FLASH_APP2_ADDR);
	}
	
	return 0;
}

0x02 APP设置

在APP中,需要修改的地方比较少,需要为你的工程设置flash起始地址和flash结束地址,这样如果你编译的固件超过了规定的大小,会弹出报错来提示flash不够用。

设置完工程后,需要将中断向量地址表偏移指定长度。例如APP1之前有一个0x2000大小的Bootloader,那么你的中断向量地址表就需要偏移0x2000个字节。例如APP2,在这个地址之前有Bootloader和APP1一共0x6000大小,那么就需要偏移0x6000个字节。

如下代码,只需要加一句代码就足够

#include "stm32f10x.h"
#include "delay.h"
#include "led.h"

int main()
{
    /* 中断向量表偏移 */
    SCB->VTOR = FLASH_BASE | 0x2000;  
	
	LED_Init();
	delay_init();

	while(1)
	{
		LED_ON;
		delay_ms(1000);
		LED_OFF;
		delay_ms(1000);
	}

	return 0;
}

0x03 升级程序编写

升级程序可以直接使用正点原子的IAP例程中的iap.c和stmflash.c,修改你的触发逻辑就可以了。

比如说 单机按键1就进入app1,长按按键1 就开始接收新程序并且切入到app1分区

还有 单机按键2就进入app2,长按按键2 就开始接收新程序并且切入到app2分区

0x04 固件烧录

烧录固件时需要注意固件烧录的起始地址,不要覆盖了之前的程序。并且一定要烧录二进制文件,不能烧录16进制文件,16进制的文件包含了一些地址信息可能会导致APP无法运行。

在Keil中需要将你的Bootloader程序设置地址为 0x0800 0000,然后 size 设置为 0x2000
将你的APP1程序设置地址为 0x0800 2000,然后 size 设置为 0x4000
将你的APP2程序设置地址为 0x0800 6000,然后 size 设置为 0x4000

需要烧录三次。

写好了例程,需要的评论区留下邮箱

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

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

相关文章

上海晋名室外危废品暂存柜助力储能电站行业危废品安全储存

近日又有一台SAVEST室外危废暂存柜项目成功验收交付使用,此次项目主要用于储能电站行业废油、废锂电池等危废品的安全储存。 用户单位在日常工作运营中涉及到废油、废锂电池等危废品的室外安全储存问题。4月中旬用户技术总工在寻找解决方案的过程中搜索到上海晋名的…

蒂姆·库克解释Apple Intelligence和与ChatGPT合作的区别|TodayAI

在2024年全球开发者大会(WWDC 2024)上,苹果公司首席执行官蒂姆库克(Tim Cook)隆重介绍了公司的最新人工智能(AI)计划——Apple Intelligence,并宣布了与OpenAI的ChatGPT的合作。虽然…

突破管理瓶颈:基于前端技术的全面预算编制系统解析

前言 在现代商业环境中,预测销售数据和实际成本是每个公司CEO和领导都极为重视的关键指标。然而,由于市场的不断变化,准确地预测和管理这些数据变得愈发具有挑战性。为了应对这一挑战,建立一个高效的系统来管理和审查销售数据的重…

展位展台设计要注意的问题

1、选择专业的展台设计公司 特装比一般展位设计更要保证展台的独特性,更具可塑性。任何疑问和要求都能得到专业的解答。不论是展台的整体结构,还是展台搭建材料,都能实现良好的沟通,两方面都可以确保参加展会的双赢。 2、缜密的展…

智能家居建材,打造未来家居生活

智能家居建材,正引领着家居行业的新潮流。它融合了先进的科技与人性化的设计,为我们打造了一个充满未来感的家居新体验。 想象一下,当你走进家门,智能门锁自动识别你的身份,轻轻一推即可进入。室内环境自动调节到最舒适…

生成式人工智能 - 本地windows 11 + PyCharm运行stable diffusion流程简述

一、环境说明 硬件:本地电脑windows11、32.0 GB内存、2060的6G的卡。 软件:本地有一个python环境,主要是torch 2.2.2+cu118 二、准备工作 1、下载模型 https://huggingface.co/CompVishttps://huggingface.co/CompVis 进入上面的网址,我这里下载的是这个里面的 …

达到1k stars后,我对大模型开源教程的反思!(附教程)

前 言 “五一”节后第一个开心的消息是我们开源的大模型基础项目(https://github.com/datawhalechina/so-large-lm)已经达到1k stars⭐️了。这个开源项目是为了提供浅显易懂且前沿的大模基础知识而打造的,能收获1k个stars⭐️也是对这个项目的肯定。我为一起付出努…

软考初级网络管理员_07_网络单选题

1.观察交换机状态指示灯初步判断交换机故障,交换机运行中指示灯显示红色表示()。 警告 正常 待机 繁忙 2.通常测试网络连通性采用的命令是()。 Netstat Ping Msconfig Cmd 3.一台16端口的交换机可以产生()个冲突域? 1 4 15 16…

诊所管理系统如何重塑患者就医流程

随着信息技术的快速发展,诊所管理系统的应用正在为医疗服务带来革命性的变化。这一系统不仅仅是一种管理工具,更是一种全方位的健康管理解决方案,从诊前、诊中到诊后,为患者提供了一系列便捷、高效的服务,让患者的就医…

Java代码实现获取一个文件夹下所有文件名并输出到指定的txt文件中

当一个文件夹中文件过多时,且需要知道次序跟名称时,下面用一段Java代码来实现: 输出一个文件夹内所有的文件名并在前面标上序号,输出到一个文本文件中 最终效果 序号文件名列表 完整代码 import java.io.File; import java.i…

PostgreSql中使用to_char函数、date()函数可能会导致索引无法充分利用,导致查询速度无法提升

今天在处理接口请求速度慢的问题,惊奇的发现加了索引,但还是请求很忙。由于card_stop_info表有300w条数据,这时候关联查询非常慢,于是我加上匹配项索引,但是发现依然没有改变速度。。这时候去搜了一下才知道pgsql的to_…

随手记:uniapp图片展示,剩余的堆叠

UI效果图&#xff1a; 实现思路&#xff1a; 循环图片数组&#xff0c;只展示几张宽度就为几张图片边距的宽度&#xff0c;剩下的图片直接堆叠展示 点击预览的时候传入当前的下标&#xff0c;如果是点击堆叠的话&#xff0c;下标从堆叠数量开始计算 <template><…

比人工快100倍!给3D模型用上轻量化,老爷机也能起飞!!!!!!

3D可视化开发&#xff0c;考虑最多的要素&#xff0c;当属模型加载流畅度和应用性。但面对单位的电脑、不能升级硬盘的笔记本等&#xff0c;可能还是无法体会到模型丝滑加载的畅快。 况且3D模型数据、格式等&#xff0c;也在不断发展扩充&#xff0c;昔日手工就能“调教”的3D…

CSS Flexbox(弹性布局)

目录 &#x1f587;️什么是弹性布局&#xff1f; &#x1f587;️容器属性 ○ flex-direction ○ justify-content ○ align-items ○ flex-warp ○ align-content &#x1f587;️项目属性 ○ order ○ flex &#x1f587;️总结 提示: 如果你是小白&#xff0c;不…

CentOS7安装nginx【巨详细】

CentOS7安装nginx 安装依赖 1.安装gcc&#xff0c;nginx 编译时依赖 gcc 环境 # 安装c yum install gcc-c# 查看版本 gcc -v正常情况显示如下 2.安装openssl 安全套接字层密码库&#xff0c;用于通信加密 yum install -y openssl openssl-devel3.安装zlib,zlib 库 提供了很多…

linux搭建sftp服务

1. 添加用户及用户组 使用 groupadd sftpgroup 添加sftpgroup 用户组&#xff1b; 使用useradd -G sftpgroup -s /sbin/nologin cmssftp给sftpgroup 添加cmssftp用户&#xff1b; 使用passwd cmssftp给用户cmssftp进行设置密码(默认为:654321)。具体如下图所示&#xff1a; 2.…

Flarum 安装和使用教程

随着开源社区的日益繁荣&#xff0c;人们对社区品质的要求也越来越高。传统的 BBS 论坛模式已经难以满足现代用户对美观、便捷、互动性的需求。搭建一个现代化的高品质社区&#xff0c;成为许多网站管理者的迫切需求和共同挑战。 今天就给大家安利一款现代化的、优雅的开源论坛…

028、工具_Pipeline

Redis客户端执行一条命令分为如下四个过程: 1)发送命令 2)命令排队 3)命令执行 4)返回结果 其中1)+4)称为Round Trip Time(RTT,往返时间)。 Pipeline(它能将一组Redis命令进 行组装,通过一次RTT传输给Redis,再将这组Redis命令的执行结果按顺序返回给客户端,图3-…

2024年高考:计算机相关专业还值得选择吗?

&#x1f34e;个人博客&#xff1a;个人主页 &#x1f3c6;个人专栏&#xff1a;日常聊聊 ⛳️ 功不唐捐&#xff0c;玉汝于成 目录 前言 正文 行业竞争现状 市场饱和与新兴技术的影响 如何保持竞争力 专业与个人的匹配度判断 专业核心课程与技术能力 个人兴趣与职业…

MYSQL 三、mysql基础知识 5(变量、流程控制与游标)

一、变量 在MySQL数据库的存储过程和函数中&#xff0c;可以使用变量来存储查询或计算的中间结果数据&#xff0c;或者输出最终的结果数据。 在 MySQL 数据库中&#xff0c;变量分为 系统变量 以及 用户自定义变量 。 1.1 系统变量 1.1.1 系统变量分类 变量由系统定义…