请教修改NVIC后RTT调度函数失效的问题[已解决 bootloader中打开了不必要的中断]

发布于 2012-03-23 16:24:17
菜鸟自习RTT,将以前的STM32F103裸奔程序移植到RTT遇到这样的问题:
自己写了一个bootloader,可以从TF卡更新应用程序,bootloader的区域是0x08000000到0x0800EFFF
后面的是应用程序区,NVIC配置添加

NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0xF000);


这个区的程序移植到RTT上后在jlink调试时正常,从bootloader跳转过去时RTT不能运行,通过串口打印信息找到最后死在调度函数里面了,
rt_hw_context_switch_to((rt_uint32_t)&to_thread->sp);


这个函数是在context_iar.S中定义
本人太菜,不懂汇编指令,恳请哪位大侠路过点拨一下 [s:191]
NVIC.png
keil.png

查看更多

关注者
0
被浏览
7.8k
15 个回答
aozima
aozima 2012-03-23
拒绝白嫖,拒绝键盘侠!
STM32的 start.S还是system_init()会重设NVIC的。
找出来,修改之。
jeffwei
jeffwei 2012-03-23
void SystemInit (void)当中有
 SCB->VTOR = FLASH_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal FLASH. */

修改后下面的定义后依然无效
#define VECT_TAB_OFFSET  0xF000 /*!< Vector Table base offset field. 
aozima
aozima 2012-03-23
拒绝白嫖,拒绝键盘侠!
rt_hw_context_switch_to时查看:SCB->VTOR 的值。
lloongo
lloongo 2012-03-23
你那个NVIC_SetVectorTable放在
startup.c
rtthread_startup()里面的rt_hw_board_init()里面的NVIC_Configuration()那个地方就OK啦。
你说的那个东西我也做过。应该是没有问题的。如果有问题的话。那你就是那个烧写的地址不对
jeffwei
jeffwei 2012-03-23
刚刚下班吃饭去了,才试了一下
stm32f10x.h中看到这个
#define  SCB_VTOR_TBLOFF                     ((uint32_t)0x1FFFFF80)        /*!< Vector table base offset field */


jlink看不到0x1FFFFF80这里的值
jeffwei
jeffwei 2012-03-23
你那个NVIC_SetVectorTable放在
startup.c
rtthread_startup()里面的rt_hw_board_init()里面的NVIC_Configuration()那个地方就OK啦。
你说的那个东西我也做过。应该是没有问题的。如果有问题的话。那你就是那个烧写的地址不对


位置是boad.c
void NVIC_Configuration(void)
{
#ifdef VECT_TAB_RAM
/* Set the Vector Table base location at 0x20000000 */
NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0);
#else /* VECT_TAB_FLASH */
/* Set the Vector Table base location at 0x08000000 */
// NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0);
NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0xF000);
#endif
}
aozima
aozima 2012-03-23
拒绝白嫖,拒绝键盘侠!
[attach]0[/attach]
jeffwei
jeffwei 2012-03-23
[attach]0[/attach]

谢谢你截图指导,我用的IAR,马上换keil试试
jeffwei
jeffwei 2012-03-23
不习惯用KEIL,搞了好一会才把工程建好,结果不行啊
offset倒是0X8000F000
jeffwei
jeffwei 2012-03-23
发现问题原因了,bootloader的定时器中断引起的。
这样发现的
调试的时候,RTT的程序中断调试,板子断电重启,然后点击运行,再中断运行,发现停在定时器中断,于是屏蔽bootloader的定时器中断,发现问题解决。
谢谢上面各位大侠的指导!
aozima
aozima 2012-03-23
拒绝白嫖,拒绝键盘侠!
bootloader中一般不要使用中断或一定要在跳到APP前关闭(要关闭外设,而不是只关总中断)。
jeffwei
jeffwei 2012-03-23
bootloader中一般不要使用中断或一定要在跳到APP前关闭(要关闭外设,而不是只关总中断)。

记住了,谢谢指导,这个是我写的第一个bootloader,没经验。
dolico
dolico 2012-07-27
遇到和楼主同样的问题了。只修改了system_stm32f10x.c里的NVIC初始化。没注意到Board.c里面还有一个NVIC向量表初始化。。现在搞定~
小白白又白
小白白又白 2019-07-25
dolico 发表于 2012-7-27 13:42
遇到和楼主同样的问题了。只修改了system_stm32f10x.c里的NVIC初始化。没注意到Board.c里面还有一个NVIC向 ...


对的就是这个 其实中断还好解决 就是这个很难发现

撰写答案

请登录后再发布答案,点击登录

发布
问题

分享
好友

手机
浏览

扫码手机浏览