1. 关于APP程序的中断向量表地址偏移(三种方法,stm32F2与F4系列通用。三种方法本质一样只是看到网上的各种例程的表现形式不一样) ① 直接操作寄存器 在APP程序的main函数的开头设置中断向量表偏移 SCB->VTOR = FLASH_BASE | 0x10000;
其中0x10000是偏移量。。也就是前面的IAP程序所占用的空间大小,要是你的main函数中有SystemInit();的话要在SystemInit();之后添加。 因为SystemInit();中有中断向量表的偏移操作
在void SystemInit (void)系统初始化函数中有初始化中断向量表的语句 #ifdef VECT_TAB_SRAM SCB->VTOR = SRAM_BASE | VECT_TAB_OFFSET; /* 使用内部SRAM启动设置这一句. */ #else SCB->VTOR = FLASH_BASE | VECT_TAB_OFFSET; /* 使用内部FLASH启动设置这句*/ #endif 可以直接修改VECT_TAB_OFFSE的值,这个值代表偏移量。不建议这么改,不建议修改库文件,应为后面其他程序用的话经常忘了这里动过中断向量表,导致中断不能正常运行(我就因为这个浪费了快一天时间,串口就是进不了中断) 其中 #define FLASH_BASE ((uint32_t)0x08000000) /*!<FLASH base address in the alias region */ #define SRAM_BASE ((uint32_t)0x20000000) /*!< SRAM baseaddress in the alias region */
对应keil设置中的(这是一般程序默认的,IAP升级中APP程序的这个地方还得根据中断偏移量改)
② 使用库函数设置偏移量 在库文件中有专门的一个函数 在APP程序初始化时调用函数NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x10000);
其中/* Vector Table Base----------------------------------*/ #define NVIC_VectTab_RAM ((u32)0x20000000) #define NVIC_VectTab_FLASH ((u32)0x08000000)
/*********************************************************************** Function Name : NVIC_SetVectorTable * Description : Sets the vector table location andOffset. * Input : - NVIC_VectTab: specifies if thevector table is in RAM or * FLASH memory. **********************************************************************/ void NVIC_SetVectorTable (u32NVIC_VectTab, u32 Offset) { /* Check the parameters */ assert_param(IS_NVIC_VECTTAB(NVIC_VectTab)); assert_param(IS_NVIC_OFFSET(Offset));
SCB->VTOR = NVIC_VectTab | (Offset & (u32)0x1FFFFF80); }
③修改库文件(不建议使用) 直接修改固件库里面的数值。在void SystemInit(void)下的 /* Configure the Vector Table location add offsetaddress ------------------*/ #ifdefVECT_TAB_SRAM SCB->VTOR = SRAM_BASE | VECT_TAB_OFFSET;/* Internal SRAM */ #else SCB->VTOR = FLASH_BASE | VECT_TAB_OFFSET;/* Internal FLASH */ #endif
直接修改 #define VECT_TAB_OFFSET 0x00 /*!< Vector Table base offset field. This valuemust be a multiple of 0x200. */ 为 #define VECT_TAB_OFFSET 0x10000 /*!< Vector Table base offsetfield. This valuemust be a multiple of 0x200. */
2.关于IAP程序与APP程序keil中的设置 Stm32的flash都是从0x8000000开始的,结束地址看片子的flash大小 Stm32的sram都是从0x2000000开始的,结束地址看片子的sram大小
IAP程序基本默认就行,跟普通程序一样 在APP程序中需要设置一下偏移量
默认的条件下,图中IROM1的起始地址(Start)一般为0X08000000,大小(Size)为0X100000,即从0X08000000开始的1M空间为我们的程序存储(因为我们的STM32F4的FLASH大小是1M)。而图中,我们设置起始地址(Start)为0X08010000,即偏移量为0X10000(64K字节),因而,留给APP用的FLASH空间(Size)只有0X100000-0X10000=0XF0000(960K字节)大小了。设置好Start和Szie,就完成APP程序的起始地址设置。 这里的64K字节,需要大家根据Bootloader程序大小进行选择,比如我们本章的Bootloader程序为22K左右,理论上我们只需要确保APP起始地址在Bootloader之后,并且偏移量为0X200的倍数即可(相关知识,请参考:http://www.openedv.com/posts/list/392.htm)。这里我们选择64K(0X10000)字节,留了一些余量,方便Bootloader以后的升级修改。 注意:设置的起始地址要与程序中设置的中断向量表的偏移量对应起来(如果给IAP程序64k的空间则APPkeil中起始地址为0x8010000相应的程序中中断向量偏移0x10000)我用的1M flash大小的片子。。具体的大小设置,看自己的片子。。
|