NXP MCU 技术论坛
直播中

刘伟

8年用户 1720经验值
私信 关注
[问答]

如何使用GPIO IRQ从Deep sleep唤醒LPC1768?

我正在尝试使用 GPIO IRQ 从 Deep sleep 唤醒 LPC1768。现在它可以工作,但仅使用 WDT 并重置 MCU。还需要帮助,我应该怎么做才能在检测到 IRQ 而不是重置时恢复程序。
当我尝试使用 GPIO intrerupt 时,它甚至不会重置它。

PINSEL_CFG_Type PinCfg;
PinCfg.Funcnum = 1;
PinCfg.OpenDrain = 0;
PinCfg.Pinmode = PINSEL_PINMODE_PULLUP;
PinCfg.Portnum = 2;

PinCfg.Pinnum = 10;
PINSEL_ConfigPin( PinCfg);

NVIC_SetPriority(EINT0_IRQn, 0);
nvic_clearpendingirq(eint0_irqn);

LPC_PINCON->PINSEL4 |= (0x01 << 20); // function: EINT0
LPC_SC->EXTMODE |= ~(1 << 0); // Edge sensitive
//LPC_SC->EXTPOLAR  = ~(1 << 0); // falling-edge sensitive
LPC_SC->EXTPOLAR  = 1 << 0; // falling-edge sensitive
LPC_SC->EXTINT = (1 << 0); // clear flag

nvic_enableirq(eint0_irqn);
---------- 在进入深度睡眠之前禁用并断开主 PLL0
// or Power-Down mode  ------------
LPC_SC->PLL1CON = 2; // Turn off the main PLL (PLL0)
LPC_SC->PLL1FEED = 0xAA; // Feed
LPC_SC->PLL1FEED = 0x55; // Feed
while ((LPC_SC->PLL1STAT   (1<<9)) == 0); // Check connect bit status
LPC_SC->PLL0CON  = ~(1<<1); // Disconnect the main PLL (PLL0)
LPC_SC->PLL0FEED = 0xAA; // Feed
LPC_SC->PLL0FEED = 0x55; // Feed

while ((LPC_SC->PLL0STAT   (1<<25)) != 0x00); // Wait for main PLL (PLL0) to disconnect
LPC_SC->PLL0CON  = ~(1<<0); // Turn off the main PLL (PLL0)
LPC_SC->PLL0FEED = 0xAA; // Feed
LPC_SC->PLL0FEED = 0x55; // Feed
while ((LPC_SC->PLL0STAT   (1<<24)) != 0x00); // Wait for main PLL (PLL0) to shut down
------------然后进入 PowerDown 模式----------------------------------

clkpwr_deepsleep();


void EINT0_IRQHandler (无效)
{
nvic_systemreset();

回帖(1)

郭大

2025-3-26 17:59:49

要使用 GPIO 中断(EINT0)从深度睡眠唤醒 LPC1768 并恢复程序执行,需遵循以下步骤:




1. 配置 GPIO 引脚为外部中断


确保 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);



2. 配置外部中断触发条件


设置 EINT0 的触发边沿(如上升沿/下降沿)并清除中断标志:


LPC_SC->EXTMODE  |= (1 << 0);     // EINT0 设为边沿触发模式
LPC_SC->EXTPOLAR |= (1 << 0);     // 上升沿触发(若需下降沿则清除该位)
LPC_SC->EXTINT    = (1 << 0);     // 清除 EINT0 中断标志



3. 配置 NVIC 中断优先级和使能


设置中断优先级并使能 EINT0 中断:


NVIC_SetPriority(EINT0_IRQn, 0);  // 设置优先级
NVIC_EnableIRQ(EINT0_IRQn);       // 使能 EINT0 中断
NVIC_ClearPendingIRQ(EINT0_IRQn); // 清除挂起状态



4. 编写中断服务程序(ISR)


在 ISR 中清除中断标志并执行唤醒后的操作:


void EINT0_IRQHandler(void) {
    LPC_SC->EXTINT = (1 << 0);    // 清除 EINT0 中断标志
    // 添加唤醒后的处理代码(如设置唤醒标志)
}



5. 进入深度睡眠并配置唤醒源


确保系统控制寄存器(SCR)配置正确,并使用 __WFI() 进入深度睡眠:


SCB->SCR |= (1 << 2);            // 设置 SLEEPDEEP 位(深度睡眠模式)
LPC_SC->PCONP |= (1 << 0);       // 确保 GPIO 电源/时钟使能(关键!)
LPC_SC->EXTWAKE |= (1 << 0);     // 允许 EINT0 唤醒系统

__WFI();                         // 进入深度睡眠,等待中断唤醒



关键注意事项



  • 引脚电平稳定性:确保触发中断的引脚电平在进入深度睡眠前稳定,避免误触发。

  • 电源配置:深度睡眠下 GPIO 模块可能被关闭,需通过 PCONP 寄存器保持其供电。

  • 唤醒后初始化:若唤醒后外设(如 UART)需要重新初始化,请在 ISR 或主循环中处理。

  • 避免复位:使用 __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 中断正确从深度睡眠唤醒并恢复程序执行。

举报

更多回帖

发帖
×
20
完善资料,
赚取积分