bootloader -> APP 跳转后,居然忘记开全局中断了。
本帖最后由 lvben5d 于 2022-7-18 16:41 编辑void CheckAndJump2App()
{
if (((*(__IO uint32_t*)APPLICATION_ADDRESS) & 0x2FFE0000 ) == 0x20000000)//检测栈顶的地址,判断用户代码的堆栈地址是否落在0x2000000~0x2001ffff区间
{
__disable_irq();//关闭所有中断 再跳转
/* 跳转至用户程序 *///ApplicationAddress + 4对应的是app中断向量表的第二项,复位地址
JumpAddress = *(__IO uint32_t*) (APPLICATION_ADDRESS + 4);
Jump_To_Application = (pFunction) JumpAddress; //把地址强转为函数指针
__set_MSP(*(__IO uint32_t*) APPLICATION_ADDRESS); //设置主函数栈指针 将用户代码的栈顶地址设为栈顶指针
Jump_To_Application(); //调用函数,实际失去app复位地址去执行复位操作---设置程序指针为复位地址
}
}
结果跳转后,我忘记 __enable_irq(); //打开所有中断 于是进不去中断处理函数,搞了2小时才想起这个。 看来MCU上电后,默认是开全局中断的,因为一般我们不会写 __disable_irq();
这些缩写好高端啊 时好时坏,有时候几天都是好的,就以为没有问题了,其实很危险。{:lol:}{:lol:} PID VID出问题的时候,试试删掉windows注册表里的PID VID记录 看来还不稳定啊 xdqfc 发表于 2022-7-11 10:42
时好时坏,有时候几天都是好的,就以为没有问题了,其实很危险。 ...
刚开始很奇怪, 我现在VID 就用GD32自带的那个,不敢乱改~ PID是随意 改了几个都没事~有时候VID改回我自己随意定义的,好像也可以用!~ 得通过多看代码才能熟悉啊 为什么要删掉注册表里边的记录呢 时好时坏不好解决问题啊 那就添加上就行了 可以多改改观察现象 看多了就知道代表啥了
页:
[1]