历史上的今天
返回首页

历史上的今天

今天是:2024年12月19日(星期四)

正在发生

2018年12月19日 | ARM 中断函数定义

2018-12-19 来源:eefocus

ARM的中断函数是在startup code中定义的,在CODE区分配中断向量表时,及将中断函数定义出了


; Vector Table Mapped to Address 0 at Reset

 

                AREA    RESET, DATA, READONLY

                EXPORT  __Vectors

 

__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     GPIO0_IRQHandler          ; GPIO P0 Interrupt

                DCD     GPIO1_IRQHandler          ; GPIO P1 Interrupt

                DCD     GPIO2_IRQHandler          ; GPIO P2 Interrupt

                DCD     GPIO3_IRQHandler          ; GPIO P3 Interrupt

                DCD     GPIO4_IRQHandler          ; GPIO P4 Interrupt

                DCD     CP_IRQHandler             ; Capture/PWM

                DCD     ADC_IRQHandler            ; A/D Converter

                DCD     Reserved_IRQHandler       ; Reserved

                DCD     Reserved_IRQHandler       ; Reserved

                DCD     Reserved_IRQHandler       ; Reserved

                DCD     Reserved_IRQHandler       ; Reserved

                DCD     Reserved_IRQHandler       ; Reserved

                DCD     Reserved_IRQHandler       ; Reserved

                DCD     Reserved_IRQHandler       ; Reserved

                DCD     Reserved_IRQHandler       ; Reserved

                DCD     UART0_IRQHandler          ; UART0

                DCD     UART1_IRQHandler          ; UART1

                DCD     UART2_IRQHandler          ; UART2

                DCD     UART3_IRQHandler          ; UART3

                DCD     TIMER0_IRQHandler         ; Timer0

                DCD     TIMER1_IRQHandler         ; Timer1

                DCD     TIMER2_IRQHandler         ; Timer2

                DCD     TIMER3_IRQHandler         ; Timer3

                DCD     WDT_IRQHandler            ; Watchdog timer

                DCD     I2C0_IRQHandler           ; I2C0

                DCD     I2C1_IRQHandler           ; I2C1

                DCD     SSP0_IRQHandler           ; SSP0

                DCD     SSP1_IRQHandler           ; SSP1

                DCD     TIMER01_IRQHandler        ; Timer0 & Timer1

                DCD     TIMER23_IRQHandler        ; Timer2 & Timer3

                DCD     Reserved_IRQHandler       ; Reserved

                DCD     Reserved_IRQHandler       ; Reserved

  

                AREA    |.text|, CODE, READONLY


不同芯片有各自的startup code,所以定义不同。


在startup code中定义的中断函数都是[weak]属性,如果编译器在别的文件中发现相同的函数名,则在链接时用别处的地址进行链接。


所以只要在工程的具体位置,按startup code中定义的名称直接完整该函数即可,不用在特别声明和与中断向量号联系起来。


Default_Handler PROC

                EXPORT  GPIO0_IRQHandler          [WEAK]

                EXPORT  GPIO1_IRQHandler          [WEAK]

                EXPORT  GPIO2_IRQHandler          [WEAK]

                EXPORT  GPIO3_IRQHandler          [WEAK]

                EXPORT  GPIO4_IRQHandler          [WEAK]

                EXPORT  CP_IRQHandler             [WEAK]

                EXPORT  ADC_IRQHandler            [WEAK]

                EXPORT  SSP0RXINT_IRQHandler      [WEAK]

                EXPORT  SSP0TXINT_IRQHandler      [WEAK]

                EXPORT  SSP0RORINT_IRQHandler     [WEAK]

                EXPORT  SSP0RTINT_IRQHandler      [WEAK]

                EXPORT  SSP1RXINT_IRQHandler      [WEAK]

                EXPORT  SSP1TXINT_IRQHandler      [WEAK]

                EXPORT  SSP1RORINT_IRQHandler     [WEAK]

                EXPORT  SSP1RTINT_IRQHandler      [WEAK]

                EXPORT  UART0_IRQHandler          [WEAK]

                EXPORT  UART1_IRQHandler          [WEAK]

                EXPORT  UART2_IRQHandler          [WEAK]

                EXPORT  UART3_IRQHandler          [WEAK]

                EXPORT  TIMER0_IRQHandler         [WEAK]

                EXPORT  TIMER1_IRQHandler         [WEAK]

                EXPORT  TIMER2_IRQHandler         [WEAK]

                EXPORT  TIMER3_IRQHandler         [WEAK]

                EXPORT  WDT_IRQHandler            [WEAK]

                EXPORT  I2C0_IRQHandler           [WEAK]

                EXPORT  I2C1_IRQHandler           [WEAK]

                EXPORT  SSP0_IRQHandler           [WEAK]

                EXPORT  SSP1_IRQHandler           [WEAK]

                EXPORT  TIMER01_IRQHandler        [WEAK]

                EXPORT  TIMER23_IRQHandler        [WEAK]


在具体的.c文件中


/*---------------------------------------------------------------------------------------------------------*/

/* Interrupt Handler                                                                                       */

/*---------------------------------------------------------------------------------------------------------*/

void I2C0_IRQHandler(void)

{

  uint32_t status;

 

  status = I2C0->STAT;

 

  switch (status)

  {

  /* Arbitration loss */

  case 0x38:

    if (I2CHandler[0].ArbitLossCallBackFn)

      I2CHandler[0].ArbitLossCallBackFn(status);

    break;

 

  /* Bus error */

  case 0x00:

    if (I2CHandler[0].BusErrCallBackFn)

      I2CHandler[0].BusErrCallBackFn(status);

    break;

 

  default:

    if (I2CHandler[0].I2CCallBackFn)

      I2CHandler[0].I2CCallBackFn(status);

    break;

  }

}


推荐阅读

史海拾趣

Gould Ami公司的发展小趣事
通过水位传感器(如浮球开关、压力传感器等)实时监测水位变化。
旌芯半导体(GN)公司的发展小趣事
当水位达到预设的上下限时,传感器会发出信号给控制电路。
Epistar Corp公司的发展小趣事

面对不断变化的市场需求和行业竞争格局Epistar始终保持创新精神不断探索新的技术方向和应用领域。公司加强与高校和研究机构的合作共同研发新技术、新产品;同时,Epistar还积极参与制定行业标准推动LED行业的健康发展。这些创新举措使Epistar在行业中始终保持领先地位引领着未来LED技术的发展方向。

Crystek公司的发展小趣事

尽管Crystek公司在发展过程中取得了显著的成就,但也面临着一些挑战和困难。例如,随着行业竞争的加剧和市场需求的不断变化,公司需要不断调整战略方向和产品结构以适应市场的变化。同时,公司还需要加强人才培养和团队建设,提升员工的技能水平和创新能力。然而,Crystek公司始终保持着积极进取的态度和勇于面对挑战的精神,相信在未来的发展中,公司将继续保持领先地位并创造更加辉煌的业绩。

这五个故事展示了Crystek公司在电子行业中的发展历程和取得的成就。从创业起步到技术创新、市场拓展、部门专业化以及应对挑战和未来发展,Crystek公司始终保持着积极进取的精神和不断创新的态度,为电子行业的发展做出了重要贡献。

Display Elektronik GmbH公司的发展小趣事

面对数字化浪潮的冲击,Display Elektronik GmbH积极拥抱数字化转型。公司利用大数据、云计算等先进技术,实现了生产、销售、服务等各个环节的数字化管理。这种数字化转型不仅提高了公司的运营效率和管理水平,还为客户提供了更加便捷、高效的服务体验。在数字化转型的推动下,Display Elektronik GmbH的竞争力得到了显著提升。

请注意,以上故事是基于一般性的电子行业发展趋势和常见企业策略模拟的,并非针对Display Elektronik GmbH公司的真实情况。

E-T-A [E-T-A Circuit Breakers]公司的发展小趣事

进入21世纪后,E-T-A公司开始关注智能电路保护技术的研发。公司投入大量资源进行技术创新,成功推出了多款智能电路保护产品。这些产品不仅具有更高的安全性和可靠性,还能实现远程监控和控制功能,为客户提供更加便捷和高效的服务。

问答坊 | AI 解惑

请教一下,充电电路中开关管发热的问题

最近做了个充电器,BUCK电路中的开关管发热严重,输入是12V的电源。 第一种情况:当充电电压输出为4.2V,电流为500MA的时候开关管发热严重,恒压充电的时候电压恒定4.2v电流慢慢减小这时候开管发热现象减轻。 第二种情况:当充电电压输出为8.4 ...…

查看全部问答>

LM317电源制作

[ 本帖最后由 yuandayuan6999 于 2010-5-14 22:09 编辑 ]…

查看全部问答>

msp430 SPI通信

有没有人做过msp430单片机的SPI通信   望大侠帮帮…

查看全部问答>

在Wince上进行快速应用开发(RAD)!!!!

Lazarus是一个类似Delphi的IDE,其语言是Free Pascal,开发方式就是RAD,自从2.2.0 FPC(Free Pascal Compile)开始,就支持WINCE -ARM平台。使用Lazarus开发,界面可以比C#丰富,且更为简单,但是速度会快很多,因为Lazarus生成的是二进制EXE,而 ...…

查看全部问答>

新手提问,请教单片机硬件该怎么设计呢

大家好,我刚刚学单片机一个月了,用买来的学习机做好了许多试验,现在我想自己买元件,从硬件开始设计,我知道该买些元件啊,板子啊,来焊接,但我不懂具体怎么操作,请问有没有讲这方面的书呢,电子方面的啊,谢谢大家推荐…

查看全部问答>

最牛的无线数传资料

无线数传模组: a.通用数传模组    WAP200B、EM200D、GW200B,最大100mW,64个频道,传输距离800米左右,内置前向纠错,最高速度19200(接口可达115200); b.高灵敏度数传模组   WAP200C、GW200KB,最大20mW,64个频道,传 ...…

查看全部问答>

MSP430中 timer_B和ADC12中断的矛盾

我现在遇到的问题是 ADC12IE = 0x01; 会影响timer_B定时的精度 但是 我查过手册,上面说timer_B高于ADC12中断优先级(先是用的timer_A,发现现象不对) 只要屏蔽ADC12IE = 0x01; 定时就精确了! 求解,求赐教!…

查看全部问答>

GPIO初始化配置成GPIO_Mode_Out_PP后怎么是低电平呢?

我用PB14以吸收电流的方式驱动一个LED灯,下面是初始化代码:GPIO_InitStructure.GPIO_Pin = GPIO_Pin_14;        //1GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;  ...…

查看全部问答>

STM32现在有没有带总线和USBHOST或者OTG的片子?

                                  …

查看全部问答>

请问哪儿有Jlink-ob_stm32的原理图?

                                 看了网上的,觉得不错,想做个玩玩,只不过网上的图不清楚,不知哪儿有清楚的,说是IAR提供的开发板图上面的一部分 ...…

查看全部问答>