打印
[STM32L1]

STM32L151向量中断表地址偏移问题

[复制链接]
759|13
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
yanxuntao|  楼主 | 2024-1-3 09:33 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
用STM32L151芯片做在线升级boot程序,boot程序在0x08000000-0x08004000,user程序在0x08004000之后,跳转之后设置向量中断的偏移量到0x4000,仿真看寄存器值设置成功了,但实际没有生效,从boot跳转到user这边程序正常跑的,但进不去中断了。这个可能是什么问题,能怎么解决?用的是SCB->VTOR = FLASH_BASE | VECT_TAB_OFFSET;这个语句,FLASH_BASE 是0x08000000,VECT_TAB_OFFSET是0x4000

使用特权

评论回复
评论
yanxuntao 2024-1-4 10:54 回复TA
@xch :谢谢。这个试过也不行,之前在STM32F072因为没有VTOR寄存器,是这样操作的,是可以,这个芯片试了一下不行。也可能哪里搞错了,这个方法可以再试试看。我试过直接进去APP后,直接把APP的向量地址复制到boot的对应位置,这个可以进中断,但重启之后进boot会出错。 
xch 2024-1-3 18:18 回复TA
进user 之前能中断?先复制一份boot 中断向量到RAM,修改偏移到RAM,然后在进USER之前修改RAM 中断向量。看看行不行 
沙发
yanxuntao|  楼主 | 2024-1-3 09:36 | 只看该作者
有没有高手帮忙解答一下,谢谢

使用特权

评论回复
板凳
香水城| | 2024-1-3 16:00 | 只看该作者
在跳转前 将在BOOT区使能的中断都关闭掉,逐一关闭,不要简单做个关总中断操作,尤其别忘记了关闭systick中断。

另外,APP区的VTOR修改建议在其启动文件里完成,不要等到进Main后才做。

使用特权

评论回复
地板
yanxuntao|  楼主 | 2024-1-4 10:49 | 只看该作者
香水城 发表于 2024-1-3 16:00
在跳转前 将在BOOT区使能的中断都关闭掉,逐一关闭,不要简单做个关总中断操作,尤其别忘记了关闭systick中 ...

谢谢,我试一下。我之前是关总中断的,单独一个个关中断没试过。修改VTOR在boot和APP的SystemInit都试过,都不可以。

使用特权

评论回复
5
classroom| | 2024-1-4 15:02 | 只看该作者
可能是中断向量表配置问题

使用特权

评论回复
6
powerantone| | 2024-1-4 15:03 | 只看该作者
检查中断优先级和子优先级的设置。

使用特权

评论回复
7
flycamelaaa| | 2024-1-4 15:05 | 只看该作者
检查中断使能位是否被正确设置。

使用特权

评论回复
8
probedog| | 2024-1-4 15:06 | 只看该作者
如果中断触发方式不正确,那么中断可能不会触发。

使用特权

评论回复
9
yanxuntao|  楼主 | 2024-1-5 10:50 | 只看该作者
powerantone 发表于 2024-1-4 15:03
检查中断优先级和子优先级的设置。

中断优先级设置我都没有改过,这个会有影响吗

使用特权

评论回复
10
yanxuntao|  楼主 | 2024-1-5 10:51 | 只看该作者
本帖最后由 yanxuntao 于 2024-1-5 10:54 编辑
classroom 发表于 2024-1-4 15:02
可能是中断向量表配置问题

是指哪个呢?我也是怀疑中断向量表的问题,但不知道哪里的问题。我整个表复制到0x08000000的位置是可以的,但是在0x08004000的位置就不行,偏移量设置了也不行。

使用特权

评论回复
11
yanxuntao|  楼主 | 2024-1-5 10:52 | 只看该作者
probedog 发表于 2024-1-4 15:06
如果中断触发方式不正确,那么中断可能不会触发。

是SysTick_IRQn这个中断都进不去,APP没改设置,就是加了boot就不行,boot去掉,APP地址改到0X08000000就可以了。

使用特权

评论回复
12
yanxuntao|  楼主 | 2024-1-9 14:22 | 只看该作者
本帖最后由 yanxuntao 于 2024-1-9 14:28 编辑

问题找到了,在boot里的问题,其他工程里转过来的跳转函数,之前开关中断用的是
void IRQ_DISABLE(void)
{                  
        __ASM volatile("cpsid i");
}

void IRQ_ENABLE(void)
{
        __ASM volatile("cpsie i");                  
}这套,跳转的时候有IRQ_DISABLE();新的工程用的是__set_FAULTMASK(1) ;__set_FAULTMASK(0);这套。在APP里面忘记打开IRQ_ENABLE。所以在APP里中断一直用不了。自己把自己坑了。
直接使用向量中断偏移量,
SCB->VTOR = FLASH_BASE | VECT_TAB_OFFSET;
或者把向量中断表映射到SRAM里都可以.
__set_FAULTMASK(1);
memcpy((void*)0x20000000, (void*)0x08004000, 0x100);       
__HAL_RCC_SYSCFG_CLK_ENABLE();
__HAL_SYSCFG_REMAPMEMORY_SRAM();
__set_FAULTMASK(0);       

谢谢大家回复。

使用特权

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

本版积分规则

2

主题

13

帖子

0

粉丝