打印
[STM32F1]

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

[复制链接]
14271|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
。。。。。。。。。。。。。。

使用特权

评论回复
5
可可球| | 2016-1-25 19:51 | 只看该作者
官方库函数所有的中断向量表都已经定义好的

使用特权

评论回复
6
FireRiver9| | 2016-1-25 20:54 | 只看该作者
ORG是汇编语言吧,stm32应该是定义好的,可能也是用的汇编,便于开发

使用特权

评论回复
7
苏山人家| | 2016-1-25 21:10 | 只看该作者
楼上各位说的都是系统刚运行的时候的向量表,这个一般.s

使用特权

评论回复
8
苏山人家| | 2016-1-25 21:13 | 只看该作者
文件,如果运行过程中需要修改可以使用NVIC_SetVectorTable函数,使用前一定要关全局还有就是中断向量表里面都仅仅是一条跳转指令,所以如果有不需要的中断尽量也分配一个处理函数。e

使用特权

评论回复
9
2602082487|  楼主 | 2016-1-26 21:01 | 只看该作者
dongnanxibei 发表于 2016-1-25 17:35
如果你使用的是ST的库的话,那么在汇编启动文件中已经定义好了。和大多数芯片不一样的是,stm32的中断向量 ...

我的意思是,没有类似ORG的指令,怎么能保证第一条DCD XXX放在0x8000000地址处呢

使用特权

评论回复
10
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文件

使用特权

评论回复
11
yjmwxwx| | 2016-1-27 00:59 | 只看该作者
0XE000ED08 设置的

你们写程序的时候有过一个中断配好几个服务函数的时候么?
放到内存就为了可以随时修改到底用哪一个,这功能估计没人用吧,不用的话就不用管他了

使用特权

评论回复
12
冰河w| | 2016-1-27 18:58 | 只看该作者
中断的工作过程就是中断向量的映射过程

使用特权

评论回复
13
dongnanxibei| | 2016-1-28 21:21 | 只看该作者
2602082487 发表于 2016-1-26 21:01
我的意思是,没有类似ORG的指令,怎么能保证第一条DCD XXX放在0x8000000地址处呢 ...

不是很懂这个,说不定就这样就可以了,不需要ORG,因为这个不是纯粹的汇编。

使用特权

评论回复
14
Beckham_Owen| | 2016-1-29 10:23 | 只看该作者
一般这个都是汇编语句完成的吧

使用特权

评论回复
15
zhuotuzi| | 2016-1-30 10:29 | 只看该作者
stm32的中断向量表中存放的不是一条跳转指令,而是一个入口地址

使用特权

评论回复
16
dongnanxibei| | 2016-1-30 11:05 | 只看该作者
如果运行过程中需要修改可以使用NVIC_SetVectorTable函数

使用特权

评论回复
17
史迪威将军| | 2016-1-30 15:33 | 只看该作者
在keil mdk的启动文件里面都有

使用特权

评论回复
18
huangcunxiake| | 2016-1-31 20:15 | 只看该作者
中断向量表默认情况下起始于0x04,(0x00用于堆栈栈顶的地址).对于STM32来说,中断向量表的长度大概是60多还是80多字(记不太清了).每个字代表一个中断向量.
假如使用的是官方库函数的话,那么所有的中断向量表都已经定义好了.比如,TIM1的中断他可能就定义了类似   DCD TIM1ISR     之类的语句
那么我们在主函数中只要定义一个一个isr即可, 比如   定义一个void TIM1ISR()函数就行(必须与那么函数对应).然后设置下nvic和相关外设寄存器即可.

使用特权

评论回复
19
zchong| | 2016-2-1 22:51 | 只看该作者
链接过程研究一下,前面10楼已经提到了

使用特权

评论回复
20
idqiye| | 2016-11-14 10:10 | 只看该作者
求正解

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

3

主题

35

帖子

0

粉丝