秦山asd 发表于 2017-5-4 21:33:20

STM32F071 STOP RTC 低功耗

有哪位 可以发一份 RTC唤醒的STOP模式的 代码给我吗?我调试的代码始终有问题,唤醒后 串口打印是始终有问题;/*************************************************************/
void RTC_Config(void)
{
                /* Enable the PWR clock */
                RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE);
                /* Allow access to RTC */
                PWR_BackupAccessCmd(ENABLE);
                RCC_LSICmd( ENABLE); //Æô¶¯LSI

                while (RCC_GetFlagStatus(RCC_FLAG_LSIRDY) == RESET)
                { } /* Wait till LSi is ready */
               
                /* Select the RTC Clock Source */
               
               
               
                RCC_RTCCLKConfig(RCC_RTCCLKSource_LSI);//Ñ¡ÔñLSI×÷ΪRTCʱÖÓÔ´
                /* Enable the RTC Clock */
                RCC_RTCCLKCmd(ENABLE);//Æô¶¯RTC
                RTC_WakeUpCmd(DISABLE); //¹Ø±ÕRTC »½ÐѶ¨Ê±Æ÷!!!
               
                /* µÈ´ýRTC¼Ä´æÆ÷ͬ²½   µÈ´ýдRTC¼Ä´æÆ÷Íê³É */
RTC_WaitForSynchro();   

               
                RTC_WakeUpClockConfig(RTC_WakeUpClock_RTCCLK_Div16);//»½ÐѶ¨Ê±Æ÷ʱÖÓ
                RTC_SetWakeUpCounter( 0x9c4); //¸øRTC WAKE UP TIMER¸³ÖØ×°Öµ
                RTC_WakeUpCmd( ENABLE); //Æô¶¯RTC »½ÐѶ¨Ê±Æ÷

}
/********RTC wake up interrupt NVIC ********/
void WKUP_NVIC_Config(void)
{
                EXTI_InitTypeDef EXTI_InitStructure;
                NVIC_InitTypeDef NVIC_InitStructure;

                /* Configure EXTI line 20 (connected to the RTC wakeup event) */
                EXTI_ClearITPendingBit(EXTI_Line20);
                EXTI_InitStructure.EXTI_Line = EXTI_Line20;
                EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
                EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;
                EXTI_InitStructure.EXTI_LineCmd = ENABLE;
                EXTI_Init(&EXTI_InitStructure);
                /* NVIC configuration */
                NVIC_InitStructure.NVIC_IRQChannel = RTC_IRQn;
                NVIC_InitStructure.NVIC_IRQChannelPriority = 1;
                NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
                NVIC_Init(&NVIC_InitStructure);

                /* Enable peirodic wakeup interrupt */
                RTC_ITConfig(RTC_IT_WUT, ENABLE); //
                /* Clear the wakeup Pending Bit */
                RTC_ClearITPendingBit(RTC_IT_WUT);
}
/****** RTC periodic wake up interrupt service routine*******/


void RTC_IRQHandler(void)
{
                //printf("R ");
       
                if (RTC_GetITStatus(RTC_IT_WUT) != RESET)
                {
                        /* Clear RTC wake up interrupt pending bit */
                        RTC_ClearITPendingBit(RTC_IT_WUT);
                        /* Clear EXTI line20 pending bit */
                        EXTI_ClearITPendingBit(EXTI_Line20);
                }
               
               if (PWR_GetFlagStatus(PWR_FLAG_WU) != RESET)
                {
                                PWR_ClearFlag(PWR_FLAG_WU);
                }
}



/**
* @briefMain program
* @paramNone
* @retval None
*/
int main(void)
{
        u32 cnt=0;
u32 i=0;
       
       
        USART_Config();
        for(i=0;i<10;i++)
        {
                printf("\r\nOSÆô¶¯¿ªÊ¼    \r\n");
                delay_ms(500);
        }
       
       

        printf("\r\n¿ªÊ¼ÅäÖà  \r\n");
       
        RTC_Config(); /* RTC Configuration */
        WKUP_NVIC_Config(); /* EXTI LINE 20 CONFIG */
       
        printf("\r\nRTCSTOP ģʽÅäÖÃÍê³É   \r\n");
       
        while(1)
        {
               
                PWR_EnterSTOPMode(PWR_Regulator_LowPower, PWR_STOPEntry_WFI);
       
                SystemInit();
               
                printf("d ");
        }
       
        for(;;);

}


无薪税绵 发表于 2017-8-8 12:34:49

唤醒后,串口也要重新初始化的。

zhjb1 发表于 2017-8-8 15:35:11

唤醒后,点亮个LED,再进入sleep。

阿莫西林 发表于 2017-8-8 18:57:17

我用072也有这问题。你要清一下标志位__HAL_UART_RESET_HANDLE_STATE(&huart1);

samhong 发表于 2017-8-12 18:27:42

签到

zhao.zhao 发表于 2017-8-13 12:35:36

RTC唤醒后,要重新配置系统时钟的,要不然时钟频率错了,波特率也就错了

秦山asd 发表于 2017-8-21 08:31:07

zhao.zhao 发表于 2017-8-13 12:35
RTC唤醒后,要重新配置系统时钟的,要不然时钟频率错了,波特率也就错了
你好,感谢回复!唤醒后我是重新配置了时钟的,但是串口我觉得不应该再次配置了,对应的寄存器都是内容保存的;最后的我也没有找见问题具体出在哪里!解决方案是:采用 CUBE软件自动生成的代码,然后按照一样的方法 添加 低功耗代码,然后就可以了,估计是 FREERTOS哪里有移植问题导致的吧

zhao.zhao 发表于 2017-8-21 14:53:19

一般串口的引脚要重新初始化,就是输入输出方式,串口的其他部分不能再次初始化,否则是可能不能收发的
页: [1]
查看完整版本: STM32F071 STOP RTC 低功耗