STM32在线升级原理,和应用程序不正常运行

来源:互联网 发布:app数据接口开发 编辑:程序博客网 时间:2024/05/17 04:30

为方便产品出厂后,用户可以通过外设接口如USB,USART对设备进行升级,通常会有一段引导代码,在开机的时候从Boot启动,启动通过与上位机通信是否需要升级,如果没有升级就直接跳转到APP空间,及一个超循环体中(无操作系),boot程序一般放在flash开始出0x08000000处,用户可以在此处放入boot代码,处理上位机发送过来代码段数据,通过操作flash将我们的APP放到指定偏移地址,烧写完毕后,可以自动跳转到对应的地址开始执行应用程序APP;应用程序如果通过在线烧写st-link烧写,需要将keil编译选项中的rom地址改为0x08002000,0x2000就是APP存放代码的偏移地址,并且还需要再代码中将我们的中断向量偏移到0x2000处;

NVIC_VectTableSet(NVIC_VECTTAB_FLASH, 0x2000);//将中断向量表初始化

从boot跳转到APP空间的函数可以参考如下代码段,在跳转前,必须先关闭掉所有可能产生中断的外设,如下面的定时器,因为在跳转后,app如果还未重新定义中断向量表,此时产生的中断就会让程序跑飞,必须关闭:

void Go_APP(void)
{
u32 JumpAddress;
pFunction Jump_To_Application;

/**************关闭定时器*********************/
TIMER_Enable( TIMER1 , DISABLE);
TIMER_ClearIntBitState( TIMER1 , TIMER_INT_UPDATE);
TIMER_INTConfig(TIMER1 ,TIMER_INT_UPDATE , DISABLE);
TIMER_DeInit(TIMER1);



if (((*(__IO uint32_t*)ApplicationAddress) & 0x2FFE0000 ) == 0x20000000)//这个必须要,
{
//跳转至用户代码
JumpAddress = *(__IO uint32_t*) (ApplicationAddress + 4);
Jump_To_Application = (pFunction) JumpAddress;        
//初始化用户程序的堆栈指针
__set_MSP(*(__IO uint32_t*) ApplicationAddress);
Jump_To_Application();
}
else  //无应用程序
{
//做出异常处理
}
}

二、升级完成后,出现另一个问题,程序在flash中不偏移地址,所有中断都没有问题,但如果加了偏移地址,部分中断就出现了问题,出现这个原因定位为中断处理函数太长,代码量太大造成,具体根本原因还不知道,如果哪位出现类似问题,可以看看你的中断函数是否调用了时间较长的处理函数和大代码量的函数,如有谁知道了根本原因还望告知;

0 0
原创粉丝点击