Bootloader+APP调试技巧

当单片机已下载过bootloader程序后,我们在编写应用程序时,无法直接使用keil的下载和在线调试功能,这非常不方便,只需执行一个小设置,即可完美解决,就像没有bootloader一样

1 设置中断向量

这个步骤在任何需要bootloader的项目都需要设置

打开startup_stm32f429xx.s文件,找到语句 LDR R0, =SystemInit,大概在第180行附近,在这句之前添加以下代码:

c 复制代码
	;/* 在调用SystemInit之前先设置VTOR */
    LDR R0, =0x08080000      ; 应用程序起始地址
    LDR R1, =0xE000ED08      ; SCB->VTOR地址
    STR R0, [R1]             ; SCB->VTOR = 0x08080000

为什么要在这里设置?

有些资料中说在进入main函数之后执行,如下:

这种方法有些情况下没有问题,但单片机启动后实际会先执行SystemInit函数,再进入main函数,这个过程如果发生中断,则PC会跳转到错误的地址,引起程序崩溃,所以最好尽早设置VTOR。

有些情况下,即使在.s中设置了VTOR,程序仍然可能会死机,这可能是由于SystemInit函数中重置了VTOR,此时,只要在main函数中也添加设置VTOR即可解决。

设置程序偏移:

2 修改编程算法

keil下载时默认从0x08000000处开始擦除和编程,通过下面一步设置,可使编程操作跳过bootloader所在区域

注意size不要设置地小于应用程序大小

现在可以直接下载了,在线调试也不受影响,bootloader程序会正常运行

相关推荐
星夜夏空993 小时前
STM32单片机学习(11)——GPIO输入实验
stm32·单片机·学习
黑白园3 小时前
STM32F103ZET6移植-电机2804-驱动板SimpleFOC Mini实现速度开环_位置开环控制(二、代码移植及功能实现)
stm32·单片机·嵌入式硬件
星夜夏空9913 小时前
STM32单片机学习(10)——GPIO输入
stm32·单片机·学习
黑白园19 小时前
I2C_GPIO模拟 读取AS5600编码器数据
stm32·单片机·嵌入式硬件
羽获飞19 小时前
从零开始学嵌入式之STM32——34.ADC-模数转换
stm32·单片机·嵌入式硬件
羽获飞19 小时前
从零开始学嵌入式之STM32——33.直接存储器访问-DMA
stm32·单片机·嵌入式硬件
jllllyuz20 小时前
stm32“多串口并发采集 + 无线传输”系统实现
stm32·单片机·嵌入式硬件
LCG元20 小时前
STM32实战:基于STM32F103的简易示波器(ADC+DMA+LCD)
stm32·单片机·嵌入式硬件
木木_王1 天前
嵌入式学习 | STM32裸板驱动开发(Day01)入门学习笔记(超详细完整版|点灯实验 + 库函数代码 + 原理全解)
linux·驱动开发·笔记·stm32·学习