type
status
date
slug
summary
tags
category
icon
password

一、Bootloader

对于Linux与Windows
notion image
对于单片机没那么复杂:
上电后,先运行的程序被称为 BootLoader。它的作用和工作流程如下: ① 判断是否需要升级固件,如果无需升级,就启动 Flash 另一个区域的应用程序 ② 如果需要升级,通过 OTA 数据包交互协议,接收新版本的软件、烧录到 FLASH 上,然后设置升级标志位并重启 ③ 重启后运行的仍然是 Bootloader,它根据标志位启动新版本的软件。

二、STM32启动流程

如果一上电就启动APP没有bootloader
CPU从0启动,映射到flash的起始地址(假设是0x80000000),一上电,首先CPU读取4个四个字节存入CPU的SP寄存器(栈),再读4个字节Reset handle存入PC寄存器(跳转执行,这就是 CPU 运行的第 1 个指令)
notion image
现在有Bootloader,Bootloader要模仿硬件的操作完成读取功能,之前是硬件完成的
但是中断函数都保存在哪里呢,在APP前面的异常向量表,如果发生某些中断,CPU根据异常号找到异常向量表找到对应的函数。所以第一步是把异常向量表的基地址告诉CPU和设置CPU的寄存器。再是1存入SP、2存入PC
notion image
📌
中断向量表、SP、PC 栈指针 (SP) 是一个指针,指向堆栈(Stack)的顶部。堆栈用于存储函数调用时的返回地址、本地变量、中断处理等数据。复位后,SP 必须指向一个有效的内存区域,以确保堆栈操作可以正常进行。否则,任何涉及堆栈的操作(如函数调用、中断处理等)都会导致程序崩溃。0x08040000 程序计数器 (PC) 决定了微控制器下一条要执行的指令地址。PC 指向的地址就是程序开始执行的地方。复位后,微控制器需要知道从哪里开始执行程序。向PC加载地址是启动程序的关键步骤。0x08040004 中断向量表(vtor):如果没有bootloader,一开始是存在flash的最前面,现在有bootloader,需要把中断向量表的基地址设置为APP区的最开始处。0x08040000
 

三、编写Bootloader启动程序

S1、编写一个点灯APP,配置keil工程R0=0x08040000,空出开头位置,并取消默认中断向量表基地址,此时灯不亮,因为程序从flash的首地址0x08000000开始跑的
notion image
S2、新创建一个工程,默认就是0x08000000开始,编写jump.s,设置中断向量表基地址(汇编),并实现由bootloader打开后面的APP
现在先把app烧进去,再把包含jump.s,main.c的bootloader程序烧进去,灯就可以亮了

四、编写Bootloader下载程序

可以自定义下载协议,当然,下面展示最简单的过程,更严格的需要有一定的抗干扰性
① Bootloader 发出获取固件信息的请求:发出“1”字符给上位机 ② 上位机发送固件信息:先发出 5 个“0x5a”数据给下位机,用于同步,再发送固件信息。 固件信息如下定义:
③ 下位机决定升级,Bootloader 发出获取固件的请求:发出“2”字符给上位机 ④ 上位机发送 bin 文件给bootloader,bootloader(1、计算CRC;2、对比结构体里的固件信息CRC比较) ⑤ 若无误,Bootloader 烧写,可以发送进度:“$1%”、“$2%”、“$100%”。以字符“$” 开头、字符“%”结束。
 
相关文章
Modbus超时等待时间:太大太小都不行!Linux驱动设计思想
Loading...