[单片机][cx32][boot] boot配置 中断向量表 跳转 keil5

时间:2022-10-31 22:56:27


boot

  1. 第一步:keil配置

[单片机][cx32][boot] boot配置 中断向量表 跳转 keil5

  1. 第二步:生产bin文件

[单片机][cx32][boot] boot配置 中断向量表 跳转 keil5

$K\ARM\ARMCC\bin\fromelf.exe --bin --output=.\out\bin@L.bin !L

  1. 第三步:优化代码
  2. 第四步:编写跳转代码
/********************************************************************************
* @file main.c
* @author jianqiang.xue
* @Version V1.0.0
* @Date 2021-04-03
* @brief
********************************************************************************/

#include <stdio.h>
#include "cx32l003_hal.h"

#include "bsp_system_clock.h"
#include "bsp_key.h"
#include "bsp_uart.h"

#include "business_gpio.h"

#define APP_TARGET_ADDR (BS_FLASH_BOOT_SIZE + BS_FLASH_USER_INFO_SIZE)

typedef void (*p_func)(void);

p_func jump_app;
uint32_t jump_addr;

void hardware_init(void)
{
/* Configure the system clock to HIRC 24MHz*/
bsp_system_clock_config();
bsp_button_init();
bsp_uart_init();
}

/*
* main: initialize and start the system
*/
int main(void)
{
hardware_init();
printf("run\r\n");
if (bsp_button_get_state(BSP_BUTTON_0) == 0)
{
boot:
printf("boot\r\n");
}
else
{
HAL_NVIC_DisableIRQ(UART0_IRQn);
bsp_uart0_deinit();
bsp_button_deinit(BSP_BUTTON_0);

if (((*(__IO uint32_t*)APP_TARGET_ADDR) & 0x2FFE0000 ) == 0x20000000)
{
/* jump to user application */
jump_addr = *(__IO uint32_t*) (APP_TARGET_ADDR + 4);
jump_app = (p_func) jump_addr;
/* initialize user application's stack pointer */
__set_PSP(*(__IO uint32_t*) APP_TARGET_ADDR);
__set_CONTROL(0);
__set_MSP(*(__IO uint32_t*) APP_TARGET_ADDR);

jump_app();
}
goto boot;
}
while(1);
}

APP

  1. 第一步:keil配置
  2. 第二步:生产bin文件

[单片机][cx32][boot] boot配置 中断向量表 跳转 keil5

$K\ARM\ARMCC\bin\fromelf.exe --bin --output=.\out\bin@L.bin !L

  1. 第三步:优化代码
  2. [单片机][cx32][boot] boot配置 中断向量表 跳转 keil5

  3. 第四步:编写APP代码
/********************************************************************************
* @file main.c
* @author jianqiang.xue
* @Version V1.0.0
* @Date 2021-04-03
* @brief
********************************************************************************/

#include <stdio.h>

#include "os_api.h"

#include "bsp_system_clock.h"
#include "bsp_led.h"
#include "bsp_key.h"
#include "bsp_adc.h"
#include "bsp_i2c.h"
#include "bsp_uart.h"

#include "app_key.h"

#include "business_function.h"

extern uint8_t app_main_init(void);

void hardware_init(void)
{
/* Configure the system clock to HIRC 24MHz*/
bsp_system_clock_config();
bsp_led_init();
bsp_button_init();
bsp_adc0_init();
bsp_i2c_init();
bsp_uart_init();
}

/*
* main: initialize and start the system
*/
int main(void)
{
hardware_init();
os_kernel_initialize();
app_key_init();
app_main_init();
os_kernel_start();
}
  1. 第五步:重设置中断向量表
    利用keil全局搜索关键字"VECT_TAB_OFFSET"

原:

#define VECT_TAB_OFFSET (0)

改:

#define VECT_TAB_OFFSET (BS_FLASH_BOOT_SIZE + BS_FLASH_USER_INFO_SIZE)