中断向量表
- 格式:docx
- 大小:26.68 KB
- 文档页数:11
******************** (C) COPYRIGHT 2009 STMicroelectronics ********************;* File Name : startup_stm32f10x_cl.s;* Author : MCD Application Team;* Version : V3.1.0;* Date : 06/19/2009;* Description : STM32F10x Connectivity line devices vector table for RVMDK;* toolchain.;* This module performs:;* - Set the initial SP;* - Set the initial PC == Reset_Handler;* - Set the vector table entries with the exceptions ISR address;* - Branches to __main in the C library (which eventually;* calls main()).;* After Reset the CortexM3 processor is in Thread mode,;* priority is Privileged, and the Stack is set to Main.;* <<< Use Configuration Wizard in Context Menu >>>;*******************************************************************************; THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS; WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR TH EM TO SAVE TIME.; AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY DI RECT,; INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARIS ING FROM THE; CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF TH E CODING; INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. ;*******************************************************************************; Amount of memory (in bytes) allocated for Stack; Tailor this value to your application needs; <h> Stack Configuration; <o> Stack Size (in Bytes) <0x0-0xFFFFFFFF:8>; </h>; 首先对栈和堆的大小进行定义,并在代码区的起始处建立中断向量表,其第一个表项是栈; 顶地址,第二个表项是复位中断服务入口地址。
然后在复位中断服务程序中跳转C/C++标; 准实时库的__main函数。
假设STM32被设置为从内部FLASH启动中断向量表起始地位为0x8000000,; 则栈顶地址存放于0x8000000处,而复位中断服务入口地址存放于0x8000004处。
当STM32遇; 到复位信号后,则从0x80000004处取出复位中断服务入口地址继而执行复位中断服务程序,; 然后跳转__main函数,最后来到C的世界。
; DCD指令:作用是开辟一段空间,其意义等价于C语言中的地址符“&”。
开始建立的中断向量; 表则类似于使用C语.其每一个成员都是一个函数指针,分别指向各个中断服务函数;伪指令AREA,表示开辟一段大小为Stack_Size的内存空间作为栈,段名是STACK,可读可写。
;NOINIT:指定此数据段仅仅保留了内存单元,而没有将各初始值写入内存单元,或者将各个内存单元值初始化为0;常见的数据定义伪指令有如下几种:;— DCB 用于分配一片连续的字节存储单元并用指定的数据初始化。
;— DCW (DCWU)用于分配一片连续的半字存储单元并用指定的数据初始化。
;— DCD (DCDU)用于分配一片连续的字存储单元并用指定的数据初始化。
;— DCFD (DCFDU)用于为双精度的浮点数分配一片连续的字存储单元并用指定的数据初始化。
;— DCFS DCFSU)用于为单精度的浮点数分配一片连续的字存储单元并用指定的数据初始化。
;— DCQ DCQU)用于分配一片以 8 字节为单位的连续的存储单元并用指定的数据初始化。
;— SPACE 用于分配一片连续的存储单元;— MAP 用于定义一个结构化的内存表首地址;— FIELD 用于定义一个结构化的内存表的数据域;EXPORT伪指令用于在程序中声明一个全局的标号,该标号可在其他的文件中引用。
EXPORT可用GLOBAL代替。
标号在程序中区分大小写,[WEAK]选项声明其他的同名标号优先于该标号被引用。
;;启动代码作用一般是:;;1)堆和栈的初始化;;2)向量表定义;;;3)地址重映射及中断向量表的转移;;;4)设置系统时钟频率;;;5)中断寄存器的初始化;;;6)进入C应用程序。
;1)堆和栈的初始化Stack_Size EQU 0x00000400 ;栈区(stack)—由编译器自动分配释放,存放函数的参数值,局部变量的值等。
其操作方式类似于数据结构中的栈;SPACE用来分配一片连续的存储区域并初始化为0.AREA STACK, NOINIT, READWRITE, ALIGN=3 ;AREA 伪指令用于定义一个代码段或数据,;定义栈,可初始为0,8字节对齐2*2*2,2的3次方;NOINIT:指定此数据段仅仅保留了内存单元,;READWRITE属性:指定本段为可读可写,数据段的默认属性为READWRITE。
;STACK 段名;ALIGN属性:使用方式为ALIGN 表达式。
在默认时,ELF(可执行连接文件)的代码段和数据段是按字对齐的,表达式的取值范围为0~31,相应的对齐方式为2表达式次方。
Stack_Mem SPACE Stack_Size ;;分配0x400个连续字节,并初始化为0__initial_sp ;标号__initial_sp,表示栈空间顶地址。
;汇编代码地址标号; <h> Heap Configuration; <o> Heap Size (in Bytes) <0x0-0xFFFFFFFF:8>; </h>Heap_Size EQU 0x00000200 ;堆区(heap)—一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收。
注意它与数据结构中的堆是两回事,分配方式倒是类似于链表AREA HEAP, NOINIT, READWRITE, ALIGN=3 ;ALIGN用来指定对齐方式, 8字节对齐__heap_base ;表示堆空间起始地址Heap_Mem SPACE Heap_Size__heap_limit ;表示堆空间结束地址PRESERVE8 ;PRESERVE8 指令指定当前文件保持堆栈八字节对齐THUMB ; 告诉汇编器下面是32位的Thumb指令,如果需要汇编器将插入位以保证对齐;2)中断向量表定义; Vector Table Mapped to Address 0 at Reset ;实际上是在CODE区(假设STM32从FLASH启动,则此中断向量表起始地址即为0x8000000)AREA RESET, DATA, READONLY ;定义一块数据段,只可读,段名字是RESET ;DATA属性:用于定义数据段,默认为READWRITE。
指定本段为可读可写EXPORT __Vectors ;EXPORT:在程序中声明一个全局的标号__Vectors,该标号可在其他的文件中引用EXPORT __Vectors_End ;在程序中声明一个全局的标号__Vectors_EndEXPORT __Vectors_Size ;在程序中声明一个全局的标号__Vectors_Size__Vectors DCD __initial_sp ; Top of Stack 第一个表项是栈顶地址;该处物理地址值即为 __Vetors 标号所表示的值,;该地址中存储__initial_sp所表示的地址值,;大小为一个字(32bit)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 ; ReservedDCD 0 ; ReservedDCD 0 ; ReservedDCD SVC_Handler ; SVCall Handler 执行系统服务调用指令(SVC)引发的异常DCD DebugMon_Handler ; Debug Monitor Handler 调试监视器(断点,数据观察点,或者是外部调试请求DCD 0 ; ReservedDCD PendSV_Handler ; PendSV Handler 为系统设备而设的“可悬挂请求”(pendable request)DCD SysTick_Handler ; SysTick Handler 系统滴答定时器; External Interrupts 外设中断DCD WWDG_IRQHandler ; Window Watchdog 窗口看门狗DCD PVD_IRQHandler ; PVD through EXTI Line detect 电源电压检测(PVD)中断DCD TAMPER_IRQHandler ; TamperDCD RTC_IRQHandler ; RTCDCD FLASH_IRQHandler ; FlashDCD RCC_IRQHandler ; RCCDCD EXTI0_IRQHandler ; EXTI Line 0DCD EXTI1_IRQHandler ; EXTI Line 1DCD EXTI2_IRQHandler ; EXTI Line 2DCD EXTI3_IRQHandler ; EXTI Line 3DCD EXTI4_IRQHandler ; EXTI Line 4DCD DMA1_Channel1_IRQHandler ; DMA1 Channel 1DCD DMA1_Channel2_IRQHandler ; DMA1 Channel 2DCD DMA1_Channel3_IRQHandler ; DMA1 Channel 3DCD DMA1_Channel4_IRQHandler ; DMA1 Channel 4DCD DMA1_Channel5_IRQHandler ; DMA1 Channel 5DCD DMA1_Channel6_IRQHandler ; DMA1 Channel 6DCD DMA1_Channel7_IRQHandler ; DMA1 Channel 7DCD ADC1_2_IRQHandler ; ADC1 and ADC2DCD CAN1_TX_IRQHandler ; CAN1 TXDCD CAN1_RX0_IRQHandler ; CAN1 RX0DCD CAN1_RX1_IRQHandler ; CAN1 RX1DCD CAN1_SCE_IRQHandler ; CAN1 SCEDCD EXTI9_5_IRQHandler ; EXTI Line 9..5DCD TIM1_BRK_IRQHandler ; TIM1 BreakDCD TIM1_UP_IRQHandler ; TIM1 UpdateDCD TIM1_TRG_COM_IRQHandler ; TIM1 Trigger and CommutationDCD TIM1_CC_IRQHandler ; TIM1 Capture CompareDCD TIM2_IRQHandler ; TIM2DCD TIM3_IRQHandler ; TIM3DCD TIM4_IRQHandler ; TIM4DCD I2C1_EV_IRQHandler ; I2C1 EventDCD I2C1_ER_IRQHandler ; I2C1 ErrorDCD I2C2_EV_IRQHandler ; I2C2 EventDCD I2C2_ER_IRQHandler ; I2C1 ErrorDCD SPI1_IRQHandler ; SPI1DCD SPI2_IRQHandler ; SPI2DCD USART1_IRQHandler ; USART1DCD USART2_IRQHandler ; USART2DCD USART3_IRQHandler ; USART3DCD EXTI15_10_IRQHandler ; EXTI Line 15..10DCD RTCAlarm_IRQHandler ; RTC alarm through EXTI lineDCD OTG_FS_WKUP_IRQHandler ; USB OTG FS Wakeup through EXTI lineDCD 0 ; ReservedDCD 0 ; ReservedDCD 0 ; ReservedDCD 0 ; ReservedDCD 0 ; ReservedDCD 0 ; ReservedDCD 0 ; ReservedDCD TIM5_IRQHandler ; TIM5DCD SPI3_IRQHandler ; SPI3DCD UART4_IRQHandler ; UART4DCD UART5_IRQHandler ; UART5DCD TIM6_IRQHandler ; TIM6DCD TIM7_IRQHandler ; TIM7DCD DMA2_Channel1_IRQHandler ; DMA2 Channel1DCD DMA2_Channel2_IRQHandler ; DMA2 Channel2DCD DMA2_Channel3_IRQHandler ; DMA2 Channel3DCD DMA2_Channel4_IRQHandler ; DMA2 Channel4DCD DMA2_Channel5_IRQHandler ; DMA2 Channel5DCD ETH_IRQHandler ; EthernetDCD ETH_WKUP_IRQHandler ; Ethernet Wakeup through EXTI lineDCD CAN2_TX_IRQHandler ; CAN2 TXDCD CAN2_RX0_IRQHandler ; CAN2 RX0DCD CAN2_RX1_IRQHandler ; CAN2 RX1DCD CAN2_SCE_IRQHandler ; CAN2 SCEDCD OTG_FS_IRQHandler ; USB OTG FS__Vectors_End ; 结束__Vectors_Size EQU __Vectors_End - __Vectors ;得到向量表的大小,304个字节也就是0x130个字节;3)地址重映射及中断向量表的转移;AREA |.text|, CODE, READONLY ;定义一个代码段,可读,段名字是.text 段名若以数字开头,则该段名需用"|"括起来,如|1_test|。