MFRC522唤醒STM32单片机

2019-07-21 07:18发布

各位大神,MFRC522芯片如何唤醒休眠状态的STM32单片机,有做过的可以给一下指导吗
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
11条回答
szczyb1314
1楼-- · 2019-07-22 02:45
守望冬天2018 发表于 2018-11-29 09:13
知道呀,STM32进入停止模式,MFRC522检测到卡的时候唤醒单片机

stop模式需要任意的EXTI中断或事件退出,只要你的RC522有个引脚能输出一个边沿让STM32能触发外部中断或事件就能唤醒STM32

可是你真的需要让STM32低功耗吗?你明明说的是你的RC522功耗很大
守望冬天2018
2楼-- · 2019-07-22 03:29
szczyb1314 发表于 2018-11-29 09:36
stop模式需要任意的EXTI中断或事件退出,只要你的RC522有个引脚能输出一个边沿让STM32能触发外部中断或事 ...

RC522功耗大好像是因为线圈在时刻工作着,我看网上说有个RTC时钟也在一直工作,所以我想试试定时打开关闭线圈
szczyb1314
3楼-- · 2019-07-22 06:40
没用过RC522,对它不了解

不过如果你的RC522的功耗比STM32大很多,STM32完全可以不用考虑进入低功耗反正功耗大头是RC522,那你可以考虑定时关掉RC522的电源试试。一个IO控制mos管打开关断RC522的电源。定时时间你自己根据你的应用决定
守望冬天2018
4楼-- · 2019-07-22 08:58
 精彩回答 2  元偷偷看……
守望冬天2018
5楼-- · 2019-07-22 09:42
static void RTC_NVIC_Config(void)
{   
    NVIC_InitTypeDef NVIC_InitStructure;
    EXTI_InitTypeDef EXTI_InitStructure;
    NVIC_InitStructure.NVIC_IRQChannel = RTC_WKUP_IRQn;      //RTC全局中断
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;   //先占优先级1位,从优先级3位
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;  //先占优先级0位,从优先级4位
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;     //使能该通道中断
    NVIC_Init(&NVIC_InitStructure);     //根据NVIC_InitStruct中指定的参数初始化外设NVIC寄存器
   
    /* EXTI configuration *******************************************************/
    EXTI_ClearITPendingBit(EXTI_Line22);
    EXTI_InitStructure.EXTI_Line = EXTI_Line22;
    EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
    EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;
    EXTI_InitStructure.EXTI_LineCmd = ENABLE;
    EXTI_Init(&EXTI_InitStructure);
}

void RTC_Init_Config(void)
{
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE);
   
    /* Allow access to BKP Domain */
    PWR_BackupAccessCmd(ENABLE);
    //NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
    RTC_NVIC_Config();
   
    if(RTC_ReadBackupRegister(RTC_BKP_DR0) != 0xA4A5)
    {
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE); //①使能 PWR 和 BKP 外设时钟
        PWR_BackupAccessCmd(ENABLE); //②使能后备寄存器访问
        //BKP_DeInit(); //③复位备份区域
        RCC_LSEConfig(RCC_LSE_ON); //设置外部低速晶振(LSE)
        while(RCC_GetFlagStatus(RCC_FLAG_LSERDY) == RESET)
        {
        }
        RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE); //设置 RTC 时钟
        RCC_RTCCLKCmd(ENABLE); //使能 RTC 时钟
        RTC_WaitForSynchro(); //等待 RTC 寄存器同步
        /* Configure the RTC Wakeup Clock source and Counter (Wakeup event each 1 second) */
        RTC_WakeUpCmd(DISABLE);
        RTC_WakeUpClockConfig(RTC_WakeUpClock_RTCCLK_Div16);
        RTC_SetWakeUpCounter(0x7FF);
        
        /* Enable the Wakeup Interrupt */
        RTC_ITConfig(RTC_IT_WUT, ENABLE);
        
        /* Enable Wakeup Counter */
        RTC_WakeUpCmd(ENABLE);
        RTC_WriteBackupRegister(RTC_BKP_DR0, 0xA4A6);
    }
    else
    {
        RTC_WaitForSynchro(); //等待最近一次对 RTC 寄存器的写操作完成
        RTC_ClearITPendingBit(RTC_IT_WUT);
        EXTI_ClearITPendingBit(EXTI_Line22);
        RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_BKPSRAM, ENABLE);
    }
}
//RTC 时钟中断
//每秒触发一次
void RTC_WKUP_IRQHandler(void)
{
    if(RTC_GetITStatus(RTC_IT_WUT) != RESET)
    {
        RTC_ClearITPendingBit(RTC_IT_WUT);
        EXTI_ClearITPendingBit(EXTI_Line22);
    }
}
大神,我进入的是停止模式,现在退不出了


一周热门 更多>