NXP LPC的例程:
#include "config.h"
#define BEEP 1 << 7 // P0.7控制BEEP
const uint32 LED1 = (0x55 << 16);
/*
*********************************************************************************************************
** 函数名称 :IRQ_Eint0()
** 函数功能 :外部中断0 EINT0服务程序
** 入口参数 :无。
** 出口参数 :无。
*********************************************************************************************************
*/
void __irq IRQ_Eint0 (void)
{
/* 等待外部中断信号恢复为高电平
若信号保持为低电平,中断标志会一直置位。*/
while ((EXTINT & 0x01) != 0)
{
EXTINT = 0x01; // 清除EINT0中断标志
}
VICVectAddr = 0; // 向量中断结束
}
/*
*********************************************************************************************************
** 函数名称 :main()
** 函数功能 :演示外部中断唤醒掉电的CPU
** 入口参数 :无。
** 出口参数 :无。
*********************************************************************************************************
*/
int main (void)
{
PINSEL0 = 0x00000000; // 管脚连接GPIO
PINSEL1 = 0x00000001; // P0.16连接EINT0
IO0DIR = BEEP; // 设置BEEP控制口为输出,其余输入
PINSEL2 = PINSEL2 & (~0x08);// P1[25:16]连接GPIO
IO1DIR = LED1; // 设置LED1控制口为输出
IRQEnable(); // 使能IRQ中断
/* 外部中断0初始化 */
VICIntSelect = 0x00000000; // 设置所有中断分配为IRQ中断
VICVectCntl0 = 0x20 | 14; // 分配外部中断0到向量中断0
VICVectAddr0 = (uint32)IRQ_Eint0; // 设置中断服务程序地址
VICIntEnable = 1 << 14; // 使能EINT0中断
EXTWAKE = 0x01; // 外部中断0唤醒芯片
EXTINT = 0x01; // 清除EINT0中断标志
IO0SET = BEEP;
IO1SET = LED1;
while (1)
{
PCONP = 0x00; // 关闭定时器、RTC、UART等功能部件
PCON = 0x02; // 系统进入掉电模式
/* 当系统被唤醒后,取反BEEP控制 */
if ((IO0SET & BEEP) == 0) IO0SET = BEEP;
else IO0CLR = BEEP;
if ((IO1SET & LED1) == 0) IO1SET = LED1;
else IO1CLR = LED1;
}
return (0);
}
/*********************************************************************************************************
** End Of File
********************************************************************************************************/
供你参考。