STM32F103的boot跳转APP不成功问题排除

前言

本次使用的boot基于hal库,APP则为裸机程序,因此这种特殊的组合需要使用者自行添加一些代码来顶替hal库本身的功能。

boot情况

当前的boot完全可以启动同使用hal库的app版本,以此证明boot完全没有问题(app前需要使用__enable_irq();HAL_DeInit();HAL_Init();)

APP情况

当前使用的APP并未使用hal库,因此原本需要配置向量表偏移的地方就需要使用者亲手写了:

由于本人使用的app起点为0x3800(boot预留了4KB的空间)

c 复制代码
	NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x3800);
	__DSB();  // 数据同步屏障
	__ISB();  // 立即生效

注意点:

在裸机程序中不能在main开头直接使用向量表赋值,暂时不知道问题是什么。当前我是在RCC_Configuration();后面就可以正常使用了。

问题历程

正常情况下在app中直接使用__enable_irq();HAL_DeInit();HAL_Init();这三个函数完全就可以正常启动。

但是当前使用的APP时裸机程序,这三个函数的库并没有被包含。

猜想1

开始的猜想是这三个函数的原因,于是请AI生成了裸机程序:

但实际使用过程中APP仍然无法启动。

c 复制代码
void HAL_DeInit(void) {
    // 澶嶄綅鎵€鏈夊?栬?撅紙闄よ皟璇曟帴鍙o級
    RCC->APB1RSTR = 0xFFFFFFFF;
    RCC->APB2RSTR = 0xFFFFFFFF;
    RCC->APB1RSTR = 0x00000000;
    RCC->APB2RSTR = 0x00000000;
    
    // 鍏抽棴鎵€鏈夋椂閽?
    RCC->AHBENR = 0x00000014;  // 浠呬繚鐣橲RAM鍜孎LITF鏃堕挓
    RCC->APB1ENR = 0x00000000;
    RCC->APB2ENR = 0x00000000;
    
    // 绂佺敤SysTick
    SysTick->CTRL = 0;
}

思考

因为这三个函数现在已经都添加上了,但还是没有正常进入到APP中。另外,由于是APP,keil没办法调试看到是停在了哪一步,于是只能深入了解问题根源,查询到可以使用j-link commander来直接读取程序运行指针来判断到底是停在哪一个函数上面。于是有了如下的步骤:

1.打开j-link commander,然后连接好调试器,开机,在j-link commander中输入"connect"------》回车默认------》输入S选择SWD调试方式------》回车默认速率------》输入"h"可以看到当前打运行指针掉到了哪里

查函数指针

在这里可以看到R14(LR)的指针调到了FFFFFFF9,此时就要看MSP指针了。

(0xFFFFFFF9对应MSP主堆栈,0xFFFFFFFD对应PSP线程堆栈)

查MSP

MSP地址+24就是实际卡住的函数地址。↓

(MSP+0 ~ MSP+15:R0-R3寄存器值

MSP+16:R12寄存器值

MSP+20:LR(链接寄存器)值

MSP+24:PC(程序计数器)值(发生异常的指令地址))

然后根据得到的地址查找大概

我查到的指针是掉落在了NVIC_Init和NVIC_SetVectorTable之间,由此可以大概判断出与向量表相关。

查当前向量表地址

输入

mem32 0xE000ED08 1

来查询当前的向量偏移是多少

我查到的是初始地址:0x08000000

这代表向量表根本没有进行偏移,然后就需要手动向APP中添加向量表偏移

增加向量表偏移

设定偏移值很容易,网上就能搜到

这里我用了这个函数来设置:

NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x3800);

注意点

刚开始我直接添加到了main函数开头,可是实际发现并没有作用

后来放到了RCC_Configuration();后面才生的效。其实也有可能是keil没有重启出了bug了,等大家去探索。

而且后面还出现了设置的值与实际读取出来的值不一样,怀疑也和keil有一定的关系。

结束

相关推荐
糖糖单片机设计22 分钟前
硬件开发_基于STM32单片机的电脑底座系统
stm32·单片机·嵌入式硬件·物联网·51单片机
IT项目分享3 小时前
ESP32入门实战:PC远程控制LED灯完整指南
单片机·嵌入式硬件·micropython·it项目网
Electrical_IT6 小时前
STM32-PWM输入捕获的配置
stm32·单片机
风吹花中花吹风7 小时前
原创-锐能微82xx系列电能计量芯片软件驱动开发与精度校准流程完全指南
驱动开发·单片机·嵌入式硬件·锐能微·计量芯片·精度校准·电能表校准
嵌入式小白牙9 小时前
ARM-DMA
arm开发·stm32·单片机
青牛科技-Allen11 小时前
GC8871刷式直流电机驱动器深度解析:3.6A驱动与内置电流检测技术
单片机·嵌入式硬件·音视频·音响·电动工具·散热风扇·电脑散热风扇
月阳羊16 小时前
【硬件-笔试面试题】硬件/电子工程师,笔试面试题-26,(知识点:硬件电路的调试方法:信号追踪,替换,分段调试)
笔记·嵌入式硬件·面试·职场和发展
嵌入式小白牙19 小时前
ARM-I2C软实现
stm32·单片机·嵌入式硬件
金色光环19 小时前
【阅读整理】野火ADC_AD7192模块资料
单片机·嵌入式硬件
jllllyuz19 小时前
基于AD7147电容触摸芯片与STC12C5A60S2单片机方案
单片机·嵌入式硬件