stm32中断服务函数的机制

发布者:w2628203123最新更新时间:2018-11-29 来源: eefocus关键字:stm32  中断服务函数  机制 手机看文章 扫描二维码
随时随地手机看文章

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


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

;

;   

;


Stack_Size      EQU     0x00000400


                AREA    STACK, NOINIT, READWRITE, ALIGN=3

Stack_Mem       SPACE   Stack_Size

__initial_sp



;

;   

;


Heap_Size       EQU     0x00000200


                AREA    HEAP, NOINIT, READWRITE, ALIGN=3

__heap_base

Heap_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 routine

Reset_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       .

                ENDP

HardFault_Handler\

                PROC

                EXPORT  HardFault_Handler              [WEAK]

                B       .

                ENDP

SVC_Handler     PROC

                EXPORT  SVC_Handler                    [WEAK]

                B       .

                ENDP

PendSV_Handler  PROC

                EXPORT  PendSV_Handler                 [WEAK]

                B       .

                ENDP

SysTick_Handler PROC

                EXPORT  SysTick_Handler                [WEAK]

                B       .

                ENDP


Default_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_IRQHandler

PVD_IRQHandler

RTC_IRQHandler

FLASH_IRQHandler

RCC_IRQHandler

EXTI0_1_IRQHandler

EXTI2_3_IRQHandler

EXTI4_15_IRQHandler

TS_IRQHandler

DMA1_Channel1_IRQHandler

DMA1_Channel2_3_IRQHandler

DMA1_Channel4_5_IRQHandler

ADC1_COMP_IRQHandler 

TIM1_BRK_UP_TRG_COM_IRQHandler

TIM1_CC_IRQHandler

TIM2_IRQHandler

TIM3_IRQHandler

TIM6_DAC_IRQHandler

TIM14_IRQHandler

TIM15_IRQHandler

TIM16_IRQHandler

TIM17_IRQHandler

I2C1_IRQHandler

I2C2_IRQHandler

SPI1_IRQHandler

SPI2_IRQHandler

USART1_IRQHandler

USART2_IRQHandler

CEC_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中定义同名中断服务函数来实现从中断向量到中断服务函数的跳转


关键字:stm32  中断服务函数  机制 引用地址:stm32中断服务函数的机制

上一篇:STM32之外部中断原理
下一篇:stm32 定时器中断时间计算

推荐阅读最新更新时间:2024-03-16 16:18

关于STM32中断的部分理解
中断这个问题从学习stm32一开始就困扰着我,我想估计很多初学者都会有这样的问题。曾经问过隔壁实验室的职工,人家没告诉我,让我自己回去理解。同行是冤家,这句话很在理。 首先提出我对几个中断的理解不了的问题: 1、中断是干嘛的? 2、中断是如何从函数进入的? 3、中断相关设置是如何设置的? 第一个问题:关于中断可以有一个很形象的解释:你正在吃饭,突然尿急了,准备去尿尿,中断了吃饭的这一过程。从程序上解释就是吃饭可以分解为一系列的动作,称为主程序,每个动作相当于函数,组成了这个主程序。这时候你尿急了,产生了一个信号,相当于中断信号,告诉大脑CPU,现在尿急比较重要,不然会尿裤子。这时候大脑会停下吃饭这一主程序,去执行撒尿这程序
[单片机]
【话说定时器系列】之四:STM32定时器更新事件及案例分享
我们知道,STM32定时器中的四个带影子特性的寄存器组,每组寄存器分别由 影子寄存器【即实际控制寄存器】和预装寄存器组成。其中,影子寄存器是真正起作用的控制寄存器,用户访问不到它。而预装寄存器是用户访问的为实际影子寄存器准备数据或指令的寄存器。它们分别是: TIMx_PSC 分频寄存器 TIMx_ARR 自动重装载寄存器 TIMx_CCR 捕捉寄存器 TIMx_RCR 重复计数寄存器[高级定时器有】 其中,ARR、CCR寄存器带预装载使能控制位,即它们的预装功能可以软件开启或关闭。 TIMx_ARR 带预装载使能控制位 ARPE@TIMx_CR1 TIMx_CCR 带预装载使能控制位 OCxPE@TIMx_CC
[单片机]
STM32学习日志——I2C实验
今天学习的是I2C通信实验,I2C是一种两线式串行总线,有数据线SDA和时钟线SCL构成,可发送和接收数据,属于半双工通信。由于要有相同的时钟源,一般用于板内通信。 I2C有几个比较重要的状态:1)空闲状态,即两条线都拉高。2)起始信号:当SCL为高时SDA从高到低的跳变,停止信号:当SCL为高时,SDA从低到高的跳变。3)应答信号:每当发送器发送一个字节的数据时,在第九个脉冲,接收器会反馈一个应答信号ACK,低电平。如果接收器是主控器,则会发送一个非应答信号NACK,高电平,以通知发送方结束数据发送。4)数据有效性:数据必须在SCL的上升沿之前就准备好,并在SCL的下降沿结束前保持稳定。 iic头文件 SDA线需要发送数据
[单片机]
IAR首次给单片机STM32下载解锁flash
新板子焊接好后,在编译下载的时候第一次遇到了这样的问题: Warning: Stack pointer is setup to incorrect alignment. Stack addr = 0xAAAAAAAA 开始以为是调试器的问题,我用的Jlink的SWD接口模式,换了STLink还是这个毛病,后来提示需要板子初始化,试了无果,后来查看IAR的帮助文档发现是Flash被保护了,以下摘自Help文档: 按照说明,在IAR安装目录下找到指定的运行程序JLinkSTM32.exe(D:\Program Files (x86)\IAR Systems\Embedded Workbench 6.0\arm\bin)在JLink
[单片机]
IAR首次给单片机<font color='red'>STM32</font>下载解锁flash
STM32的启动文件
C语言运行时有条件的,比如没有栈,C语言时运行不了的,所以单片机一开始跑的不是C语言代码,而是汇编,献给C语言建立好运行的环境,比如栈 堆的分配。这也是为什么启动文件是汇编文件,也就是s文件 而且每个STM32工程都必须有的,每个工程最开始执行的都是启动文件,一段汇编,因为一开始是执行不了C代码的。 野火的书也有介绍 我觉得把这种东西弄懂弄透彻可能比你单纯做个STM32项目更有意义。这样学STM32让我感觉更深入一个层面,变得更为专业。真正去把一个东西啃透。这才是一个业内人士玩STM32的表现。确实是要回归底层,把这些啃透。你会组装个无人机,这是低水平的技术,你会写STM32启动文件,这才叫技术人士业
[单片机]
<font color='red'>STM32</font>的启动文件
什么是STM32以及如何学习?
STM32的核心Cortex-M3处理器是一个标准化的微控制器结构,希望思考一下,何为标准化?简言之,Cortex-M3处理器拥有32位CPU,并行总线结构,嵌套中断向量控制单元,调试系统以及标准的存储映射。 嵌套中断向量控制器(Nested Vector Interrupt Controller,简称NVIC)是Cortex-M3处理器中一个比较关键的组件,它为基于Cortex-M3的微控制器提供了标准的中断架构和优秀的中断响应能力,为超过240个中断源提供专门的中断入口,而且可以赋予每个中断源单独的优先级。利用NVIC从可以达到极快的中断响应速度,从收到中断请求到执行中断服务的第一条指令仅需12个周期。这种极快的响应速度一
[单片机]
STM32单片机FSMC的使用解析
在做项目的过程中遇到了这个问题,感觉文章写得不错,共享给对FSMC的使用怀有疑惑的同伴们! LCD有如下控制线: CS:Chip Select片选,低电平有效 RS:Register Select寄存器选择 WR:Write写信号,低电平有效 RD:Read读信号,低电平有效 RESET:重启信号,低电平有效 DB0-DB15:数据线 假如这些线,全部用普通IO口控制。根据LCD控制芯片手册(大部分控制芯片时序差不多): 如果情况如下: DB0-DB15的IO全部为1(表示数据0xff),也可以为其他任意值,这里以0xff为例。 CS为0(表示选上芯片,CS拉低时,芯片对传入的数据才会有效) RS为1(表示DB0-15上传
[单片机]
<font color='red'>STM32</font>单片机FSMC的使用解析
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved