加载中…
个人资料
从入门到放弃
从入门到放弃
  • 博客等级:
  • 博客积分:0
  • 博客访问:5,937
  • 关注人气:57
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

Bootloader跳转App程序区(CotexM3/M4/M7)

(2018-08-29 16:04:48)
标签:

bootloader

app

cotex-m3

stm32

用户代码区的第一个字用于存放栈顶地址(MSP Main stack pointer)

用户代码区第二个字为程序开始地址(复位地址)

注意:IAR或者Keil编译Bootloader的时候同时也要设置好ROM起始地址,因为链接的时候会把向量表写在ROM的起始地址。

http://s3/mw690/002cOSLbzy7nd3XA4Tw72&690

示例代码:
#define FLASH_ADDR_BOOTLOADER           0x400000
#define FLASH_ADDR_APP_MEM              0x410000       

typedef void (*pFunction)(void);

uint32_t appMemAddr = FLASH_ADDR_APP_MEM;
uint32_t *pAppMemAddr = (uint32_t *)appMemAddr;

uint32_t start_sp;
uint32_t jump_addr;
pFunction Jump_to_application;

start_sp  = pAppMemAddr[0];
jump_addr = pAppMemAddr[1];

Jump_to_application = (pFunction)jump_addr;
__set_MSP(start_sp);

Jump_to_application();


参考链接:

IAP原理:
设置中断向量表的方法:

另一篇基于STM32的跳转程序,写的很好:

__disable_irq();

{
    GPIO_InitTypeDef GPIO_InitStruct;

    GPIO_InitStruct.GPIO_Mode  = GPIO_Mode_IN;
    GPIO_InitStruct.GPIO_Speed = GPIO_Speed_2MHz;
    GPIO_InitStruct.GPIO_OType = GPIO_OType_OD;
    GPIO_InitStruct.GPIO_PuPd  = GPIO_PuPd_NOPULL;

    GPIO_InitStruct.GPIO_Pin = GPIO_Pin_All;
    GPIO_InitStruct.GPIO_Pin &= ~(GPIO_Pin_13 | GPIO_Pin_14);
    GPIO_Init(GPIOA, &GPIO_InitStruct);

    GPIO_InitStruct.GPIO_Pin = GPIO_Pin_All;
    GPIO_Init(GPIOB, &GPIO_InitStruct);
    GPIO_Init(GPIOC, &GPIO_InitStruct);
    GPIO_Init(GPIOD, &GPIO_InitStruct);
    GPIO_Init(GPIOE, &GPIO_InitStruct);
    GPIO_Init(GPIOF, &GPIO_InitStruct);
    GPIO_Init(GPIOG, &GPIO_InitStruct);
    GPIO_Init(GPIOH, &GPIO_InitStruct);
    GPIO_Init(GPIOI, &GPIO_InitStruct);

   
    SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk;

   
    RCC->AHB1ENR = (1<<20);
    RCC->AHB2ENR = 0;
    RCC->AHB3ENR = 0;
    RCC->APB1ENR = 0;
    RCC->APB2ENR = 0;

   
    RCC->CFGR = 0;
}

MPU->CTRL &= ~MPU_CTRL_ENABLE_Msk;

{
    int i;

    for(i = 0; i < 8; i++)
    {
       
        NVIC->ICER *= 0xFFFFFFFF;

       
        NVIC->ICPR *= 0xFFFFFFFF;
    }
}

SCB->VTOR = app_address;

__set_BASEPRI(0);
__set_FAULTMASK(0);

__set_MSP(*(uint32_t*)app_address);
__set_PSP(*(uint32_t*)app_address);
__set_CONTROL(0);

__ISB();

__disable_irq();

((_func)(*(uint32_t*)(app_address + 4)))();


0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有