mollylawrence 发表于 2023-3-30 22:00

STM32中断向量偏移

1. 关于APP程序的中断向量表地址偏移(三种方法,stm32F2与F4系列通用。三种方法本质一样只是看到网上的各种例程的表现形式不一样)① 直接操作寄存器在APP程序的main函数的开头设置中断向量表偏移SCB->VTOR = FLASH_BASE | 0x10000;
其中0x10000是偏移量。。也就是前面的IAP程序所占用的空间大小,要是你的main函数中有SystemInit();的话要在SystemInit();之后添加。因为SystemInit();中有中断向量表的偏移操作
在void SystemInit (void)系统初始化函数中有初始化中断向量表的语句#ifdef VECT_TAB_SRAMSCB->VTOR = SRAM_BASE | VECT_TAB_OFFSET; /* 使用内部SRAM启动设置这一句. */#elseSCB->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程序的这个地方还得根据中断偏移量改)https://www.pianshen.com/images/504/29f70924fdb68f4151fcfe8c46ff3198.png



② 使用库函数设置偏移量在库文件中有专门的一个函数在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_SRAMSCB->VTOR = SRAM_BASE | VECT_TAB_OFFSET;/* Internal SRAM */#elseSCB->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程序基本默认就行,跟普通程序一样https://www.pianshen.com/images/716/b188a1c8d26f85fcc03908360b10f094.JPEG
在APP程序中需要设置一下偏移量https://www.pianshen.com/images/319/44650b5eab416d072ad7d288df26bd0f.png

默认的条件下,图中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大小的片子。。具体的大小设置,看自己的片子。。

qbwww 发表于 2023-3-31 12:40

#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 */

童雨竹 发表于 2024-4-15 07:10


宽度则与电感量和电阻量成反比

Wordsworth 发表于 2024-4-15 08:13


电流要增大

Clyde011 发表于 2024-4-15 09:16


整流器或功率开关管与每个电容端的连线长度和宽度都要一样

公羊子丹 发表于 2024-4-15 10:09


有些信号包含丰富的高频分量

万图 发表于 2024-4-15 11:12


交流电流环路的布线要在其他引线之前布好

Uriah 发表于 2024-4-15 12:15


其他的信号和地要与这些高压引线和它的散热部分隔开

帛灿灿 发表于 2024-4-15 14:11


功率开关或整流环的连接没有直接接到电容的两端

Bblythe 发表于 2024-4-15 15:14


变压器隔离拓扑中,变压器有多少个绕组

周半梅 发表于 2024-4-15 17:10


在直流电流上叠加了一些小的交流电流分量

Pulitzer 发表于 2024-4-15 18:13


连接点是产生控制IC所要检测的小电压的所有器件的公共连接点
页: [1]
查看完整版本: STM32中断向量偏移