lvben5d 发表于 2022-7-5 09:38

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();   

cyclefly 发表于 2022-7-10 19:39

这些缩写好高端啊

xdqfc 发表于 2022-7-11 10:42

时好时坏,有时候几天都是好的,就以为没有问题了,其实很危险。{:lol:}{:lol:}

sonicll 发表于 2022-7-11 11:15

PID VID出问题的时候,试试删掉windows注册表里的PID VID记录

guijial511 发表于 2022-7-11 20:53

看来还不稳定啊

lvben5d 发表于 2022-7-13 10:54

xdqfc 发表于 2022-7-11 10:42
时好时坏,有时候几天都是好的,就以为没有问题了,其实很危险。 ...

刚开始很奇怪, 我现在VID 就用GD32自带的那个,不敢乱改~   PID是随意 改了几个都没事~有时候VID改回我自己随意定义的,好像也可以用!~

tpgf 发表于 2022-8-1 12:12

得通过多看代码才能熟悉啊

qcliu 发表于 2022-8-1 12:20

为什么要删掉注册表里边的记录呢

drer 发表于 2022-8-1 13:14

时好时坏不好解决问题啊

coshi 发表于 2022-8-1 13:23

那就添加上就行了

kxsi 发表于 2022-8-1 13:32

可以多改改观察现象

wiba 发表于 2022-8-1 13:39

看多了就知道代表啥了
页: [1]
查看完整版本: bootloader -> APP 跳转后,居然忘记开全局中断了。