文章目录
介绍
在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
名称 | 地址 | 大小(字节) |
---|---|---|
Boot | 0x0000 | 0x2000 |
APP | 0x2000 | 0x10000 - boot_size - KV_size = 0xE000 |
KV | 0xFA00 | 0x600 |
END | 0x10000 |
一、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)