打印
[STM8]

请教用STM8L151的RTC唤醒

[复制链接]
2018|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
小浣熊|  楼主 | 2015-1-3 20:06 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
小弟在项目中要用到LSI时钟作为RTC唤醒功能的时钟,不知道各位大虾能不能提供一点例程,小弟刚刚接触STM8l系列单片机,在网上查了一下,基本上都是用LSE作为RTC的唤醒时钟的。
沙发
小浣熊|  楼主 | 2015-1-3 20:06 | 只看该作者
完整的测试程序:判断出首次启动程序,单片机处于正常状态时看门狗复位,单片机处于待机模式下被闹钟唤醒/看门狗唤醒.
注意:每次看门狗复位都要被重新配置启动
<div class="dp-highlighter bg_cpp">//检查是否正常状态发生看门狗复位   
<ol class="dp-cpp">    if (RCC_GetFlagStatus(RCC_FLAG_IWDGRST) != RESET)  
    <li class="alt">{          //清楚标志位   
    <li class="alt">    RCC_ClearFlag();        
    <li class="alt">    //RTC功能开启           //使能外部晶振   
    <li class="alt">    RCC_LSEConfig(RCC_LSE_ON);          //等待外部晶振准备好   
    <li class="alt">    while(RCC_GetFlagStatus(RCC_FLAG_LSERDY) == RESET);        
    <li class="alt">    //设置RTC时钟为外部晶振           RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE);  
    <li class="alt">          //使能RTC时钟   
    <li class="alt">    RCC_RTCCLKCmd(ENABLE);          //等待RTC_CTL寄存器中的RSF位(寄存器同步标志)被硬件置1   
    <li class="alt">    RTC_WaitForSynchro();          RTC_WaitForLastTask();   
    <li class="alt">          //使能闹钟中断      
    <li class="alt">    RTC_ITConfig(RTC_IT_ALR, ENABLE);            RTC_WaitForLastTask();   
    <li class="alt">          //分频系数为1,即最小时间单位1/2^15 = 30.5us   
    <li class="alt">    RTC_SetPrescaler(RTC_PRESCALE);            RTC_WaitForLastTask();  
    <li class="alt">          //启动独立看门狗   
    <li class="alt">    IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable);                   //访问之前要首先使能寄存器写           IWDG_SetPrescaler(IWDG_Prescaler_64);                           //64分频 一个周期1.6ms   
    <li class="alt">    IWDG_SetReload(1250);                                           //最长12位 [0,4096] 1250*1.6 = 2s           IWDG_ReloadCounter();                                           //喂狗   
    <li class="alt">    //使能开门狗           IWDG_Enable();  
    <li class="alt">          if (BKP_ReadBackupRegister(BKP_DR5) == 0xabcd)  
    <li class="alt">    {              GPIO_SetBits(GPIOA,GPIO_Pin_12) ;  
    <li class="alt">        BKP_WriteBackupRegister(BKP_DR5,0);          }  
    <li class="alt">    else          {  
    <li class="alt">        GPIO_ResetBits(GPIOA, GPIO_Pin_12) ;              BKP_WriteBackupRegister(BKP_DR5,0xabcd);  
    <li class="alt">    }         }  
    <li class="alt">else      {  
    <li class="alt">    //检查唤醒标志是否设置,判断是否首次启动           if (PWR_GetFlagStatus(PWR_FLAG_WU) == RESET)  
    <li class="alt">    {              //首次启动   
    <li class="alt">        //初始化备份寄存器               //BKP_DeInit();   
    <li class="alt">              //RTC功能开启   
    <li class="alt">        //使能外部晶振               RCC_LSEConfig(RCC_LSE_ON);  
    <li class="alt">        //等待外部晶振准备好               while(RCC_GetFlagStatus(RCC_FLAG_LSERDY) == RESET);  
    <li class="alt">                  //设置RTC时钟为外部晶振   
    <li class="alt">        RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE);            
    <li class="alt">        //使能RTC时钟               RCC_RTCCLKCmd(ENABLE);  
    <li class="alt">        //等待RTC_CTL寄存器中的RSF位(寄存器同步标志)被硬件置1               RTC_WaitForSynchro();  
    <li class="alt">        RTC_WaitForLastTask();         
    <li class="alt">        //使能闹钟中断                  RTC_ITConfig(RTC_IT_ALR, ENABLE);   
    <li class="alt">        RTC_WaitForLastTask();         
    <li class="alt">        //分频系数为1,即最小时间单位1/2^15 = 30.5us               RTC_SetPrescaler(RTC_PRESCALE);   
    <li class="alt">        RTC_WaitForLastTask();        
    <li class="alt">        //启动独立看门狗               IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable);                   //访问之前要首先使能寄存器写   
    <li class="alt">        IWDG_SetPrescaler(IWDG_Prescaler_64);                           //64分频 一个周期1.6ms               IWDG_SetReload(1250);                                           //最长12位 [0,4096] 1250*1.6 = 2s   
    <li class="alt">        IWDG_ReloadCounter();                                           //喂狗               //使能开门狗   
    <li class="alt">        IWDG_Enable();                  
    <li class="alt">        if (BKP_ReadBackupRegister(BKP_DR6) == 0xabcd)              {  
    <li class="alt">            GPIO_ResetBits(GPIOA, GPIO_Pin_11) ;                  BKP_WriteBackupRegister(BKP_DR6,0);  
    <li class="alt">        }              else  
    <li class="alt">        {                  GPIO_SetBits(GPIOA,GPIO_Pin_11) ;  
    <li class="alt">            BKP_WriteBackupRegister(BKP_DR6,0xabcd);              }                                             
    <li class="alt">    }          else  
    <li class="alt">    {                 //从待机模式中退出,有闹钟唤醒或者看门狗唤醒   
    <li class="alt">        //清除唤醒标志               RCC_ClearFlag();   
    <li class="alt">              if (BKP_ReadBackupRegister(BKP_DR7) == 0xabcd)  
    <li class="alt">        {                  GPIO_ResetBits(GPIOA, GPIO_Pin_8) ;  
    <li class="alt">            BKP_WriteBackupRegister(BKP_DR7,0);              }  
    <li class="alt">        else              {  
    <li class="alt">            GPIO_SetBits(GPIOA,GPIO_Pin_8) ;                  BKP_WriteBackupRegister(BKP_DR7,0xabcd);  
    <li class="alt">        }          }  
    <li class="alt">}        
    <li class="alt">//延时1s       for (i = 0;i

使用特权

评论回复
板凳
zh113214| | 2015-1-3 20:15 | 只看该作者
www.soiseek.cn/STMICROELECTRONICS/STM8L151C4/相信楼主看了会有所收获的

使用特权

评论回复
地板
搞IT的| | 2015-1-4 20:10 | 只看该作者
zh113214 发表于 2015-1-3 20:15
www.soiseek.cn/STMICROELECTRONICS/STM8L151C4/相信楼主看了会有所收获的

链接错误啊:)

使用特权

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

本版积分规则

528

主题

2095

帖子

8

粉丝