3462|4

11

帖子

0

资源

一粒金砂(初级)

关于外部中断问题 [复制链接]

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

//  [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 编辑 ]
此帖出自NXP MCU论坛

回复

5347

帖子

19

资源

裸片初长成(初级)

你的问题没有描述清楚,而且你也没有贴代码,没有办法帮你解决。
个人签名我的博客

回复

7096

帖子

193

资源

五彩晶圆(高级)

flash掉电之后保存么?

回复

11

帖子

0

资源

一粒金砂(初级)

问题是只有外部中断时这样。内部中断可以

回复

3070

帖子

0

资源

裸片初长成(初级)

 不必看是什么CPU和开发环境,关键是中断的触发方式。像按键检测这类东东建议不要直接触发中断,因为用跃变沿不好,有抖动不好办,电平触发遇到停顿某一状态时也不好处理。最好利用定时器中断去检查按键状态,用状态机的方法最为可靠。

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

回复
您需要登录后才可以回帖 登录 | 注册

最新文章 更多>>
    关闭
    站长推荐上一条 1/6 下一条

    About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

    站点相关: 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

    北京市海淀区知春路23号集成电路设计园量子银座1305 电话:(010)82350740 邮编:100191

    电子工程世界版权所有 京ICP证060456号 京ICP备10001474号 电信业务审批[2006]字第258号函 京公海网安备110108001534 Copyright © 2005-2020 EEWORLD.com.cn, Inc. All rights reserved
    快速回复 返回顶部 返回列表