关于外部中断问题

2019-03-25 20:39发布

为什么我设置了外部按键中断,在FLASH中调试,在调试时按下会跳转到中断服务程序(闪烁灯翻转),而关掉板子,再打开板子就不运行中断了,而式一直卡在灯亮的地方,这是为什么呢?调试了好几天了,着急啊。
求各位指教。。下面贴代码,开发环境是IAR5.5
#include <intrinsics.h>
#include <stdio.h>
#include <NXP/iolpc2103.h>

//  [Hz]
#define FOSC            11059200UL
// Core clk [Hz]
#define FCCLK           FOSC
// Per clk [Hz]
#define PCCLK           (FOSC/4)
// Timer tick per second
#define TICK_PER_SEC    (8UL)
#define TIM_PER_S(Val)  (PCCLK/Val)

#define MAX_TICK_PER    TIM_PER_S(20)
#define MIN_TICK_PER    TIM_PER_S(5)

// Timer Delta period [ms]
#define DELTA_PER       (50UL)
#define TIM_DPER        ((PCCLK*DELTA_PER)/1000UL)

#define LED1CON        1<<19
#define LED2CON        1<<18
/*************************************************************************
* 函数名称: irq_handler
* 入口参数: 无
*
* 返回参数: 无
*
* 说    明: IRQ 入口函数
*
*************************************************************************/
#pragma vector=IRQV
__irq __arm void irq_handler (void)
{
void (*interrupt_function)();
unsigned int vector;

  vector = VICVectAddr;     // Get interrupt vector.
  interrupt_function = (void(*)())vector;
  if(interrupt_function != NULL)
  {
    interrupt_function();  // Call vectored interrupt function.
  }
  else
  {
    VICVectAddr = 0;      // Clear interrupt in VIC.
  }
}

/*************************************************************************
* 函数名称: KeySpeedIntHandler
* 入口参数: 没有
*
* 返回参数: 没有
*
* 说    明: 按键中断响应函数
*
*************************************************************************/
void KeySpeedIntHandler (void)
{
  // clear interrupt flag
  while( (EXTINT&0x01)!=0 )                        // 等待外部中断信号恢复为高电平       
   {  EXTINT = 0x01;                                // 清除EINT0中断标志
   }
  
    if ((IOSET & LED1CON) == 0)
      IOSET = LED1CON;                          //关闭LED
    else
      IOCLR = LED1CON;                          //打开
  VICVectAddr = 0;
}

/*************************************************************************
* 函数名称: KeysInit
* 入口参数: 无
*
* 返回参数: 无
*
* 说    明: 初始化中断
*
*************************************************************************/
void KeysInit (void)
{
  // Set to EXT Interrupt
  PINSEL1_bit.P0_16 = 1;
  // Set ext. interrupt edge to sensitive mode
  EXTMODE = 0x5;
  // Falling Edge
  EXTPOLAR = 0;
  // Set interrupts
  // Assign to IRQ
  VICIntSelect_bit.EINT0 =0;
  // Set slots
  VICVectAddr0 = (unsigned int) KeySpeedIntHandler;
  VICVectCntl0_bit.NUMBER = VIC_EINT0;
  VICVectCntl0_bit.ENABLED = 1;
  
  // Clear pending interrupts
  EXTINT = 0x5;
  // Enable interrupts
  VICIntEnable_bit.EINT0 =1;
}

/****************初始化PLL**********************/
void PLL_Init(void)
{
  // Disable PLL
  PLLCON = 0;
  // Write Feed
  PLLFEED = 0xAA;
  PLLFEED = 0x55;
  // Set periphery divider /4
  APBDIV_bit.APBDIV  = 0;
  // Set MAM fully enable
  MAMCR_bit.MODECTRL = 0;
  MAMTIM_bit.CYCLES  = 3;
  MAMCR_bit.MODECTRL = 2;
  // Memory map init flash memory is maped on 0 address
#ifdef FLASH
  MEMMAP_bit.MAP = 1;
#else
  MEMMAP_bit.MAP = 2;
#endif
}
/*******************************初始化GPIO***********************************/
void Init_Gpio(void)
{
  // Init GPIO
  PINSEL0 = PINSEL1 = 0;
  // Disable fast IO
  SCS_bit.GPIO0M = 0;
  // Set pins connect to LEDs as outputs
  IODIR = LED1CON;
  // All LEDs off
  IOCLR = LED1CON;
}
/*************************************主函数********************************/
void main(void)
{

  //MEMMAP_bit.MAP = 2;

  PLL_Init();
  Init_Gpio();
  __disable_interrupt();
  KeysInit();
  __enable_interrupt();

  while(1)
  {

   
  }
}
__fiq __arm void fiq_handler(void)
{
  while(1){}
}

__arm void undef_handler(void)
{
  while(1);
}

__arm void prefetch_handler(void)
{
  while(1);
}

__arm void data_handler(void)
{
  while(1);
}

[ 本帖最后由 wwwwwsltt 于 2011-4-13 13:03 编辑 ] 此帖出自小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
4条回答
zhaojun_xf
1楼-- · 2019-03-26 03:11
_NXP LPC1000_ 你的问题没有描述清楚,而且你也没有贴代码,没有办法帮你解决。
常见泽1
2楼-- · 2019-03-26 08:39
flash掉电之后保存么?
wwwwwsltt
3楼-- · 2019-03-26 13:22
 精彩回答 2  元偷偷看……
仙猫
4楼-- · 2019-03-26 18:03
 不必看是什么CPU和开发环境,关键是中断的触发方式。像按键检测这类东东建议不要直接触发中断,因为用跃变沿不好,有抖动不好办,电平触发遇到停顿某一状态时也不好处理。最好利用定时器中断去检查按键状态,用状态机的方法最为可靠。

 BTW,楼主程序中的“等待外部中断信号恢复为高电平”处理方式,即使不是问题隐患,也会成为消耗CPU资源的根源。

一周热门 更多>