为什么我设置了外部按键中断,在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 编辑 ]
此帖出自
小平头技术问答
BTW,楼主程序中的“等待外部中断信号恢复为高电平”处理方式,即使不是问题隐患,也会成为消耗CPU资源的根源。
一周热门 更多>