这里写目录标题
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"
重启
- 使用看门狗
停止喂狗就可以重启 - 不使用看门狗
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();