打印

bootloader -> APP 跳转后,居然忘记开全局中断了。

[复制链接]
790|11
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
lvben5d|  楼主 | 2022-7-5 09:38 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 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 | 只看该作者
时好时坏,有时候几天都是好的,就以为没有问题了,其实很危险。

使用特权

评论回复
地板
sonicll| | 2022-7-11 11:15 | 只看该作者
PID VID出问题的时候,试试删掉windows注册表里的PID VID记录

使用特权

评论回复
5
guijial511| | 2022-7-11 20:53 | 只看该作者
看来还不稳定啊

使用特权

评论回复
6
lvben5d|  楼主 | 2022-7-13 10:54 | 只看该作者
xdqfc 发表于 2022-7-11 10:42
时好时坏,有时候几天都是好的,就以为没有问题了,其实很危险。 ...

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

使用特权

评论回复
7
tpgf| | 2022-8-1 12:12 | 只看该作者
得通过多看代码才能熟悉啊

使用特权

评论回复
8
qcliu| | 2022-8-1 12:20 | 只看该作者
为什么要删掉注册表里边的记录呢

使用特权

评论回复
9
drer| | 2022-8-1 13:14 | 只看该作者
时好时坏不好解决问题啊

使用特权

评论回复
10
coshi| | 2022-8-1 13:23 | 只看该作者
那就添加上就行了

使用特权

评论回复
11
kxsi| | 2022-8-1 13:32 | 只看该作者
可以多改改观察现象

使用特权

评论回复
12
wiba| | 2022-8-1 13:39 | 只看该作者
看多了就知道代表啥了

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

95

主题

746

帖子

12

粉丝