历史上的今天
返回首页

历史上的今天

今天是:2024年10月12日(星期六)

正在发生

2021年10月12日 | stm32中断服务函数的机制

2021-10-12 来源:eefocus

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


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

;    Stack Size (in Bytes) <0x0-0xFFFFFFFF:8>

;


Stack_Size      EQU     0x00000400


                AREA    STACK, NOINIT, READWRITE, ALIGN=3

Stack_Mem       SPACE   Stack_Size

__initial_sp



; Heap Configuration

;     Heap Size (in Bytes) <0x0-0xFFFFFFFF:8>

;


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

推荐阅读

史海拾趣

Adaptive Networks Inc公司的发展小趣事

对不起,我无法提供关于Adaptive Networks Inc公司发展的故事。

Hamamatsu公司的发展小趣事

Habia Cable公司电子行业发展的五个故事

故事一:聚四氟乙烯的先驱

Habia Cable的故事始于1941年,由Carl Herbert Jacobsson在瑞典斯德哥尔摩创立。起初,公司是一家聚合物制造商,专注于胶木部件的生产。然而,Jacobsson的远见卓识使Habia成为欧洲首批使用聚四氟乙烯(PTFE)的公司之一,并在1946年在美国推出了第一款商业聚四氟乙烯产品。这一创新不仅为Habia奠定了技术基础,也使其迅速在电线电缆领域崭露头角。随着时间的推移,Habia成为最早制造聚四氟乙烯电线和电缆的公司之一,这一技术突破为公司后续的发展奠定了坚实的基础。

故事二:国际扩张的征程

自1957年Habia制造其第一条电缆以来,公司便踏上了国际扩张的征途。1969年,Habia在荷兰布雷达开设了其第一家国际销售办公室,这标志着公司正式进入全球市场。随后,Habia在70年代至80年代经历了迅速的国际扩张,工厂和销售办事处相继在法国、德国、英国、西班牙、比利时和美国等地成立或收购。这一时期的快速扩展不仅增强了Habia在全球范围内的市场竞争力,也为其后续的发展积累了宝贵的经验和资源。

故事三:技术创新的引领

Habia Cable一直以来都是技术创新的引领者。在2000年,公司收购了德国Norderstedt的高温电线和电缆制造商Isotec Kabel GmbH,这一举措使德国成为Habia最大的市场,并为其在欧洲的进一步发展提供了强有力的支持。此外,Habia Cable还不断投资于新技术和新设备的研发,以满足市场对高性能电缆和线束的需求。例如,在2016年,Habia Cable投资独特设备制造含氟聚合物电线和电缆的长截面和大截面产品,以满足离岸部门等苛刻应用的需求。

故事四:亚洲市场的布局

随着全球化进程的加速,Habia Cable也开始将目光投向亚洲市场。2000年,Habia Cable在中国常州设立工厂,生产同轴电缆,这标志着公司正式进入亚洲市场。此后,Habia在亚洲的扩张步伐不断加快,不仅在中国建立了多个生产基地,还在韩国、香港和日本等地设立了销售办事处。这些举措不仅提升了Habia在亚洲市场的知名度,也为其在全球范围内的业务增长提供了新的动力。

故事五:定制解决方案的提供

Habia Cable一直致力于为客户提供定制化的解决方案。公司拥有一支知识渊博的销售团队和设计工程师团队,他们能够与客户紧密合作,根据客户的独特需求开发满足其要求的电缆和线束产品。Habia Cable的制造灵活性、低订单数量要求和短交货周期等特点使其在市场上具有很强的竞争力。无论是电信、核电、国防还是海洋和工业领域,Habia Cable都能为客户提供高质量、高性能的电缆和线束产品,满足其苛刻的应用需求。

Aerovox Corporation公司的发展小趣事

Aerovox Corporation成立于1922年,是一家专业生产电容器和电子元件的公司。以下是关于Aerovox Corporation发展的五个相关故事:

  1. 成立与初期发展: Aerovox Corporation于1922年在美国马萨诸塞州波士顿成立,最初名为"Northeast Electric Company",后来改名为"Aerovox Corporation"。公司的创始人是W·H·J·Gilbert先生,他致力于开发高性能的电容器。起初,Aerovox主要生产电感线圈和电容器,为无线电和电视等新兴行业提供支持。

  2. 二战期间的发展: 在二战期间,Aerovox Corporation转向军事市场,为美国军方生产电容器和其他电子元件,支持军事通信和雷达系统的发展。这一时期,公司迅速扩张并积累了丰富的技术经验。

  3. 技术创新与扩张: 随着电子技术的不断发展,Aerovox Corporation不断进行技术创新,推出了一系列具有创新性的产品,包括高压电容器、电感器和电源解决方案。公司不仅在军事领域取得了成功,还在民用市场上获得了广泛的应用。

  4. 全球化和市场拓展: Aerovox Corporation通过建立全球销售网络和合作伙伴关系,拓展了国际市场。公司在美国以外的地区设立了生产基地和销售办事处,提供定制化的解决方案,满足客户不断增长的需求。

  5. 持续创新与领先地位: 如今,Aerovox Corporation仍然致力于持续创新,不断开发新的产品和解决方案,以满足不断变化的市场需求。公司在电力电子、医疗设备、工业自动化、交通运输等领域拥有广泛的应用,保持着行业领先地位。

这些故事展示了Aerovox Corporation作为一家具有悠久历史和丰富经验的电子公司,在不同时期和领域的持续发展和创新。

安国国际(ALCOR)公司的发展小趣事

进入21世纪,安国继续深耕集线器控制芯片领域。2000年,公司发布了首款USB键盘集线器控制芯片——AU9432,这款芯片凭借其卓越的性能和稳定性,成功被Apple的iMAC键盘所采用。这一里程碑事件不仅证明了安国在集线器控制芯片领域的领先地位,也为其后续的产品研发和市场拓展奠定了坚实基础。

Diotec Electronics Corp公司的发展小趣事

在竞争激烈的电子行业中,Diotec始终保持对技术创新的追求。公司不断增加研发投入,引进先进的研发设备和人才,积极开发具有自主知识产权的新产品。这些新产品不仅丰富了公司的产品线,还进一步巩固了公司在市场中的领先地位。同时,Diotec还注重知识产权保护,通过申请专利等方式保护自己的创新成果。

Axon' Cable公司的发展小趣事

Axon' Cable公司自1965年在法国成立起,便致力于通讯连接器的研发与生产。在创业初期,公司面临着资金短缺、技术瓶颈和市场竞争的诸多挑战。然而,Axon' Cable凭借其坚定的信念和不懈的努力,逐步突破了技术难关,并成功开发出了一系列具有竞争力的产品。这些产品在市场上得到了广泛认可,为公司的后续发展奠定了坚实的基础。

问答坊 | AI 解惑

WSAWaitForMultipleEvents 87

在WinXP下,调用正常,但是在Wince下执行WSAWaitForMultipleEvents返回错误 87参数不正确。 请教一下,错误在什么地方? 已下代码在线程中执行,pClientSocket->m_hClientEvent是与连接Socket对应的事件, WSAWaitForMultipleEvents等待1000.. ...…

查看全部问答>

R3中微软的Silverlight的例子XAMLPERF中的FRM_START,FRM_STOP,FRM_GET_FRAMES_PER_SECOND什么意思?

这三个东西在main.cpp中定义的: class FrameRateManager {     enum FrameRateMonitorMessage        {         FRM_START = 0,         FRM_S ...…

查看全部问答>

请教STM32的SDIO用4线模式读写的问题

STM32的SDIO读写SD卡,使用4bit模式时,连续读写多块总是提示SD_START_BIT_ERR,从论坛上看到有大虾可以实现4bit多块读写,能不能帮忙指点一二,非常感谢啊。。。 1bit模式连续读写多块是正确的,是2G的SD卡。 我用的是万利的开发板,程序是V ...…

查看全部问答>

继电器隔离问题

小弟的板子上用430通过5V电磁继电器控制220v,0.3A的电扇,每次继电器断开的时候干扰很大,单片机死机。在论坛上询问了高人的意见,把给继电器供电的电源和单片机   的电源完全分开,加光耦隔离,问题解决。   我板子上供电是引进220 ...…

查看全部问答>

keil4编译多个源文件怎么设置

为自己写了2个。c文件但是没法链接哦 源文件没问题编译K的 Target not created gpio.axf: Error: L6218E: Undefined symbol SystemInit (referred from startup_stm32f10x_cl.o).gpio.axf: Error: L6218E: Undefined symbol RCC_APB2PeriphResetC ...…

查看全部问答>

IAR无法调试问题

为什么我在win7系统下无法调试程序,每次点击“Debug”后就会出现对话框“Fatal error: Failed to initialize. Check if hardware is connected. Check if drivers are installed. Try to restart the computer. Tools using the parallel port are ...…

查看全部问答>

求解各位大神

各位大神,我的protel老打不开PCB图,显示这个图片上的,谁知道啊?????…

查看全部问答>

关于ATMEGA88V驱动SD卡在1.8寸彩屏H018IN01 V8上显示图片思路

本帖最后由 gh131413 于 2014-2-28 10:04 编辑 这款板子已经到手了,由于源程序是GCC的,而本人用的ICCAVR,根据教程所提供的HEX文件编译后图片切换显示正常,但看源程序有太多不明白的地方: TFT彩屏的技术规格书是全英文的且不详细,如何知道现 ...…

查看全部问答>

大家一起学算法精品书籍推荐(十一)嵌入式系统软件设计中的常用算法

为什么要推荐这些资料?                    软件行业里一直有一种说法:程序=算法+数据结构。可见如果想要掌握程序设计的精髓,算法是必不可少的。        ...…

查看全部问答>