bootloader核心指南

bootloader部分

跳转举例

方法一

 //方法一
/*
 * 功能:运行应用程程序
 * 输入:app_address:应用程序起始地址
 * 输出:
 * 备注: 
 */
void StartApplication(uint32_t app_address)
{
    uint32_t jump_address;
 
    if (((*(__IO uint32_t*)app_address) & 0x2FFE0000 ) == 0x20000000)
    {
        jump_address = *(__IO uint32_t*) (app_address + 4);
 
        __set_MSP(*(__IO uint32_t*) app_address);
 
        (*(void(*)(void))jump_address)();
    }
}

方法二

 
typedef void (*p_APP)(void);
 
/*
 * 功能:运行应用程程序
 * 输入:app_address:应用程序起始地址
 * 输出:
 * 备注: 
 */
void StartApplication(uint32_t app_address)
{
    p_APP application;
    uint32_t jump_address;
 
    if (((*(__IO uint32_t*)app_address) & 0x2FFE0000 ) == 0x20000000)
    {
        jump_address = *(__IO uint32_t*) (app_address + 4);
        application = (p_APP) jump_address;
 
      __set_MSP(*(__IO uint32_t*) app_address);
 
      application();
    }
}

方法三

 
/*
 * 功能:运行应用程程序
 * 输入:app_address:应用程序起始地址
 * 输出:
 * 备注: 
 */
void StartApplication(uint32_t app_address)
{
    void (*p_APP)(void);
    uint32_t jump_address;
 
    if (((*(__IO uint32_t*)app_address) & 0x2FFE0000 ) == 0x20000000)
    {
        jump_address = *(__IO uint32_t*) (app_address + 4);
        p_APP = (void(*)(void))jump_address;
 
        __set_MSP(*(__IO uint32_t*) app_address);
 
        (*p_APP)();
    }
}

设置Flash大小

文件STM32F103ZETX_FLASH.ld

 
/* Memories definition */
MEMORY
{
  RAM    (xrw)    : ORIGIN = 0x20000000,   LENGTH = 64K
  FLASH    (rx)    : ORIGIN = 0x8000000,   LENGTH = 8K
}

APP部分

设置中断向量表偏移量

打开文件system_stm32f1xx.c

将“#define VECT_TAB_OFFSET 0x00000000U”改为“#define VECT_TAB_OFFSET 0x00002000”。
中断向量表偏移地址(0x00002000= APP起始地址(0x08002000- Flash起始地址(0x08000000)。

也可以直接在main()开始直接添加

SCB->VTOR=0x08002000;//对于没有SCB的STM32F030不适用

修改应用程序Flash首地址和大小

文件STM32F103ZETX_FLASH.ld

 
/* Memories definition */
MEMORY
{
  RAM    (xrw)    : ORIGIN = 0x20000000,   LENGTH = 64K
  FLASH    (rx)    : ORIGIN = 0x8002000,   LENGTH = 32K
}

在MDK中直接在界面修改

生成bin文件

fromelf --bin -o "$L@L.bin" "#L"

重启

  1. 使用看门狗
    停止喂狗就可以重启
  2. 不使用看门狗
	HAL_NVIC_SystemReset(); //hal库
	NVIC_SystemReset(); //标准库

flash操作

hal库主要函数

#include “stm32g0xx_hal_flash.h”
HAL_FLASH_Unlock();
HAL_FLASHEx_Erase();
HAL_FLASH_Program();
HAL_FLASH_Lock();

标准库主要函数

#include “stm32f10x_flash.h” //stm32f10x为例
FLASH_Unlock();
FLASH_ErasePage(0x08003000);
FLASH_ProgramHalfWord();
FLASH_Lock();

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值