打印
[STM32L0]

STM32L072RB IAP跳转到APP中断无反应

[复制链接]
1831|12
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
jay8830095|  楼主 | 2019-11-27 19:08 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 jay8830095 于 2019-11-27 19:08 编辑

根据CM0的中断向量的映射,使用下面代码;例如我APP地址:0x08006000;
我把这块地址的中断向量表拷贝到RAM的其实地址,例如0x2000000 总大小0xc0限制住;
然后进行重映射,这样系统就可以找到APP里面的中断列表,但是实际上APP无法引起中断;
我的代码如下:
#define APPLICATION_ADDRESS     ((uint32_t)0x08003000)

VectorTable 这个变量限制到0x2000000,大小预留了512bytes;
static uint8_t i = 0;
static uint32_t tmpCfgr;      
  __HAL_RCC_SYSCFG_CLK_ENABLE();   
bootmode = SYSCFG->CFGR1;

for(i = 0; i < 48; i++)
  {
            VectorTable = (*( uint32_t*)(APPLICATION_ADDRESS + (i<<2))) ;
}
        
//memcpy((void*)0x20000000, (void*)VectorTable, 0xC0);
        
//__HAL_SYSCFG_REMAPMEMORY_SRAM();
        
tmpCfgr = SYSCFG->CFGR1;
tmpCfgr &= (uint32_t)(~SYSCFG_CFGR1_MEM_MODE_Msk);
tmpCfgr |= (uint32_t)0x03;
SYSCFG->CFGR1 = tmpCfgr;   
bootmode = SYSCFG->CFGR1;
设置不了映射模式,一直是0x00,我想设置成0x03

使用特权

评论回复
沙发
mmuuss586| | 2019-11-29 09:51 | 只看该作者

使用特权

评论回复
板凳
香水城| | 2019-11-29 10:48 | 只看该作者
本帖最后由 香水城 于 2019-11-29 22:47 编辑

stm32L0系列是基于ARM CORTEX M0+内核的产品,它支持中断矢量重定位的。

无须像M0内核的STM32F0产品那样做矢量表的拷贝和启动地址的重映射。

直接操作 VTOR寄存器就好。
比方:SCB->VTOR = FLASH_BASE | VECT_TAB_OFFSET;

使用特权

评论回复
地板
jay8830095|  楼主 | 2019-11-29 14:40 | 只看该作者
香水城 发表于 2019-11-29 10:48
stm32L0系列是基于ARM CORTEX M0+内核的产品,它支持中断矢量重定位的。

无须像M0内核的STM32F0产品那样做 ...

多谢,我试试,哪里有这种资料可以查看

使用特权

评论回复
5
jay8830095|  楼主 | 2019-11-29 15:26 | 只看该作者
共享下文档,确实cmo+写的是可选的,不知道具体到芯片有没有这个寄存器!

cortex_m0p_user_guard.pdf

939.96 KB

cm0文档

使用特权

评论回复
6
香水城| | 2019-11-29 15:28 | 只看该作者
本帖最后由 香水城 于 2019-11-30 10:16 编辑
jay8830095 发表于 2019-11-29 14:40
多谢,我试试,哪里有这种资料可以查看

基于STM32L0的官方库里有相应的IAP例程可以参考。
可以找到有个VTOR寄存器赋值的代码。

使用特权

评论回复
7
jay8830095|  楼主 | 2019-11-29 16:21 | 只看该作者
本帖最后由 jay8830095 于 2019-11-29 16:22 编辑
香水城 发表于 2019-11-29 15:28
基于STM32L0的官方库里有相应的IAP例程可以参考。
可以找到有个VTOR寄存器赋值的代码。 ...

MDK 5.28 V9的盗版JLINK,调试0x8006000的程序时,程序总是进不到Main函数; 有知道的老铁吗?在0x8000000调试没有什么问题,我记得之前用其它版本的MDK也没事,因为
STM32L072的PACK包支持问题,升级到最新的MDK版本了
目前用的HAL库,哪里有例程序下载?



使用特权

评论回复
8
FireCode| | 2019-11-29 16:43 | 只看该作者
本帖最后由 FireCode 于 2019-11-29 16:56 编辑
jay8830095 发表于 2019-11-29 16:21
MDK 5.28 V9的盗版JLINK,调试0x8006000的程序时,程序总是进不到Main函数;有知道的老铁吗?在0x8000000 ...

楼主你尝试一下把0x08000000的那段引导程序的HEX先下载到芯片,然后再用仿真器下载0x08006000的代码到芯片中,这样就可以对0x08006000的软件进行仿真调试了.
因为芯片复位后默认是从地址0x08000000处开始执行的,如果你不下载这段引导程序到芯片中,是无法自动执行到0x08006000的main函数的.

使用特权

评论回复
9
jay8830095|  楼主 | 2019-11-29 16:55 | 只看该作者
本帖最后由 jay8830095 于 2019-11-29 17:01 编辑
FireCode 发表于 2019-11-29 16:43
楼主你尝试一下把0x08000000的那段引导程序的HEX先下载到芯片,然后再用仿真器下载0x08006000的代码到芯片 ...

尝试了,确实可以,跳动MAIN函数了,不过,使用了
system_stm32l0xx.c
里面的SystemInit 函数里面修改成以下代码
SCB->VTOR = FLASH_BASE | (0x6000& (uint32_t)0x1FFFFF80);,
软件卡在一个地方,我判断定时器的延时,过不去,定时器没启动,
想了下 ,还有全局中断可能影响到,因为在bootloader里面关闭了全局中断;
我开全局中断代码
    uint32_t primask_bit;
        
        primask_bit = __get_PRIMASK();
        
    __set_PRIMASK(primask_bit);
增加了开全部中断的代码
__enable_irq();
确实可以跑了,因为在Bootloader里面关闭了中断      __disable_irq();

感谢热心网友,结贴!




使用特权

评论回复
10
zjq985062714| | 2019-11-30 09:36 | 只看该作者
学习一下!

使用特权

评论回复
11
香水城| | 2019-11-30 10:18 | 只看该作者
另外,这里有篇**可以参考下。
STM32F0 IAP应用中不同代码区的跳转话题

使用特权

评论回复
12
jay8830095|  楼主 | 2019-12-2 11:52 | 只看该作者
香水城 发表于 2019-11-30 10:18
另外,这里有篇**可以参考下。
STM32F0 IAP应用中不同代码区的跳转话题

CM0和CMO+确实不一样,谢谢,目前还没用到CM0的MCU

使用特权

评论回复
13
磨砂| | 2019-12-11 13:25 | 只看该作者
涨了很多知识啊

使用特权

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

本版积分规则

4

主题

42

帖子

0

粉丝