问答

汇集网友智慧,解决技术难题

21ic问答首页 - 新塘单片机外部中断唤醒失败

外部中断 新塘单片机 IO GPIO pi gp

新塘单片机外部中断唤醒失败

刘俊涛2022-01-04
本帖最后由 刘俊涛 于 2022-1-4 11:57 编辑

使用的是新塘Nano 100LC2BN    用外部中断0(PB9)来唤醒深睡的MCU,发现NU-link仿真器在线仿真的时候可以正常唤醒,但是直接下载到程序后,唤醒不了(程序下载后可以运行)
//GPIO配置***********************************************************************************************
SYS->PB_H_MFP = SYS_PB_H_MFP_PB9_MFP_EXT_INT0;     //PB9接外部中断INT0

GPIO_SetMode(PB, BIT9, GPIO_PMD_INPUT);            //将PB9设为输入模式
       
GPIO_EnableEINT0(PB, 9, GPIO_INT_FALLING);          //下降沿触发中断. GPIO_INT_RISING   GPIO_INT_FALLING
NVIC_SetPriority(EINT0_IRQn, 1);                   //设置中断优先级
NVIC_EnableIRQ(EINT0_IRQn);                        //使能外部中断0向量

GPIO_SET_DEBOUNCE_TIME(GPIO_DBCLKSRC_HCLK, GPIO_DBCLKSEL_1);  //选择HCLK作为消抖时钟源
GPIO_ENABLE_DEBOUNCE(PB, BIT9);  //使能PB.9引脚的消抖功能


//中断函数***********************************************************************************************
void EINT0_IRQHandler(void)  //EINT0,指PB.9管脚上的外部信号中断。EINT0外部中断处理函数
{
    if(GPIO_GET_INT_FLAG(PB, BIT9))
    {
        PB->ISRC = BIT9;  //清除PB.9中断标志。ISRC写1=清除相应的未处理中断
        printf("PB.9 EINT0 occurred\r\n");
    }
}

//主程序***********************************************************************************************
int main()
{
        UART_WAIT_TX_EMPTY(UART0); //等待UART0发送完成
        CLK_PowerDown();       //MCU进入掉电模式

        while(1);
}









回答 +关注 16
1367人浏览 2人回答问题 分享 举报
2 个回答
  • 你是如何判定唤醒失败的?唤醒后MCU会以内部8M的时钟运行,在唤醒后需要进行系统的初始化。可能唤醒了你自己没发现
  • 上掉电模式设置程序。你怎么知道MCU进入深度掉电模式了?然后,外部中断函数这样写,应该是不会输出串口信息的。从深度休眠模式唤醒后,要重新初始化外设包括时钟。

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