RT-Thread Studio 实现IAP OTA的问题和解决方法
注意点:
- 1.使用RTT Studio来写升级的APP要注意修改中断向量表的地址,不能直接在main函数里改SCB那个方法,因为RTT在进入main之前就初始化了。
- 2.记得改APP的ROM的地址和大小,这里上次忘记改,就遇到了问题,浪费了点时间。
- 3.滴答定时器要关掉。
static void JumpToApplication(void)
{
uint32_t i=0;
register rt_ubase_t temp;
__IO uint32_t ApplicationAddr = 0x08120000; /* APP的地址 */
void (*SysMemBootJump)(void); /* 声明一个函数指针 */
/* 关闭全局中断 */
temp = rt_hw_interrupt_disable();
/* 关闭滴答定时器,复位到默认值 */
SysTick->CTRL = 0;
SysTick->LOAD = 0;
SysTick->VAL = 0;
/* 设置所有时钟到默认状态,使用HSI时钟 */
HAL_RCC_DeInit();
/* 关闭所有中断,清除所有中断挂起标志 */
for (i = 0; i < 8; i++)
{
NVIC->ICER[i]=0xFFFFFFFF;
NVIC->ICPR[i]=0xFFFFFFFF;
}
/* 使能全局中断 */
rt_hw_interrupt_enable(temp);
/* 跳转到系统BootLoader,首地址是MSP,地址+4是复位中断服务程序地址 */
SysMemBootJump = (void (*)(void)) (*((uint32_t *) (ApplicationAddr + 4)));
/* 设置朱堆栈指针 */
__set_MSP(*(uint32_t *)ApplicationAddr);
/* 在RTOS工程,这条语句很重要,设置为特权级模式,使用MSP指针 */
__set_CONTROL(0);
/* 跳转到系统BootLoader */
SysMemBootJump();
/* 跳转成功的话,不会执行到这里,用户可以在这里添加代码 */
while (1);
}