打印
[STM32]

STM32F0单片机,利用闹钟中断5秒唤醒处于停止状态的单片机,求教!

[复制链接]
1128|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主

代码如下
void Enter_StopMode(void)
{   
       
          
                EXIT_UART_Init();//RX引脚配置为外部中断
                RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR , ENABLE);//开电源管理时钟
                RTC_Config();  
                RTC_AlarmConfig();  //POWER_LED(ON);
                EXTI_ClearITPendingBit(EXTI_Line0);   //清外部中断的标志
    PWR_EnterSTOPMode(PWR_Regulator_LowPower, PWR_STOPEntry_WFI);  //进入休眠模式
                 RTC_ITConfig(RTC_IT_ALRA, DISABLE);
          RTC_AlarmCmd(RTC_Alarm_A, DISABLE);  
                RCC_init(); USART2_COM2init(9600);
//                EXTI_ClearITPendingBit(EXTI_Line0);
//                RTC_ClearITPendingBit(RTC_IT_ALRA);
//                EXTI_ClearITPendingBit(EXTI_Line17);
}


//LSI作为时钟源
void RTC_Config(void)
{
  RTC_InitTypeDef RTC_InitStructure;
  RTC_TimeTypeDef  RTC_TimeStruct={0,0,0,RTC_H12_AM};
  RTC_AlarmTypeDef sAlarm={{0,0,1,RTC_H12_AM},RTC_AlarmMask_DateWeekDay|RTC_AlarmMask_Hours|RTC_AlarmMask_Minutes,0,0};
//        RTC_AlarmTypeDef sAlarm={{0,0,5,RTC_H12_AM},RTC_AlarmMask_All,0,0};
//        RTC_TimeStruct RTC_AlarmTypeDef ;
       
  /* Enable the PWR clock */
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE);
        /* Allow access to RTC */
  //PWR_BackupAccessCmd(ENABLE);
  RCC_LSICmd(ENABLE);
  while(RCC_GetFlagStatus(RCC_FLAG_LSIRDY) == RESET)
  {
  }
  /* Select the RTC Clock Source */
  RCC_RTCCLKConfig(RCC_RTCCLKSource_LSI);
/**Initialize RTC and set the Time and Date
Configure the RTC data register and RTC prescaler */
  RTC_InitStructure.RTC_AsynchPrediv = 0x18F;
  RTC_InitStructure.RTC_SynchPrediv  = 0x63;
  RTC_InitStructure.RTC_HourFormat   = RTC_HourFormat_24;
  RTC_Init(&RTC_InitStructure);       
/* Set the time to 00h 00mn 00s AM */
//  RTC_TimeStruct.RTC_H12     = RTC_H12_AM;
//  RTC_TimeStruct.RTC_Hours   = 0x00;
//  RTC_TimeStruct.RTC_Minutes = 0x00;
//  RTC_TimeStruct.RTC_Seconds = 0x00;  
        RTC_SetTime(RTC_Format_BIN, &RTC_TimeStruct);
       
        RTC_SetAlarm(RTC_Format_BIN, RTC_Alarm_A, &sAlarm);
            /* Enable the RTC Clock */
  RCC_RTCCLKCmd(ENABLE);
       
        RTC_WaitForSynchro();

}

void RTC_AlarmConfig(void)
{
        EXTI_InitTypeDef EXTI_InitStructure;
        NVIC_InitTypeDef NVIC_InitStructure;
   
  /* EXTI configuration */
        EXTI_ClearITPendingBit(EXTI_Line17);
        EXTI_InitStructure.EXTI_Line = EXTI_Line17;
        EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
        EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;
        EXTI_InitStructure.EXTI_LineCmd = ENABLE;
        EXTI_Init(&EXTI_InitStructure);
  
  /* Enable the RTC Alarm Interrupt */
        NVIC_InitStructure.NVIC_IRQChannel = RTC_IRQn;
        NVIC_InitStructure.NVIC_IRQChannelPriority = 1;
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
        NVIC_Init(&NVIC_InitStructure);
  /* Enable AlarmA interrupt */
        RTC_ITConfig(RTC_IT_ALRA, ENABLE);
  /* Enable the alarm  A */
        RTC_AlarmCmd(RTC_Alarm_A, ENABLE);
       
       RTC_ClearITPendingBit(RTC_IT_ALRA);
                    EXTI_ClearITPendingBit(EXTI_Line17);
}

使用特权

评论回复

相关帖子

沙发
songyi2008|  楼主 | 2019-11-20 09:37 | 只看该作者
一直不能进入闹钟中断,不知道什么原因,用的是内部8M晶振,中断服务程序如下:
void RTC_IRQHandler(void)

{

if (RTC_GetITStatus(RTC_IT_ALRA) != RESET)
        {

    RTC_ClearITPendingBit (RTC_IT_ALRA);  //清除闹钟中断
               
                  POWER_LED(ON);
               
  }
EXTI_ClearITPendingBit(EXTI_Line17);
}

使用特权

评论回复
板凳
ayb_ice| | 2019-11-20 09:44 | 只看该作者
RTC_IRQHandler是否有起动文件名匹配呢

使用特权

评论回复
地板
songyi2008|  楼主 | 2019-11-20 09:52 | 只看该作者
ayb_ice 发表于 2019-11-20 09:44
RTC_IRQHandler是否有起动文件名匹配呢

闹钟中断程序名就是 void  RTC_IRQHandler(void)

使用特权

评论回复
5
ayb_ice| | 2019-11-20 10:05 | 只看该作者
songyi2008 发表于 2019-11-20 09:52
闹钟中断程序名就是 void  RTC_IRQHandler(void)

这个名字可以随便起的
关键要和启动文件名匹配

QQ图片20191120100447.png (14.86 KB )

QQ图片20191120100447.png

使用特权

评论回复
6
songyi2008|  楼主 | 2019-11-20 10:22 | 只看该作者
F0只有  void  RTC_IRQHandler(void)  这个函数,   没有RTC_Alarm_IRQHandler

使用特权

评论回复
7
ayb_ice| | 2019-11-20 10:58 | 只看该作者
songyi2008 发表于 2019-11-20 10:22
F0只有  void  RTC_IRQHandler(void)  这个函数,   没有RTC_Alarm_IRQHandler

那就是中断没有配置好吧

都没有看你调用NVIC_EnableIRQ

使用特权

评论回复
8
songyi2008|  楼主 | 2019-11-20 11:35 | 只看该作者
/* Enable the RTC Alarm Interrupt */
        NVIC_InitStructure.NVIC_IRQChannel = RTC_IRQn;
        NVIC_InitStructure.NVIC_IRQChannelPriority = 1;
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
        NVIC_Init(&NVIC_InitStructure);      
在下面那个配置函数里有

使用特权

评论回复
9
一事无成就是我| | 2019-11-20 21:49 | 只看该作者
没有看到你闹钟配置,没有配置何来的中断,我也用RTC延时,1秒~23小时均可,不过不是用的STM32而已

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

5

帖子

0

粉丝