STM32BootLoad深入理解

BoootLoad在线升级分为两个部分:Boot、APP

Boot

Boot为单片机复位启动以后运行的部分,这里面可以选择后续程序的跳转,以及升级文件的接收。
Boot中的要点就是程序跳转

void CAN_BOOT_JumpToApplication(__IO uint32_t Addr)
{
    pFunction Jump_To_Application;
    __IO uint32_t JumpAddress; 
    /* Test if user code is programmed starting from address "ApplicationAddress" */
    if (((*(__IO uint32_t*)Addr) & 0x2FFE0000 ) == 0x20000000)
    { 
        /* Jump to user application */
        __ASM("CPSID  I");
        JumpAddress = *(__IO uint32_t*) (Addr + 4);
        Jump_To_Application = (pFunction) JumpAddress;
        __set_PRIMASK(1);//关闭所有中断
        CAN_ITConfig(CAN1,CAN_IT_FMP0, DISABLE);
        /* Initialize user application's Stack Pointer */
        __set_MSP(*(__IO uint32_t*)Addr);
        Jump_To_Application();
    }
}

Addr是APP文件在flash中的存储位置
相对于ARM上一代的主流ARM7/ARM9内核架构,新一代Cortex内核架构的启动方式有了比较大的变化。ARM7/ARM9内核的控制器在复位后,CPU会从存储空间的绝对地址0x000000取出第一条指令执行复位中断服务程序的方式启动,即固定了复位后的起始地址为0x000000(PC = 0x000000)同时中断向量表的位置并不是固定的。而Cortex-M3内核则正好相反,有3种情况:
1、 通过boot引脚设置可以将中断向量表定位于SRAM区,即起始地址为0x2000000,同时复位后PC指针位于0x2000000处;
2、 通过boot引脚设置可以将中断向量表定位于FLASH区,即起始地址为0x8000000,同时复位后PC指针位于0x8000000处;
3、 通过boot引脚设置可以将中断向量表定位于内置Bootloader区,本文不对这种情况做论述;
而Cortex-M3内核规定,起始地址必须存放堆顶指针,而第二个地址则必须存放复位中断入口向量地址,这样在Cortex-M3内核复位后,会自动从起始地址的下一个32位空间取出复位中断入口向量,跳转执行复位中断服务程序。对比ARM7/ARM9内核,Cortex-M3内核则是固定了中断向量表的位置而起始地址是可变化的。
总结一下STM32的启动文件和启动过程
首先对栈和堆的大小进行定义,并在代码区的起始处建立中断向量表,其第一个表项是栈顶地址,第二个表项是复位中断服务入口地址。然后在复位中断服务程序中跳转¬¬C/C++标准实时库的__main函数,完成用户堆栈等的初始化后,跳转.c文件中的main函数开始执行C程序。假设STM32被设置为从内部FLASH启动(这也是最常见的一种情况),中断向量表起始地位为0x8000000,则栈顶地址存放于0x8000000处,而复位中断服务入口地址存放于0x8000004处。当STM32遇到复位信号后,则从0x80000004处取出复位中断服务入口地址,继而执行复位中断服务程序,然后跳转__main函数,最后进入mian函数,来到C的世界。

通过上面的文章可以了解到CortexM3从启动的首地址从放的是栈顶指针,*(__IO uint32_t*)Addr是去APP的栈顶指针,然后判断栈是不是在RAM中,JumpAddress = *(__IO uint32_t*) (Addr + 4);存放的就是复位向量的地址,当通过__set_MSP(*(__IO uint32_t*)Addr);把主栈指针指向APP的栈后,在使用Jump_To_Application();把PC指针指向APP的复位向量。

APP

app中需要注意的主要有两点:编译设置和中断向量便宜

编译设置

STM32BootLoad深入理解_第1张图片
分别设置flash的起始地址和大小
STM32BootLoad深入理解_第2张图片
编译后使用keil自带程序生成bin升级文件
STM32BootLoad深入理解_第3张图片
设置下载的flash地址

中断向量表重映射

NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x2000); //重映射中断向量表APP_START_ADDRESS

你可能感兴趣的:(STM32BootLoad深入理解)