在线时间7 小时
UID3177241
注册时间2017-10-24
NXP金币0
该用户从未签到
新手上路

- 积分
- 39
- 最后登录
- 2020-4-22
|
在用KEA128开发,用到了booltloader,之前借助网上的资料已经写了一版bootloader程序和上位机软件,用的是CW10,里面APP跳转用的是下面的程序
uint32_t *vectorTable = (uint32_t*)APPLICATION_BASE; //APPLICATION_BASE通常是0x4000
uint32_t sp = vectorTable[0];
uint32_t pc = vectorTable[1];
application_run(sp, pc);
application_run()函数如下:
void application_run(uint32_t sp, uint32_t pc)
{
typedef void(*app_entry_t)(void);
static uint32_t s_stackPointer = 0;
static uint32_t s_applicationEntry = 0;
static app_entry_t s_application = 0;
s_stackPointer = sp;
s_applicationEntry = pc;
s_application = (app_entry_t)s_applicationEntry;
// Change MSP and PSP
__set_MSP(s_stackPointer);
__set_PSP(s_stackPointer);
// Jump to application
s_application();
// Should never reach here.
__NOP();
}
以上这个程序测试过后是OK的,问题是我现在改用KEIL之后用这个程序就不行了,必须在跳转之前重置中断向量表,如下:
SCB->VTOR = APPLICATION_BASE; //重置中断向量表,APPLICATION_BASE通常是0x4000
uint32_t *vectorTable = (uint32_t*)APPLICATION_BASE;
uint32_t sp = vectorTable[0];
uint32_t pc = vectorTable[1];
application_run(sp, pc);
加了 SCB->VTOR = APPLICATION_BASE就可以了,我想问问大家,为什么CW10写的bootloader程序不写重置中断向量这句也能用呢?
最佳答案
你可以在CW中搜索一下SCB->VTOR,实现正常的跳转,请参考这两个应用手册里的代码。
http://www.nxp.com/docs/en/application-note/AN4767.pdf
http://www.nxp.com/docs/en/appl ... ftware/AN4775SW.zip ...
|
|