stm32最简单的实现BootLoader

2023-05-16

    BootLoader大家应该都知道是干什么的,简单的来说就是程序开始运行前的一段程序。


在成熟的产品中,通常都是采用BootLoader方式来升级产品的程序。也就是IAP升级。
在了解完基本的实现原理后,可以做到用上位机升级(一般的产品大多采用这种方式,显得非常专业
有专用的升级软件,其实背后原理就是BootLoader升级方式)。当然还有一些联网在线升级也是如此。


网上有非常多的文件有介绍过stm32 BootLoader的实现。但是讲的可能比较深入难以理解,
实现更是无从下手。今天这里注意介绍最简单实现的方式,关键代码只有几行,每错,真的就只有
几行。

主要实现芯片是stm32f103c8t6,rom是64K


我实现的基本思路:
我们需要为BootLoader程序和APP程序分配空间,因为BootLoader程序所需要的功能比较少,所有不用
分配很多空间,如下。
BootLoader  0x8000000   0x8002000 //8K的BootLoader
APP 0x8002000 0x800D000 //44K的APP空间

64K-44K-8K=12K剩余空间用于存储其它信息


采用全部擦除方式下载BootLoader程序
采用部分擦除范式下载APP程序
在BootLoader利用函数跳转功能跳转到APP的程序地址
在APP程序中重新设计中断向量


开始制作:
1.准备一个BootLoader工程
设置下载地址


主程序如下:

		LED led0('C',13);

	void (*jump2app)();

//跳转到应用程序段
//appxaddr:用户代码起始地址.
void iap_load_app(u32 appxaddr)
{
	if(((*(vu32*)appxaddr)&0x2FFE0000)==0x20000000)	//检查栈顶地址是否合法.
	{ 
		jump2app=(void(*)())*(vu32*)(appxaddr+4);		//用户代码区第二个字为程序开始地址(复位地址)		
		MSR_MSP(*(vu32*)appxaddr);					//初始化APP堆栈指针(用户代码区的第一个字用于存放栈顶地址)
		for(int i = 0; i < 8; i++)
		{			
			NVIC->ICER[i] = 0xFFFFFFFF;	/* 关闭中断*/
			NVIC->ICPR[i] = 0xFFFFFFFF;	/* 清除中断标志位 */
		}
		jump2app();									//跳转到APP.
	}
}

int main(void)
	
{
	
	
	
		LED0=1;
		LED1=1;
		LED2=1;
		
	
	
	
		serial1_init(115200);	//串口初始化

		
		while(1)
			
		{
		
		
			PCout(13)=~	PCout(13);

			printf("我是BootLoader 5s后我要跳转到APP程序了\r\n");
			delay_ms(1000);
			printf("1\r\n");
			delay_ms(1000);
			printf("2\r\n");
			delay_ms(1000);
			printf("3\r\n");
			delay_ms(1000);
			printf("4\r\n");
			delay_ms(1000);
			printf("准备跳转\r\n");
			iap_load_app(0x8002000);		//跳转
				
		}
		
}

 

 


2.准备一个APP工程
设置下载地址


主程序如下:

 

 

 

		LED led0('C',13);


int main(void)
	
{
	
	
	
		LED0=1;
		LED1=1;
		LED2=1;
		
	
		NVIC_SetVectorTable(0x8002000,0);		//重新设置程序栈地址和中断向量表
	
		serial1_init(115200);	//串口初始化

		
		while(1)
			
		{
		
		
			PCout(13)=~	PCout(13);

			printf("hello 我是app\r\n");
			
			delay_ms(1000);
		
				
		}
		
}

将两个程序都烧录到芯片中,部分擦除方式:

 

 

运行效果:

 

 

上传一波源码吧:https://download.csdn.net/download/hes_c/10612609

串口直接升级版本带串口协议:https://download.csdn.net/download/hes_c/10612614

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

stm32最简单的实现BootLoader 的相关文章

  • 中断 0x15 函数 0x86(BIOS WAIT)在真实硬件上的运行速度比在虚拟机上慢得多?

    我一直在汇编 游戏 中编写引导加载程序 引导加载程序使用 BIOS WAIT 函数 int 0x15 ah 0x86 来实现帧之间的延迟 我正在使用 BOCHS 进行调试 一切都运行良好 时机非常完美 我还制作了一个可启动的isoisoge
  • 1.69寸SPI接口240*280TFT液晶显示模块使用中碰到的问题

    1 69寸SPI接口240 280TFT液晶显示模块使用中碰到的问题说明并记录一下 在网上买了1 69寸液晶显示模块 使用spi接口 分辨率240 280 给的参考程序是GPIO模拟的SPI接口 打算先移植到FreeRtos测试 再慢慢使用
  • STM32 暂停调试器时冻结外设

    当到达断点或用户暂停代码执行时 调试器可以停止 Cortex 中代码的执行 但是 当皮质停止在暂停状态下执行代码时 调试器是否会冻结其他外设 例如 DMA UART 和定时器 您只能保留时间 r 取决于外围设备 我在进入主函数时调用以下代码
  • 不使用预定义函数在汇编中打印字符串

    我必须在汇编中定义一个函数 该函数允许我循环遍历声明的字节字符串并使用 BIOS 中断打印它们 我处于 16 位实模式 这是一个根据教科书编写一个小引导加载程序的练习 但看起来这只是一个草稿 并且缺少一些东西 我得到了以下代码 org 0x
  • Freertos低功耗管理

    空闲任务中的低功耗Tickless处理 在整个系统运行得过程中 其中大部分时间都是在执行空闲任务的 空闲任务之所以执行 因为在系统中的其他任务处于阻塞或者被挂起时才会执行 因此可以将空闲任务的执行时间转换成低功耗模式 在其他任务解除阻塞而准
  • 为什么引导加载程序中的字节“0xea 0000 ffff”会导致计算机重新启动?

    我正在研究引导加载程序 发现了这个有趣的组件 Sends us to the end of the memory causing reboot db 0x0ea dw 0x0000 dw 0xffff 通过评论我知道它的作用 将计算机发送到
  • STM32H5 Nucleo-144 board开箱

    文章目录 开发板资料下载 目标 点亮LD1 绿 LD2 黄 和LD3 红 三个LED灯 开箱过程 博主使用的是STM32CubeMX配置生成代码 具体操作如下 打开STM32CubeMX File gt New project 选择开发板型
  • systick定时器

    systick定时器 文章目录 前言 一 前期疑惑 二 解答 1 关于systick是阻塞的吗 2 非阻塞 三 软件编写 总结 前言 这边记录systick相关知识点 一 前期疑惑 在学习systick志气啊 其实对于systick还是一脸
  • ARM 系统上的 Bootrom 与引导加载程序有什么区别

    我主要来自 x86 系统背景 其中 BIOS 固件 负责从 PowerON 加载引导加载程序 如 GRUB 进而加载操作系统 我现在一直在阅读 ARM 系统上的等效启动顺序 网上似乎有文章提到了两个术语 bootrom 和 bootload
  • STM32 Nucleo 上的上升沿中断多次触发

    我正在使用 STM32 NUCLEO F401RE 微控制器板 我有一个扬声器 经过编程 当向上 向下推操纵杆时 可以按设定的量改变频率 我的问题是 有时 通常 当向上 向下推动操纵杆时 频率会增加 减少多次 这意味着 ISR 正在执行多次
  • 使用 int 13h 读取的扇区数量多于磁道上的扇区数量

    顺序是什么int 13h with ah 02h会读19部门起始于 C H S 0 0 1 提供了 2 个磁头 每磁道 18 个扇区 每面 80 个磁道的 软盘 磁盘几何结构 或者 更一般地说 当它到达磁道 0 的末尾 磁头 0 时会发生什
  • 编写一个简单的Bootloader HelloWorld - 错误函数打印字符串

    我尝试创建一个简单的引导加载程序来打印 hello world 当我调用一个仅打印 hello world 的函数时 我可以做到这一点 但是当我调用一个函数来打印特定字符串时 什么也没有发生 为此 我使用两个文件 第一个是 boot ld
  • PWM DMA 到整个 GPIO

    我有一个 STM32F4 我想对一个已与掩码进行 或 运算的 GPIO 端口进行 PWM 处理 所以 也许我们想要 PWM0b00100010一段时间为 200khz 但随后 10khz 后 我们现在想要 PWM0b00010001 然后
  • 使用 STM32 USB 设备库将闪存作为大容量存储设备

    我的板上有这个闪存IC 它连接到我的STM32F04 ARM处理器 处理器的USB端口可供用户使用 我希望我的闪存在通过 USB 连接到 PC 时被检测为存储设备 作为第一步 我在程序中将 USB 类定义为 MSC 效果很好 因为当我将主板
  • 哪些变量类型/大小在 STM32 微控制器上是原子的?

    以下是 STM32 微控制器上的数据类型 http www keil com support man docs armcc armcc chr1359125009502 htm http www keil com support man d
  • 移动数组中的元素

    我需要一点帮助 我想将数组中的元素向上移动一个元素 以便新位置 1 包含位置 1 中的旧值 new 2 包含 old 1 依此类推 旧的最后一个值被丢弃 第一个位置的新值是我每秒给出的新值 我使用大小为 10 的数组 uint32 t TE
  • MikeOS 引导加载程序中的堆栈段

    我不明白这段代码 mov ax 07C0h Set up 4K of stack space above buffer add ax 544 8k buffer 512 paragraphs 32 paragraphs loader cli
  • 在 qemu 中将扇区加载到 RAM

    我编写了一个简单的程序 将扇区 扇区编号 2 加载到 RAM 但什么也没打印 首先 我尝试了以下引导扇区代码 org 0x7c00 mov ax 0x1000 ES BX 1000 0000 mov es ax mov bx 0x00 Lo
  • GCC 变量映射和 MISRA-C

    我主要知道两种使用 GCC 声明内存映射寄存器的方法 有许多变体 使用双字段 每个外设的数据结构等 要么使用初始化为正确地址的指针 例如volatile uint32 t pMyRegister uint32 t 0xDEADBEEFUL
  • Java Webstart 报告错误的引导加载程序选项

    我在通过 Java Webstart 运行 Java RCP 应用程序时遇到问题 这对团队中的其他人有效 但对我无效 你不就是喜欢这类问题吗 我相信问题在于它下载的是 32 位版本的应用程序 而不是 64 位版本 当我查看计算机上的 web

随机推荐

  • Mac Tesseract 4.1.1 样本训练超详细教程

    安装 Mac直接安装tesseract的话无法附带安装training tools 如果已经安装了没有training tools的tesseract xff0c 请先卸载 brew uninstall tesseract 先安装一些依赖的
  • 从 VHDX 文件恢复 (导入) WSL 2 安装

    Microsoft 官方以及常见的 WSL 导入导出方式 都是通过 wsl export 生成 tar 文件而使用 wsl import 命令完成导入 但是 有时候出于某些意外 比如系统出现严重问题需要重装 或者其他导致注册表丢失的情况 W
  • 企业发放的奖金根据利润提成。利润低于或等于100000元的,奖金可提10%; 利润高于100000元,低于200000元(100000<I≤200000)时,低于100000元的部分按10%提成,高于

    企业发放的奖金根据利润提成 利润低于或等于100000元的 xff0c 奖金可提10 利润高于100000元 xff0c 低于200000元 xff08 100000 lt I 200000 xff09 时 xff0c 低于100000元的
  • 用c语言实现辗转相除法(求两个数最大公因数的方法)

    首先解释辗转相除法的基本原理 假如有两个数a和b xff0c 也假设他们的最大公因数是c 那么a b都可以被c整除 xff0c 所以a和b之间必定相差c的整数倍 此时同理a b也是c的整数倍 接下来是解释这句话的 xff09 因为a b相当
  • nginx 日志解析

    Nginx是一个高性能的HTTP和反向代理服务器 Nginx access日志记录了web应用的访问记录 大致记录了访问方式 xff08 POST GET xff09 客户端IP 远程用户 请求时间 请求状态码 访问host地址 请求页面大
  • ContentObserver 内容改变到事件触发

    Setting 改变内容 PhoneWindowManager class SettingsObserver extends ContentObserver SettingsObserver Handler handler super ha
  • 【Python】错误:ModuleNotFoundError: No module named 'PIL'

    Python 错误 xff1a ModuleNotFoundError No module named PIL pycharm 错误 xff1a ModuleNotFoundError No module named PIL 导入模块 xf
  • IDEA设置自定义背景图

    IDEA是支持自定义背景图片的 今天在这里给大家分享一个超级简单的方法 第一步 打开idea的settings 在输入框搜索Set Background Image 第二步 右键Set Background Image选择第一个Add Ke
  • Jeston TX2-更换软件源

    1 备份原始的软件源 sudo cp etc apt sources list etc apt sources list back 2 更换软件源 输入 sudo gedit etc apt sources list 打开文件 xff0c
  • Win10安装Anaconda勾选添加环境变量后无法正常开机

    上文说到在安装Anaconda的时候 xff0c 有一步询问是否自动添加环境变量 xff0c 系统提示不推荐勾选 xff0c 但是笔者当时并不知道勾选了会出现什么样的问题 xff0c 所以尝试了一下 xff0c 勾选之后完成后面的安装 xf
  • Qt串口发送大量数据后无法接受和发送问题

    版本5 9 使用的qt官方库 xff0c 初始化什么的就不多介绍了 serialport 使用方式 xff0c 接收使用的槽函数 xff0c 如下 串口连接信号和槽 QObject connect amp qtCOM amp QSerial
  • QT使用QListWidget实现可拖拽列表

    使用自带的ListWidget控件 xff0c 实现简单 xff0c 就几行代码 xff0c 先看效果 xff1a 1 首先页面布局 xff0c 效果如下 1 1 添加一个listwidget 两个按钮 1 2 listwidget设置一下
  • 从0使用TCP手撸http服务器六

    html模板设计 xff1a 上篇我们说到通过路由去返回不同的html页面 xff0c 如果每一个页面都是一个数组的话 xff0c 那么我们可能需要很多数组 xff0c 里面很多内容都是一样的 xff0c 这样子会浪费我们单片机很多flas
  • 移植使用nr_micro_shell

    1 介绍 在使用linux和win系统的时候大家看到命令行也是很熟悉的了 xff0c 大家的第一个hello程序应该都是控制台程序 xff0c 在系统层面我们可以使用命令行操作我们的pc xff0c 那么在单片机里面通过串口怎么用命令操作单
  • 字符串——C++拼接多个字符串

    拼接多个字符串在C 43 43 的可以通过strcpy s 和srtcat s实现 xff0c 如 xff1a span class token keyword int span span class token function main
  • 使用VS CODE测试nr_micro_shell

    上篇说到使用dev c 43 43 来编译nr micro shell xff0c 整体还是很方便的 xff0c 不要写任何命令和文件就能完成编译 xff0c 但是dev c 43 43 这个工具并不是很好用 xff0c 今天使用VS CO
  • Arduino用esp8266WiFi模块连接到服务器

    昨天用串口工具测试了一波esp8266WiFi模块连接云服务 没有问题 今天我决定用芯片来控制它 xff0c 本来想用51 xff0c 后面感觉太lou xff0c 又决定要stm32 这个感觉不错 xff0c 但是32芯片查资料确实麻烦
  • 单片机用AD测量电池电压的值

    单片机的引脚最大输入电压一般为3 3V或者5 0V xff0c 电流是25ma xff0c 40ma 而电池一般有3 3V 36V不等 xff0c 电流也是好几A xff0c 超过5 0的电池一接到单片机 AD口 xff0c 可能和三星手机
  • stm32中pwm频率和占空比设置

    对于72M频率来说 xff0c 计算pwm频率是 xff1a 频率 xff1a Fpwm 61 72M arr 43 1 psc 43 1 单位 xff1a Hz 占空比 xff1a duty circle 61 TIM3 gt CCR1
  • stm32最简单的实现BootLoader

    BootLoader大家应该都知道是干什么的 xff0c 简单的来说就是程序开始运行前的一段程序 在成熟的产品中 xff0c 通常都是采用BootLoader方式来升级产品的程序 也就是IAP升级 在了解完基本的实现原理后 xff0c 可以