快捷搜索:  汽车  科技

stm32中断源有几位优先级:中断向量表的位置

stm32中断源有几位优先级:中断向量表的位置IMPORT OS_CPU_PendSVHandlerIMPORT OS_CPU_SysTickHandler从stm32f10x.s可以看到,已经定义好了一大堆的中断响应函数,这就是中断向量表,标号__Vectors,表示中断向量表入口地址,例如:AREA RESET DATA READONLY ; 定义只读数据段,实际上是在CODE区(假设STM32从FLASH启动,则此中断向量表起始地址即为0x8000000) EXPORT __Vectors

一、STM32的启动过程:

1、复位第一条指令:Reset_Handler PROC,这里指定为 LDR R0 =__main。表示调用库函数__main,当然,我们可以在__main前做点事情,比如PLL初始化等。

2、__main()的执行。

3、最后调用用户的main()函数。

二、如何跑到中断入口地址

我们也知道怎么跳到main函数了,那么,中断发生后,又是怎么跑到中断入口地址的呢?

从stm32f10x.s可以看到,已经定义好了一大堆的中断响应函数,这就是中断向量表,标号__Vectors,表示中断向量表入口地址,例如:

AREA RESET DATA READONLY ; 定义只读数据段,实际上是在CODE区(假设STM32从FLASH启动,则此中断向量表起始地址即为0x8000000)

EXPORT __Vectors

IMPORT OS_CPU_SysTickHandler

IMPORT OS_CPU_PendSVHandler

__Vectors DCD __initial_sp ; Top of Stack

DCD Reset_Handler ; Reset Handler

DCD NMI_Handler ; NMI Handler

DCD HardFault_Handler ; Hard Fault Handler

DCD MemManage_Handler ; MPU Fault Handler

DCD BusFault_Handler ; Bus Fault Handler

DCD UsageFault_Handler ; Usage Fault Handler

这个向量表的编写是有讲究的,跟硬件一一对应不能乱写的,CPU找入口地址就靠它了,bin文件开头就是他们的地址,参考手册RM0008的10.1.2节可以看到排列。

对应的bin文件,看是不是放的上面地址:

stm32中断源有几位优先级:中断向量表的位置(1)

显然,200039c0就是栈顶地址,而08006F21就是reset_handler地址!

如何定位?以放到0x20000000为例

1、keil设置ram起始为0x20000100,我们在0x20000000~0x20000100放中断向量表,其他给程序用

2、设置NVIC_SetVectorTable(NVIC_VectTab_FLASH 0);

3、跳到C时把中断向量表拷贝到0x20000000

猜您喜欢: