stm32 bootloader 跳转application后失败

O春暖花开O 2017-03-15 10:06:14
最近遇到一个困扰已久的问题,使用STM32F103VE的单片机 ,按照常规方式测试,所有功能均正常,然后为了以后程序升级方便,先刷bootloader程序,然后再通过网口下载application程序,结果发现如下的问题(下边分步介绍):

1:升级下载工具提示下载完成,然后板卡应当会工作在application模式下,但实际上未看到任何功能,再次尝试依旧
2:用debug调试,先用JLINK下载bootloader程序,然后更改application工程内不擦出所有sector的方式将应用程序也下载进去并启动debug,这样就能将两者程序都通过JLINK下载进去并能在线调试
3:程序能成功从bootloader跳转到application的main入口,单步往下调试,程序都能正常工作,但使用全速运行(无断点方式), 程序就跑飞
4:此时点击停止按钮,程序停在启动文件的中断服务函数的末尾 B .处,好像是产生中断后没找到中断服务函数
DMA2_Channel1_IRQHandler
DMA2_Channel2_IRQHandler
DMA2_Channel3_IRQHandler
DMA2_Channel4_5_IRQHandler
B .

ENDP

ALIGN
5:屏蔽其他中断初始化,只使能一个定时器中断,在该中断内断点,每次都能进来执行并成功退出,但取消断点运行仍然不行

6:下边是application的main处初始化代码
NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0);
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
ReadFlashCfg();
DrLed();
DrTimer_Init();

system_stm32f10x.c文件设置
#define VECT_TAB_OFFSET 0x0 /*!< Vector Table base offset field.
This value must be a multiple of 0x200. */

target option里的IROM1设置
start 0x8008000 size 0x1C000

mish.h文件设置,即偏移地址为0x8000
#define NVIC_VectTab_RAM ((uint32_t)0x20000000)
#define NVIC_VectTab_FLASH ((uint32_t)0x08008000)
#define IS_NVIC_VECTTAB(VECTTAB) (((VECTTAB) == NVIC_VectTab_RAM) || \
((VECTTAB) == NVIC_VectTab_FLASH))

bootloader程序是公司成熟的产品,其他程序可以正常执行,唯独此程序有问题。初步推测是中断重定位后出的问题,中断后指向非法地址了(但不理解单步调试可以运行)。哪位大神了解此情况,知道一下问题出在哪,感激不尽!
...全文
3126 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
woshi_ziyu 2019-12-16
  • 打赏
  • 举报
回复
楼上的方法会使得生成的bin文件很大 代码变化后,bin文件大小看不出来
worldy 2019-12-16
  • 打赏
  • 举报
回复 1
引用 7 楼 O春暖花开O 的回复:
[quote=引用 1 楼 失散糖 的回复:]
既然bootloader已经成熟的,那把它整理成一个__root常量数组 “@” 到一个固定的Flash地址,放到独立的一个源文件里面,这样一个工程既有bootloader又有application,就很方便了,虽然这不一定能解决你的问题。。
例如IAR可以这么弄
__root const static unsigned char BOOTLOADER[] @ 0x08000000 =
{
......
};


另外,既然NVIC_VectTab_FLASH加了0x8000的偏移,那么VECT_TAB_OFFSET顺便也改成0x8000的偏移如何


这个方法值得推荐[/quote]

确实不错,不是老司机想不出来的方法
O春暖花开O 2019-12-16
  • 打赏
  • 举报
回复
引用 1 楼 失散糖 的回复:
既然bootloader已经成熟的,那把它整理成一个__root常量数组 “@” 到一个固定的Flash地址,放到独立的一个源文件里面,这样一个工程既有bootloader又有application,就很方便了,虽然这不一定能解决你的问题。。
例如IAR可以这么弄
__root const static unsigned char BOOTLOADER[] @ 0x08000000 =
{
......
};


另外,既然NVIC_VectTab_FLASH加了0x8000的偏移,那么VECT_TAB_OFFSET顺便也改成0x8000的偏移如何


这个方法值得推荐
O春暖花开O 2019-12-16
  • 打赏
  • 举报
回复
抱歉,这个回复的比较晚,多谢各位提供的建议和方法。当初我这个问题根源是bootloader和application用的两个工程,但库版本号不一致。bootloader是公司一直在使用的成熟产品,application做了升级,把STM32固件库升级成最新的了,导致了该问题,若把两个工程的固件库改成同一个版本就不会有问题。
fangyanpo 2019-09-30
  • 打赏
  • 举报
回复
改2个地方 1、在"OPTION"的"target"中作如下改动 2、在"system_stm32f1xx.c"中,改变中断向量表的偏移 //#define VECT_TAB_OFFSET 0x0 //原来的数值 #define VECT_TAB_OFFSET 0x4000 //改动后的数值 // 偏移量在下面指令中被执行 #ifdef VECT_TAB_SRAM SCB->VTOR = SRAM_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal SRAM. */ #else SCB->VTOR = FLASH_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal FLASH. */ #endif 在"OPTION"的"target"中作如下改动“IROM1”的起始地址要加上偏移地址。
Acuity. 2017-03-18
  • 打赏
  • 举报
回复
按理说,只要偏移地址正确,中断向量映射偏移正确,一般都没问题。跳转前关闭所有中断。
Acuity. 2017-03-18
  • 打赏
  • 举报
回复
引用 1 楼 sugar13 的回复:
既然bootloader已经成熟的,那把它整理成一个__root常量数组 “@” 到一个固定的Flash地址,放到独立的一个源文件里面,这样一个工程既有bootloader又有application,就很方便了,虽然这不一定能解决你的问题。。 例如IAR可以这么弄
__root const static unsigned char BOOTLOADER[] @ 0x08000000 =
{
......
};
另外,既然NVIC_VectTab_FLASH加了0x8000的偏移,那么VECT_TAB_OFFSET顺便也改成0x8000的偏移如何
IAR 有这么强悍的功能啊,不知道keil有没有这个功能。我用keil是分2个工程,boot一个,app一个。
失散糖 2017-03-18
  • 打赏
  • 举报
回复
既然bootloader已经成熟的,那把它整理成一个__root常量数组 “@” 到一个固定的Flash地址,放到独立的一个源文件里面,这样一个工程既有bootloader又有application,就很方便了,虽然这不一定能解决你的问题。。 例如IAR可以这么弄
__root const static unsigned char BOOTLOADER[] @ 0x08000000 =
{
......
};
另外,既然NVIC_VectTab_FLASH加了0x8000的偏移,那么VECT_TAB_OFFSET顺便也改成0x8000的偏移如何

27,382

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 单片机/工控
社区管理员
  • 单片机/工控社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧