[STM32F1] stm32中断向量表是怎么放在指定的地址的?

[复制链接]
14876|20
 楼主| 2602082487 发表于 2016-1-25 16:49 | 显示全部楼层 |阅读模式
MDK里的启动文件是怎么把中断向量表放在指定的地址的?比如51里面有ORG指令,ARM里面如何实现呢?
dongnanxibei 发表于 2016-1-25 17:32 | 显示全部楼层
如何定位?以放到0x20000000为例
1、keil设置ram起始为0x20000100,我们在0x20000000~0x20000100放中断向量表,其他给程序用
2、设置NVIC_SetVectorTable(NVIC_VectTab_FLASH,0);
3、跳到C时把中断向量表拷贝到0x20000000
dongnanxibei 发表于 2016-1-25 17:35 | 显示全部楼层
如果你使用的是ST的库的话,那么在汇编启动文件中已经定义好了。和大多数芯片不一样的是,stm32的中断向量表中存放的不是一条跳转指令,而是一个入口地址。假如说要自己编写的话,一定要用这样的方式:DCD XXXXX    (其中XXXX就是中断服务函数的入口地址,至于转到这个函数由芯片自己处理)
中断向量表默认情况下起始于0x04,(0x00用于堆栈栈顶的地址).对于STM32来说,中断向量表的长度大概是60多还是80多字(记不太清了).每个字代表一个中断向量.
假如使用的是官方库函数的话,那么所有的中断向量表都已经定义好了.比如,TIM1的中断他可能就定义了类似   DCD TIM1ISR     之类的语句
那么我们在主函数中只要定义一个一个isr即可, 比如   定义一个void TIM1ISR()函数就行(必须与那么函数对应).然后设置下nvic和相关外设寄存器即可.
中断的工作过程就是中断向量的映射过程.至于中断重映射是指把中断向量表移动到其它的位置上去.通常和分散加载一起使用,为了使程序在RAM中运行,自然也要把中断向量表放到RAM中,加快程序的运行速度.如果是新手,先别研究这么深的内容,就把中断向量表定死在flash的开头部分,默认地址即可.
xmshao 发表于 2016-1-25 17:45 | 显示全部楼层
stm32各个系列都有相应的后缀为.S的启动文件。

你点进去看看,里面对各个中断向量都有安排。是汇编代码写的,看看大致框架结构就好。

; Vector Table Mapped to Address 0 at Reset
                AREA    RESET, DATA, READONLY
                EXPORT  __Vectors
                EXPORT  __Vectors_End
                EXPORT  __Vectors_Size

__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
                DCD     0                          ; Reserved
                DCD     0                          ; Reserved
                DCD     0                          ; Reserved
                DCD     0                          ; Reserved
                DCD     SVC_Handler                ; SVCall Handler
                DCD     DebugMon_Handler           ; Debug Monitor Handler
                DCD     0                          ; Reserved
                DCD     PendSV_Handler             ; PendSV Handler
                DCD     SysTick_Handler            ; SysTick Handler

                ; External Interrupts
                DCD     WWDG_IRQHandler            ; Window Watchdog
                DCD     PVD_IRQHandler             ; PVD through EXTI Line detect
                DCD     TAMPER_IRQHandler          ; Tamper
                DCD     RTC_IRQHandler             ; RTC
                DCD     FLASH_IRQHandler           ; Flash
。。。。。。。。。。。。。。
可可球 发表于 2016-1-25 19:51 | 显示全部楼层
官方库函数所有的中断向量表都已经定义好的
FireRiver9 发表于 2016-1-25 20:54 | 显示全部楼层
ORG是汇编语言吧,stm32应该是定义好的,可能也是用的汇编,便于开发
苏山人家 发表于 2016-1-25 21:10 来自手机 | 显示全部楼层
楼上各位说的都是系统刚运行的时候的向量表,这个一般.s
苏山人家 发表于 2016-1-25 21:13 来自手机 | 显示全部楼层
文件,如果运行过程中需要修改可以使用NVIC_SetVectorTable函数,使用前一定要关全局还有就是中断向量表里面都仅仅是一条跳转指令,所以如果有不需要的中断尽量也分配一个处理函数。e
 楼主| 2602082487 发表于 2016-1-26 21:01 | 显示全部楼层
dongnanxibei 发表于 2016-1-25 17:35
如果你使用的是ST的库的话,那么在汇编启动文件中已经定义好了。和大多数芯片不一样的是,stm32的中断向量 ...

我的意思是,没有类似ORG的指令,怎么能保证第一条DCD XXX放在0x8000000地址处呢
sjnh 发表于 2016-1-26 21:46 | 显示全部楼层
程序中定义SECTION
        SECTION .intvec:CODE:NOROOT(2)
        EXTERN  __iar_program_start
        PUBLIC  __vector_table
        DATA
__vector_table
        DCD     sfe(CSTACK)
        DCD     __iar_program_start

icf中指定位置
place at address mem:__intvec_start__ { readonly section .intvec };

以上是IAR的,MDK中是 AREA    RESET, DATA, READONLY 和 SCT文件
yjmwxwx 发表于 2016-1-27 00:59 | 显示全部楼层
0XE000ED08 设置的

你们写程序的时候有过一个中断配好几个服务函数的时候么?
放到内存就为了可以随时修改到底用哪一个,这功能估计没人用吧,不用的话就不用管他了
冰河w 发表于 2016-1-27 18:58 | 显示全部楼层
中断的工作过程就是中断向量的映射过程
dongnanxibei 发表于 2016-1-28 21:21 | 显示全部楼层
2602082487 发表于 2016-1-26 21:01
我的意思是,没有类似ORG的指令,怎么能保证第一条DCD XXX放在0x8000000地址处呢 ...

不是很懂这个,说不定就这样就可以了,不需要ORG,因为这个不是纯粹的汇编。
Beckham_Owen 发表于 2016-1-29 10:23 | 显示全部楼层
一般这个都是汇编语句完成的吧
zhuotuzi 发表于 2016-1-30 10:29 | 显示全部楼层
stm32的中断向量表中存放的不是一条跳转指令,而是一个入口地址
dongnanxibei 发表于 2016-1-30 11:05 | 显示全部楼层
如果运行过程中需要修改可以使用NVIC_SetVectorTable函数
史迪威将军 发表于 2016-1-30 15:33 | 显示全部楼层
在keil mdk的启动文件里面都有
huangcunxiake 发表于 2016-1-31 20:15 | 显示全部楼层
中断向量表默认情况下起始于0x04,(0x00用于堆栈栈顶的地址).对于STM32来说,中断向量表的长度大概是60多还是80多字(记不太清了).每个字代表一个中断向量.
假如使用的是官方库函数的话,那么所有的中断向量表都已经定义好了.比如,TIM1的中断他可能就定义了类似   DCD TIM1ISR     之类的语句
那么我们在主函数中只要定义一个一个isr即可, 比如   定义一个void TIM1ISR()函数就行(必须与那么函数对应).然后设置下nvic和相关外设寄存器即可.
zchong 发表于 2016-2-1 22:51 | 显示全部楼层
链接过程研究一下,前面10楼已经提到了
idqiye 发表于 2016-11-14 10:10 | 显示全部楼层
求正解
您需要登录后才可以回帖 登录 | 注册

本版积分规则

3

主题

35

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部