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

介绍

在APP程序中,main函数应该首先修改中断向量表的起始地址,可以通过修改VTOR向量表偏移寄存器来重定位向量表。参考《Cortex-M0 权威指南》7.3小节“向量表的起始地址是有要求的:必须先求出系统中共有多少个向量,再把这个数字向上“圆整”到 2 的整次幂,而起始地址必须对齐到后者的边界上。例如,如果一共有 32 个中断,则共有 32+16(系统异常)=48 个向量,向上圆整到2的整次幂后值为64,因此向量表重定位的地址必须能被 64*4=256 整除,从而合法的起始地址可以是:0x0, 0x100, 0x200 等”

有59个中断+16个系统异常,一共65个向量,向上圆整到2的整次幂后值为128,计算得合法的地址是0x0, 0x400, 0x800 … 在main函数中可以设置寄存器的值来重定位向量表,具体实现如下,其中FLASH_VTOR_OFFSET需要根据自己的APP的起始地址进行相应的修改。

[FLASH结构]
CX32L003 64 KB Flash, 4 KB RAM
0x10000 0x2000

名称地址大小(字节)
Boot0x00000x2000
APP0x20000x10000 - boot_size - KV_size = 0xE000
KV0xFA000x600
END0x10000

一、boot工程

1. 第一步:keil配置

设置boot文件大小

在这里插入图片描述

2. 第二步:生产bin文件

目的为了合并文件
在这里插入图片描述

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

3. 第三步:优化代码

减少boot体积
在这里插入图片描述

4. 第四步:编写跳转代码

/********************************************************************************
* @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文件

在这里插入图片描述

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

3. 第三步:优化代码

在这里插入图片描述

4. 第四步:编写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();
}

5. 第五步:重设置中断向量表

利用keil全局搜索关键字"VECT_TAB_OFFSET"

原:

#define VECT_TAB_OFFSET (0)

改:

#define VECT_TAB_OFFSET (BS_FLASH_BOOT_SIZE + BS_FLASH_USER_INFO_SIZE)

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

jianqiang.xue

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值