OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 2873|回复: 4

STM32F10X STOP模式下用RTC闹钟唤醒,唤不醒

[复制链接]

3

主题

5

帖子

0

精华

新手入门

积分
19
金钱
19
注册时间
2020-7-13
在线时间
3 小时
发表于 2020-7-13 18:27:21 | 显示全部楼层 |阅读模式
1金钱
RTC闹钟中断是连接到EXTI_LINE17,主函数里初始化一些寄存器后,就通过PWR_EnterSTOPMode(PWR_Regulator_LowPower, PWR_STOPEntry_WFI)进入停止模式了。但是这个程序运行后,发现进入停止模式后,RTC闹钟不工作,不会唤醒单片机。
如果我把PWR_EnterSTOPMode(PWR_Regulator_LowPower, PWR_STOPEntry_WFI)屏蔽掉,不进入STOP模式,那么RTC闹钟可以进入中断。但是进入中断后,时间感觉也不对,我设置的ALARM是10秒,
但是实际上大概是6秒。
看不出来什么问题,有大神帮忙看一下吗?谢谢了。
/*****************************************************
                            RTC配置函数
*****************************************************/

u8 rtc_config(void)
{
    u8 temp = 0;

    RCC_APB1PeriphClockCmd(RCC_APB1Periph_BKP|RCC_APB1Periph_PWR, ENABLE);      //使能BKP和PWR时钟
    PWR_BackupAccessCmd(ENABLE);                                                                           //允许BKP访问

    RCC_LSEConfig(RCC_LSE_ON);                                                                               //开启LSE
    while(RCC_GetFlagStatus(RCC_FLAG_LSERDY) == RESET && temp < 250)                 //等待LSE起振或者超时
    {
        temp++;
        delay_ms(10);
    }
    if(temp >= 250) return 1;
    RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE);                                                       //选择RTC时钟源LSE
    RCC_RTCCLKCmd(ENABLE);                                                                                  //使能RTC时钟

    RTC_WaitForSynchro();
    RTC_WaitForLastTask();                                                                                       //等待上一次操作完成
    RTC_SetPrescaler(32767);                                                                                    //设置预分频:1秒
    RTC_WaitForLastTask();
    RTC_SetAlarm(RTC_GetCounter()+10);                                                                 //设置闹钟时间10秒
    RTC_WaitForLastTask();
    RTC_SetCounter(0x0000);                                                      
    RTC_WaitForLastTask();

    RTC_ITConfig(RTC_IT_ALR, ENABLE);                                                                 //使能闹钟中断
    RTC_ClearITPendingBit(RTC_IT_ALR);

    NVIC_InitTypeDef NVIC_InitStruct;
    NVIC_InitStruct.NVIC_IRQChannel = RTCAlarm_IRQn;
    NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;
    NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 1;
    NVIC_InitStruct.NVIC_IRQChannelSubPriority = 0;
    NVIC_Init(&NVIC_InitStruct);

    EXTI_InitTypeDef EXTI_InitStruct;
    EXTI_InitStruct.EXTI_Line = EXTI_Line17;
    EXTI_InitStruct.EXTI_LineCmd = ENABLE;
    EXTI_InitStruct.EXTI_Mode = EXTI_Mode_Interrupt;
    EXTI_InitStruct.EXTI_Trigger = EXTI_Trigger_Rising;
    EXTI_Init(&EXTI_InitStruct);

    return 0;
}
/************************************************************
                                   RTC闹钟中断函数
              每次闹钟唤醒,重新写ALARM的值,并使LED灯翻转
************************************************************/
void RTCAlarm_IRQHandler(void)
{
    EXTI_ClearITPendingBit(EXTI_Line17);
    RTC_WaitForSynchro();
    RTC_WaitForLastTask();
    RTC_SetAlarm(RTC_GetCounter()+10);
    RTC_WaitForLastTask();
    PN_LED0 = ~PN_LED0;
}




正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

3

主题

5

帖子

0

精华

新手入门

积分
19
金钱
19
注册时间
2020-7-13
在线时间
3 小时
 楼主| 发表于 2020-7-16 04:31:22 | 显示全部楼层
@正点原子  原子哥,能麻烦帮忙看一下吗?实在找不出问题了。看了网上很多方法,基本上都是这样操作的。
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2020-7-16 23:21:34 | 显示全部楼层
帮顶
回复

使用道具 举报

0

主题

9

帖子

0

精华

初级会员

Rank: 2

积分
74
金钱
74
注册时间
2020-2-16
在线时间
26 小时
发表于 2020-8-19 20:16:04 | 显示全部楼层
帮顶,楼主解决了吗

回复

使用道具 举报

11

主题

2156

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4967
金钱
4967
注册时间
2015-1-10
在线时间
622 小时
发表于 2020-8-20 08:28:27 | 显示全部楼层
DEBUG一下看看RTC跑不跑呢,再看看ALARMA里面设置对不对
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-30 18:15

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表