目前在项目中,使用CC1310,将Flash划分为BootLoader和APP分区,发现在BootLoader中无法正常跳转到APP去,目前类似功能是否有可供参考的例程?
另外,因为CC1310在系统起来后,已经将Vector Table复制到SRAM中使用,因此在BootLoader跳转到APP前是否有必要再进行Vector Tabale偏移设置?如果需要,要怎么设置呢?
跳转部分的代码如下:
#define FLASH_START_ADDR 0x00000000
#define APP_START_ADDR 0xC000
typedef void (*pFunction)(void); uint32_t u4StackTopAddr = *(volatile uint32_t*)APP_START_ADDR; if(IS_STACK_TOP_ADDR_VALID(u4StackTopAddr)) {uint32_t u4AppResetAddr = *(volatile uint32_t*)(APP_START_ADDR+4);if(u4AppResetAddr > APP_START_ADDR){pFunction Jump_To_Application;Jump_To_Application = (pFunction) u4AppResetAddr; //HWREG(CPU_SCS_O_VTOR) = (APP_START_ADDR - FLASH_START_ADDR)<<7;__set_MSP(u4StackTopAddr);Jump_To_Application();} }
其中
u4AppResetAddr的值等于0x15A69,
u4StackTopAddr 的值等于0x20005000
上述代码中,如果有该段语句HWREG(CPU_SCS_O_VTOR) = (APP_START_ADDR – FLASH_START_ADDR)<<7;设置中断偏移量,则在设置后直接出错;
屏蔽掉该句,执行Jump_To_Application();完该条跳转语句后,PC指针等于0x10004618;
也麻烦帮忙看看,是哪里没设置对。
xd z:
回复 Viki Shi:
参考贴子中的跳转代码确实可以实现正常跳转了,谢谢!
不过我这边是NORTOS的工程,应该不存在BIOS/ROM的问题,CCFG中也没有打开TI自带的BootLoader。看前面无法正常跳转的原因在于编写的跳转代码在设置栈顶指针后,执行跳转指令前,看汇编又去栈里面拿PC值导致的:
//原程序中如下C代码对应的汇编如下: Jump_To_Application = (pFunction) u4AppResetAddr; ldrr0, [sp] strr0, [sp, #8]// 这里将跳转指针存储在了栈顶偏移8的位置__set_MSP(u4StackTopAddr); ldrr0, [sp, #4] msrmsp, r0 // 这里将APP Code区的栈顶位置设置给了MSP,此时栈顶的位置已经改变了Jump_To_Application(); ldrr0, [sp, #8]//这里跳转前又从栈顶偏8的位置去拿跳转指针自然就会出错了 blxr0//如果将上面的C代码直接改成论坛里面汇编: asm(" MOV R0, #0x0A000"); asm(" LDR R1, [R0, #0x4] "); asm(" LDR SP, [R0, #0x0] "); asm(" BX R1 "); //则可以从BootLoader正常跳转到APP去; //另外,如果不想嵌入汇编,还是用C语言实现,我这边将u4AppResetAddr变量定义为register类型的也可以 //因为u4AppResetAddr变量如果为register类型,则在跳转前就不用去栈里面拿跳转指针了 //只是比较奇怪,同样的代码在Keil里面编译生成的汇编会自动把u4AppResetAddr存在寄存器里,但是CCS不会,需要用register强制声明。 //C代码以及对应汇编如下: register pFunction Jump_To_Application; Jump_To_Application =(pFunction)u4AppResetAddr; ldrr1, [sp, #4] __set_MSP(u4StackTopAddr); msrmsp, r1 Jump_To_Application(); blxr0
xd z:
回复 Felix ZF:
是的,项目准备自己写BootLoader。