打印
[MCU]

中断函数是如何被识别的

[复制链接]
1897|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
pkuzhx|  楼主 | 2015-7-9 10:03 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
例如,在如下一段代码中:
/* 1 second interval when assuming 1 MHz clock frequency and 1024x prescaling */
#define TOP (1000000/1024)

/**************************************************************************//**
* [url=home.php?mod=space&uid=247401]@brief[/url] Initialize TIMER0 in Up/Down Count mode and to give interrupts when
* turning from counting up to down (overflow) and from down to up (underflow)
*****************************************************************************/
void initTimer()
{  
  TIMER_Init_TypeDef initValues = TIMER_INIT_DEFAULT;
  
  /* Enable clock for TIMER0 */
  CMU_ClockEnable(cmuClock_TIMER0, true);
  
  /* Enable underflow and overflow interrupt for TIMER0*/
  TIMER_IntEnable(TIMER0, TIMER_IF_OF);
  TIMER_IntEnable(TIMER0, TIMER_IF_UF);
  
  /* Enable TIMER0 interrupt vector in NVIC */
  NVIC_EnableIRQ(TIMER0_IRQn);
  
  /* Set TIMER0 Top value */
  TIMER_TopSet(TIMER0, TOP);
  
  /* Initialize TIMER0 in Up/Down mode with 1024x prescaling */
  initValues.prescale = timerPrescale1024;
  initValues.mode     = timerModeUpDown;
  TIMER_Init(TIMER0, &initValues);
  
  /* Start TIMER0 */
  TIMER0->CMD = TIMER_CMD_START;
}


/**************************************************************************//**
* @brief TIMER0 Interrupt Handler. Writes status to LCD display
*****************************************************************************/
void TIMER0_IRQHandler(void)
{

  /* Store the interrupt flags before clearing */
  uint16_t intFlags = TIMER_IntGet(TIMER0);
  
  /* Clear the interrupt flags. Only clear the flags that were stored in */
  /* intFlags in case other flags have been set since then */
  TIMER_IntClear(TIMER0, intFlags);

  /* Overflow interrupt occured */
  if(intFlags & TIMER_IF_OF)
  {
    SegmentLCD_Write("OVER");
  }
  
  /* Underflow interrupt occured */
  if(intFlags & TIMER_IF_UF)
  {
    SegmentLCD_Write("UNDER");
  }
}


/**************************************************************************//**
* @brief Main function
*****************************************************************************/
int main(void)
{  
  /* Chip revision alignment and errata fixes */
  CHIP_Init();
  
  /* Set system frequency to 1 MHz */
  CMU_HFRCOBandSet(cmuHFRCOBand_1MHz);
  
  /* Initialize LCD */
  SegmentLCD_Init(false);

  /* Initialize TIMER0 */
  initTimer();
  
  /* Go to EM1 when not servicing interrupts */
  while(1)
  {
    EMU_EnterEM1();
  }
}


当产生中断时,系统如何知道要去调用TIMER0_IRQHandler函数,而不是其他函数?
又是一个新手问题,烦请各位高手指点。

相关帖子

沙发
dirtwillfly| | 2015-7-9 11:19 | 只看该作者
有中断向量表。发生中断,就会转到相应的中断向量表,向量表里有中断服务程序的入口地址。

使用特权

评论回复
板凳
南宫云明| | 2015-7-9 11:20 | 只看该作者
TIMER0_IRQHandler这个函数应该在启动文件里声明了吧,绑定了一个中断向量号的。。。。

使用特权

评论回复
地板
pkuzhx|  楼主 | 2015-7-9 11:45 | 只看该作者
南宫云明 发表于 2015-7-9 11:20
TIMER0_IRQHandler这个函数应该在启动文件里声明了吧,绑定了一个中断向量号的。。。。 ...

我看到有gpio中断的函数,在中断产生的函数里就指明了发生中断时调用哪个函数。
timer中断没有说明,我就有点费解了。你这么说我有点明白了,就是在某个文件里声明了当timer0中断时,就调用TIMER0_IRQHandler这个函数。

使用特权

评论回复
5
pkuzhx|  楼主 | 2015-7-9 11:46 | 只看该作者
dirtwillfly 发表于 2015-7-9 11:19
有中断向量表。发生中断,就会转到相应的中断向量表,向量表里有中断服务程序的入口地址。 ...

第一次用中断,对中断的理解太浅了。

使用特权

评论回复
6
ningling_21| | 2015-7-9 11:57 | 只看该作者
pkuzhx 发表于 2015-7-9 11:46
第一次用中断,对中断的理解太浅了。

用多了就熟悉了

使用特权

评论回复
7
ff8zgs| | 2015-7-11 15:41 | 只看该作者
单片机每一个中断都有一个中断向量,51实际就是一个固定的地址,当硬件发生中断后,MCU自动跳转到这个固定地址。而这个地址只是一个长跳转指令,跳转到中断服务函数。MCU执行完中断服务函数再回到中断前的地方。(当然所有的跳转都有现场的保护)

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

45

主题

730

帖子

6

粉丝