標(biāo)題: STM8L的RTC自動(dòng)喚醒 [打印本頁]

作者: 51hei小林    時(shí)間: 2016-10-9 23:50
標(biāo)題: STM8L的RTC自動(dòng)喚醒
STM8L的RTC除了具有顯示日期時(shí)間的功能外,還具有將STM8L周期性的從低功耗模式喚醒的功能.
由于使用的是RTC時(shí)鐘,在STM8進(jìn)入低功耗模式時(shí),這個(gè)時(shí)鐘不會(huì)被關(guān)閉,所以RTC的自動(dòng)喚醒計(jì)數(shù)器可以在低功耗模式下工作.

如上圖,RTC的自動(dòng)喚醒部分的結(jié)構(gòu)比較簡(jiǎn)單.擁有一個(gè)預(yù)分頻器WUCKSEL,可以提供2,4,8,16分頻,上游的RTCCLK一般是等于LSE的頻率,即RTCCLK的頻率為32768Hz.
同時(shí)自動(dòng)喚醒部分還擁有一個(gè)16位的自動(dòng)重裝載計(jì)數(shù)器,該計(jì)數(shù)器向下計(jì)數(shù)到0時(shí),會(huì)溢出,自動(dòng)裝載計(jì)數(shù)值,同時(shí)將STM8L從低功耗模式中喚醒.

STM8L數(shù)據(jù)書冊(cè)上有關(guān)于自動(dòng)喚醒功能的配置流程,如下圖.

這里要注意的是,這個(gè)自動(dòng)喚醒是要開啟自動(dòng)喚醒中斷的,如果沒有開中斷,無法將STM8從低功耗模式下喚醒.


如上圖,本例程中WUCKSEL的分頻值為2,所以提供給自動(dòng)喚醒計(jì)數(shù)器的頻率是16384Hz,周期是1000000us/16384=61us.
根據(jù)上圖中,自動(dòng)喚醒的時(shí)間設(shè)置,WUTRH,WUTRH中的數(shù)值,0x1002=4098.
所以自動(dòng)喚醒的時(shí)間是:4098*61us=249.987ms.


/****************************************************************************************
*開發(fā)環(huán)境:IAR for stm8 v6.5.3
*硬件平臺(tái):STM8L-DISCOVERY
*功能說明:250ms喚醒一次,將藍(lán)燈和黃燈控制IO取反
*作    者:茗風(fēng)
****************************************************************************************/
#include"iostm8l152c6.h"
#include"stdint.h"
#include"stdbool.h"
bool bRTC_Update_Flag = false;//標(biāo)志位
/******************************************************************************************************
*  名    稱:void GPIO_Init(void)
*  功    能:初始化PC7為高速推挽輸出
*  入口參數(shù):無
*  出口參數(shù):無
*  說    明:
*  范    例:無
******************************************************************************************************/
void GPIO_Init(void)
{
   PC_CR1_C17  =1;//推挽輸出
   PC_CR2_C27  =1;//高速輸出
   PC_DDR_DDR7 =1;//PC7輸出
   PC_ODR_ODR7 =0;//輸出低電平

   PE_CR1_C17  =1;//推挽輸出
   PE_CR2_C27  =1;//高速輸出
   PE_DDR_DDR7 =1;//PC7輸出
   PE_ODR_ODR7 =0;//輸出低電平
}
/******************************************************************************************************
*  名    稱:void RTC_Config(void)
*  功    能:重新設(shè)置RTC的時(shí)分秒年月日,同時(shí)鬧鈴設(shè)置為一秒進(jìn)入一次中斷
*  入口參數(shù):無
*  出口參數(shù):無
*  說    明:
*  范    例:無
******************************************************************************************************/
void RTC_Config(void)
{   
//------打開LCD/RTC時(shí)鐘------
  CLK_PCKENR2_PCKEN22=1;

//---選擇LSE作為RTC時(shí)鐘---
  CLK_CRTCR_RTCSEL0=0;
  CLK_CRTCR_RTCSEL1=0;
  CLK_CRTCR_RTCSEL2=0;
  CLK_CRTCR_RTCSEL3=1;
/* 0000: No clock selected
   0001: HSI clock used as RTC clock source
   0010: LSI clock used as RTC clock source
   0100: HSE clock used as RTC clock source
   1000: LSE clock used as RTC clock sourc*/

//----設(shè)置RTC時(shí)鐘分頻值----
  CLK_CRTCR_RTCDIV0=0;
  CLK_CRTCR_RTCDIV1=0;
  CLK_CRTCR_RTCDIV2=0;
/*000: RTC clock source/1
  001: RTC clock source /2
  010: RTC clock source /4
  011: RTC clock source /8
  100: RTC clock source /16
  101: RTC clock source /32
  110: RTC clock source /64
  111: RTC clock source /128*/

  //------關(guān)閉RTC寄存器的寫保護(hù)功能------
  RTC_WPR=0xCA;
  RTC_WPR=0x53;

  //programming the auto-wakeup timer
  RTC_CR2_WUTE=0;//disable the wakeup timer
  while(!RTC_ISR1_WUTWF);

//------配置自動(dòng)喚醒分頻值------
  RTC_CR1_WUCKSEL=0x03;//32768Hz/2=16384Hz
/*  000: RTCCLK/16 clock is selected
    001: RTCCLK/8 clock is selected
    010: RTCCLK/4 clock is selected
    011: RTCCLK/2 clock is selected   */

//------設(shè)置自動(dòng)喚醒時(shí)間------  
  RTC_WUTRH=0x10;//裝初值
  RTC_WUTRL=0x02;//

//------使能自動(dòng)喚醒------  
  RTC_CR2_WUTE=1;//使能自動(dòng)喚醒
  RTC_CR2_WUTIE=1;//開啟自動(dòng)喚醒中斷

//------使能寫保護(hù)------  
  RTC_WPR=0x55;
  RTC_WPR=0x55;
}
void main(void)
{
  GPIO_Init();
  RTC_Config();
  asm("rim");               //enable interrupts
  while(1)
  {
    PC_ODR_ODR7 ^=0x01;
    asm("halt");//執(zhí)行此條語句后,STM8L152C6進(jìn)入低功耗模式,主時(shí)鐘關(guān)閉,但RTC仍然在運(yùn)行
  }
}
#pragma vector=RTC_WAKEUP_vector
__interrupt void RTC_WAKEUP_ISR(void)
{
  if(RTC_ISR2_WUTF==1)
  {
    PE_ODR_ODR7 ^=0x01;
    RTC_ISR2_WUTF=0;
  }
}



作者: dcc024    時(shí)間: 2022-3-7 16:54
謝謝,謝謝,我這就試試,




歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1