这是在main_bootloader.c文件里:
264 int main(void)
1 {
2 // initialize vendor sdk
3 sdk_init();
4 // init leds and button
5 gpio_init();
6 // init settings
7 config_init();
8 // Hook for custom boards initialisation
9 board_bootloader_init();
10
11 // check for invalid app image or rst button press. Should be checksum or CRC but NVIC validation is better than nothing.
12 // If the interface has set the hold in bootloader setting don't jump to app
13 if (!reset_button_pressed()
14 && g_board_info.target_cfg
15 && validate_bin_nvic((uint8_t *)g_board_info.target_cfg->flash_regions[0].start)
16 && !config_ram_get_initial_hold_in_bl()) {
17 // change to the new vector table
18 SCB->VTOR = g_board_info.target_cfg->flash_regions[0].start; //bootloaders should only have one flash region for interface
19 // modify stack pointer and start app
20 modify_stack_pointer_and_start_app((*(uint32_t *)(g_board_info.target_cfg->flash_regions[0].start)),
21 (*(uint32_t *)(g_board_info.target_cfg->flash_regions[0].start + 4)));
22 }
这是在main_interface.c文件里:
551 int main(void)
1 {
2 // Explicitly set the vector table since the bootloader might not set
3 // it to what we expect.
4 #if DAPLINK_ROM_BL_SIZE > 0
5 SCB->VTOR = SCB_VTOR_TBLOFF_Msk & DAPLINK_ROM_IF_START;
6 #endif
7 // initialize vendor sdk
8 sdk_init();
9
10 // Initialize CMSIS-RTOS
11 osKernelInitialize();
这是boot里设置的中断向量表的实际地址,文件在stm32f103xb_bl.c:
37 // stm32f103 target information
1 target_cfg_t target_device = {
2 .version = kTargetConfigVersion,
3 .sectors_info = sectors_info,
4 .sector_info_length = (sizeof(sectors_info))/(sizeof(sector_info_t)),
5 .flash_regions[0].start = 0x08000000 + KB(48),
6 .flash_regions[0].end = 0x08000000 + KB(128),
7 .flash_regions[0].flags = kRegionIsDefault,
8 .ram_regions[0].start = 0x20000000,
9 .ram_regions[0].end = 0x20005000,
10 /* .flash_algo not needed for bootloader */
11 };
我看到的iap应用,都是只在app程序里设置SCB->VTOR,为何daplink源码里的boot程序这里,在跳转iap之前,为何也设置了SCB->VTOR?
离线