stm32中断服务函数的机制

来源:互联网 发布:如何开好淘宝直通车 编辑:程序博客网 时间:2024/06/09 17:01

  简述:当中断触发时,会保存当前运行状态,然后跳转到中断向量处执行(可嵌套),中断完成后再返回保存的运行状态执行。


  中断服务函数并非用户(写程序的人)调用,而是预先写入中断向量(相应中断执行首地址),中断发生后自动执行,所以源码中只需定义实现自己的中断服务函数而不需要考虑在mian中调用的时。


  那么问题的关键便是一个普通的c函数是如何实现写入中断向量。mcu的地址最低区是用作中断向量表的,即中断触发后,将执行相应中断向量(字)处的指令(一般为跳转指令)然后跳转到相应的中断服务函数执行,那么中断向量是如何跳转到中断服务函数的地址的呢。


首先我们要看中断服务函数的声明,库文件中唯一的中断服务函数标示符只存在startup.s中,废话少说上代码:

;******************** (C) COPYRIGHT 2014 STMicroelectronics ********************;* File Name          : startup_stm32f051.s;* Author             : MCD Application Team;* Version            : V1.4.0;* Date               : 24-July-2014;* Description        : STM32F051 devices vector table for MDK-ARM toolchain.;*                      This module performs:;*                      - Set the initial SP;*                      - Set the initial PC == Reset_Handler;*                      - Set the vector table entries with the exceptions ISR address;*                      - Configure the system clock;*                      - Branches to __main in the C library (which eventually;*                        calls main()).;*                      After Reset the CortexM0 processor is in Thread mode,;*                      priority is Privileged, and the Stack is set to Main.;* <<< Use Configuration Wizard in Context Menu >>>   ;*******************************************************************************;  @attention; ;  Licensed under MCD-ST Liberty SW License Agreement V2, (the "License");;  You may not use this file except in compliance with the License.;  You may obtain a copy of the License at:; ;         http://www.st.com/software_license_agreement_liberty_v2; ;  Unless required by applicable law or agreed to in writing, software ;  distributed under the License is distributed on an "AS IS" BASIS, ;  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.;  See the License for the specific language governing permissions and;  limitations under the License.; ;*******************************************************************************;; 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>Stack_Size      EQU     0x00000400                AREA    STACK, NOINIT, READWRITE, ALIGN=3Stack_Mem       SPACE   Stack_Size__initial_sp; <h> Heap Configuration;   <o>  Heap Size (in Bytes) <0x0-0xFFFFFFFF:8>; </h>Heap_Size       EQU     0x00000200                AREA    HEAP, NOINIT, READWRITE, ALIGN=3__heap_baseHeap_Mem        SPACE   Heap_Size__heap_limit                PRESERVE8                THUMB; 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     0                              ; Reserved                DCD     0                              ; Reserved                DCD     0                              ; Reserved                DCD     0                              ; Reserved                DCD     0                              ; Reserved                DCD     0                              ; Reserved                DCD     0                              ; Reserved                DCD     SVC_Handler                    ; SVCall Handler                DCD     0                              ; Reserved                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     RTC_IRQHandler                 ; RTC through EXTI Line                DCD     FLASH_IRQHandler               ; FLASH                DCD     RCC_IRQHandler                 ; RCC                DCD     EXTI0_1_IRQHandler             ; EXTI Line 0 and 1                DCD     EXTI2_3_IRQHandler             ; EXTI Line 2 and 3                DCD     EXTI4_15_IRQHandler            ; EXTI Line 4 to 15                DCD     TS_IRQHandler                  ; TS                DCD     DMA1_Channel1_IRQHandler       ; DMA1 Channel 1                DCD     DMA1_Channel2_3_IRQHandler     ; DMA1 Channel 2 and Channel 3                DCD     DMA1_Channel4_5_IRQHandler     ; DMA1 Channel 4 and Channel 5                DCD     ADC1_COMP_IRQHandler           ; ADC1, COMP1 and COMP2                 DCD     TIM1_BRK_UP_TRG_COM_IRQHandler ; TIM1 Break, Update, Trigger and Commutation                DCD     TIM1_CC_IRQHandler             ; TIM1 Capture Compare                DCD     TIM2_IRQHandler                ; TIM2                DCD     TIM3_IRQHandler                ; TIM3                DCD     TIM6_DAC_IRQHandler            ; TIM6 and DAC                DCD     0                              ; Reserved                DCD     TIM14_IRQHandler               ; TIM14                DCD     TIM15_IRQHandler               ; TIM15                DCD     TIM16_IRQHandler               ; TIM16                DCD     TIM17_IRQHandler               ; TIM17                DCD     I2C1_IRQHandler                ; I2C1                DCD     I2C2_IRQHandler                ; I2C2                DCD     SPI1_IRQHandler                ; SPI1                DCD     SPI2_IRQHandler                ; SPI2                DCD     USART1_IRQHandler              ; USART1                DCD     USART2_IRQHandler              ; USART2                DCD     0                              ; Reserved                DCD     CEC_IRQHandler                 ; CEC                DCD     0                              ; Reserved                __Vectors_End__Vectors_Size  EQU  __Vectors_End - __Vectors                AREA    |.text|, CODE, READONLY; Reset handler routineReset_Handler    PROC                 EXPORT  Reset_Handler                 [WEAK]        IMPORT  __main        IMPORT  SystemInit        LDR     R0, =__initial_sp          ; set stack pointer         MSR     MSP, R0  ;;Check if boot space corresponds to test memory         LDR R0,=0x00000004        LDR R1, [R0]        LSRS R1, R1, #24        LDR R2,=0x1F        CMP R1, R2                BNE ApplicationStart       ;; SYSCFG clock enable                 LDR R0,=0x40021018         LDR R1,=0x00000001        STR R1, [R0]        ;; Set CFGR1 register with flash memory remap at address 0        LDR R0,=0x40010000         LDR R1,=0x00000000        STR R1, [R0]ApplicationStart                         LDR     R0, =SystemInit                 BLX     R0                 LDR     R0, =__main                 BX      R0                 ENDP; Dummy Exception Handlers (infinite loops which can be modified)NMI_Handler     PROC                EXPORT  NMI_Handler                    [WEAK]                B       .                ENDPHardFault_Handler\                PROC                EXPORT  HardFault_Handler              [WEAK]                B       .                ENDPSVC_Handler     PROC                EXPORT  SVC_Handler                    [WEAK]                B       .                ENDPPendSV_Handler  PROC                EXPORT  PendSV_Handler                 [WEAK]                B       .                ENDPSysTick_Handler PROC                EXPORT  SysTick_Handler                [WEAK]                B       .                ENDPDefault_Handler PROC                EXPORT  WWDG_IRQHandler                [WEAK]                EXPORT  PVD_IRQHandler                 [WEAK]                EXPORT  RTC_IRQHandler                 [WEAK]                EXPORT  FLASH_IRQHandler               [WEAK]                EXPORT  RCC_IRQHandler                 [WEAK]                EXPORT  EXTI0_1_IRQHandler             [WEAK]                EXPORT  EXTI2_3_IRQHandler             [WEAK]                EXPORT  EXTI4_15_IRQHandler            [WEAK]                EXPORT  TS_IRQHandler                  [WEAK]                EXPORT  DMA1_Channel1_IRQHandler       [WEAK]                EXPORT  DMA1_Channel2_3_IRQHandler     [WEAK]                EXPORT  DMA1_Channel4_5_IRQHandler     [WEAK]                EXPORT  ADC1_COMP_IRQHandler           [WEAK]                EXPORT  TIM1_BRK_UP_TRG_COM_IRQHandler [WEAK]                EXPORT  TIM1_CC_IRQHandler             [WEAK]                EXPORT  TIM2_IRQHandler                [WEAK]                EXPORT  TIM3_IRQHandler                [WEAK]                EXPORT  TIM6_DAC_IRQHandler            [WEAK]                EXPORT  TIM14_IRQHandler               [WEAK]                EXPORT  TIM15_IRQHandler               [WEAK]                EXPORT  TIM16_IRQHandler               [WEAK]                EXPORT  TIM17_IRQHandler               [WEAK]                EXPORT  I2C1_IRQHandler                [WEAK]                EXPORT  I2C2_IRQHandler                [WEAK]                EXPORT  SPI1_IRQHandler                [WEAK]                EXPORT  SPI2_IRQHandler                [WEAK]                EXPORT  USART1_IRQHandler              [WEAK]                EXPORT  USART2_IRQHandler              [WEAK]                EXPORT  CEC_IRQHandler                 [WEAK]WWDG_IRQHandlerPVD_IRQHandlerRTC_IRQHandlerFLASH_IRQHandlerRCC_IRQHandlerEXTI0_1_IRQHandlerEXTI2_3_IRQHandlerEXTI4_15_IRQHandlerTS_IRQHandlerDMA1_Channel1_IRQHandlerDMA1_Channel2_3_IRQHandlerDMA1_Channel4_5_IRQHandlerADC1_COMP_IRQHandler TIM1_BRK_UP_TRG_COM_IRQHandlerTIM1_CC_IRQHandlerTIM2_IRQHandlerTIM3_IRQHandlerTIM6_DAC_IRQHandlerTIM14_IRQHandlerTIM15_IRQHandlerTIM16_IRQHandlerTIM17_IRQHandlerI2C1_IRQHandlerI2C2_IRQHandlerSPI1_IRQHandlerSPI2_IRQHandlerUSART1_IRQHandlerUSART2_IRQHandlerCEC_IRQHandler                   B       .                ENDP                ALIGN;*******************************************************************************; User Stack and Heap initialization;*******************************************************************************                 IF      :DEF:__MICROLIB                                 EXPORT  __initial_sp                 EXPORT  __heap_base                 EXPORT  __heap_limit                                 ELSE                                 IMPORT  __use_two_region_memory                 EXPORT  __user_initial_stackheap                 __user_initial_stackheap                 LDR     R0, =  Heap_Mem                 LDR     R1, =(Stack_Mem + Stack_Size)                 LDR     R2, = (Heap_Mem +  Heap_Size)                 LDR     R3, = Stack_Mem                 BX      LR                 ALIGN                 ENDIF                 END;************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE*****
上述代码从地址0处开始初始化中断向量表:即在相应向量的字大小的空间首地址定义了相应中断服务函数的标号(标号即地址)

然后再在后面实现了标号(即将标号中的指令写入DCD分配的中断向量中也就是写入标号对应地址)因此中断触发后会首先执行中断向量处写入的指令

然后再看看标号后面的代码首先执行的便是中断服务函数的同名标号注意[WEAK](也就是若定义了其他同名标号(包括c标识符)那么执行其他标号),通过在c中定义同名中断服务函数来实现从中断向量到中断服务函数的跳转

0 0
原创粉丝点击