要使用 GPIO 中断(EINT0)从深度睡眠唤醒 LPC1768 并恢复程序执行,需遵循以下步骤:
确保 P2.10 正确配置为 EINT0 功能:
PINSEL_CFG_Type PinCfg;
PinCfg.Funcnum = 1; // P2.10 设置为 EINT0 功能
PinCfg.OpenDrain = 0;
PinCfg.Pinmode = PINSEL_PINMODE_PULLUP; // 上拉模式
PinCfg.Portnum = 2;
PinCfg.Pinnum = 10;
PINSEL_ConfigPin(&PinCfg);设置 EINT0 的触发边沿(如上升沿/下降沿)并清除中断标志:
LPC_SC->EXTMODE |= (1 << 0); // EINT0 设为边沿触发模式
LPC_SC->EXTPOLAR |= (1 << 0); // 上升沿触发(若需下降沿则清除该位)
LPC_SC->EXTINT = (1 << 0); // 清除 EINT0 中断标志设置中断优先级并使能 EINT0 中断:
NVIC_SetPriority(EINT0_IRQn, 0); // 设置优先级
NVIC_EnableIRQ(EINT0_IRQn); // 使能 EINT0 中断
NVIC_ClearPendingIRQ(EINT0_IRQn); // 清除挂起状态在 ISR 中清除中断标志并执行唤醒后的操作:
void EINT0_IRQHandler(void) {
LPC_SC->EXTINT = (1 << 0); // 清除 EINT0 中断标志
// 添加唤醒后的处理代码(如设置唤醒标志)
}确保系统控制寄存器(SCR)配置正确,并使用 __WFI() 进入深度睡眠:
SCB->SCR |= (1 << 2); // 设置 SLEEPDEEP 位(深度睡眠模式)
LPC_SC->PCONP |= (1 << 0); // 确保 GPIO 电源/时钟使能(关键!)
LPC_SC->EXTWAKE |= (1 << 0); // 允许 EINT0 唤醒系统
__WFI(); // 进入深度睡眠,等待中断唤醒PCONP 寄存器保持其供电。__WFI() 而非看门狗定时器(WDT),确保唤醒后从睡眠点继续执行。#include "lpc17xx.h"
#include "lpc17xx_pinsel.h"
#include "lpc17xx_nvic.h"
void configEINT0(void) {
// 引脚配置
PINSEL_CFG_Type PinCfg = {
.Portnum = 2,
.Pinnum = 10,
.Funcnum = 1, // EINT0
.Pinmode = PINSEL_PINMODE_PULLUP,
.OpenDrain = 0
};
PINSEL_ConfigPin(&PinCfg);
// 中断触发配置
LPC_SC->EXTMODE |= (1 << 0); // 边沿触发
LPC_SC->EXTPOLAR |= (1 << 0); // 上升沿
LPC_SC->EXTINT = (1 << 0); // 清除标志
// NVIC 配置
NVIC_SetPriority(EINT0_IRQn, 0);
NVIC_EnableIRQ(EINT0_IRQn);
}
void EINT0_IRQHandler(void) {
LPC_SC->EXTINT = (1 << 0); // 清除中断标志
// 唤醒后的处理代码
}
int main(void) {
configEINT0();
// 进入深度睡眠
SCB->SCR |= (1 << 2); // SLEEPDEEP
LPC_SC->PCONP |= (1 << 0); // 保持 GPIO 供电
LPC_SC->EXTWAKE |= (1 << 0); // EINT0 唤醒使能
__WFI(); // 等待中断唤醒
while(1) {
// 主循环(唤醒后继续执行)
}
}PCONP 正确配置保持 GPIO 模块供电。通过以上步骤,LPC1768 应能通过 GPIO 中断正确从深度睡眠唤醒并恢复程序执行。
举报
更多回帖