STM8L的RTC除了具有顯示日期時間的功能外,還具有將STM8L周期性的從低功耗模式喚醒的功能.
由于使用的是RTC時鐘,在STM8進入低功耗模式時,這個時鐘不會被關(guān)閉,所以RTC的自動喚醒計數(shù)器可以在低功耗模式下工作.

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

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

如上圖,本例程中WUCKSEL的分頻值為2,所以提供給自動喚醒計數(shù)器的頻率是16384Hz,周期是1000000us/16384=61us.
根據(jù)上圖中,自動喚醒的時間設(shè)置,WUTRH,WUTRH中的數(shù)值,0x1002=4098.
所以自動喚醒的時間是:4098*61us=249.987ms.
/****************************************************************************************
*開發(fā)環(huán)境:IAR for stm8 v6.5.3
*硬件平臺:STM8L-DISCOVERY
*功能說明:250ms喚醒一次,將藍燈和黃燈控制IO取反
*作 者:茗風
****************************************************************************************/
#include"iostm8l152c6.h"
#include"stdint.h"
#include"stdbool.h"
bool bRTC_Update_Flag = false;//標志位
/******************************************************************************************************
* 名 稱: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ù):無
* 說 明:
* 范 例:無
******************************************************************************************************/
void RTC_Config(void)
{
//------打開LCD/RTC時鐘------
CLK_PCKENR2_PCKEN22=1;
//---選擇LSE作為RTC時鐘---
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時鐘分頻值----
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寄存器的寫保護功能------
RTC_WPR=0xCA;
RTC_WPR=0x53;
//programming the auto-wakeup timer
RTC_CR2_WUTE=0;//disable the wakeup timer
while(!RTC_ISR1_WUTWF);
//------配置自動喚醒分頻值------
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è)置自動喚醒時間------
RTC_WUTRH=0x10;//裝初值
RTC_WUTRL=0x02;//
//------使能自動喚醒------
RTC_CR2_WUTE=1;//使能自動喚醒
RTC_CR2_WUTIE=1;//開啟自動喚醒中斷
//------使能寫保護------
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進入低功耗模式,主時鐘關(guān)閉,但RTC仍然在運行
}
}
#pragma vector=RTC_WAKEUP_vector
__interrupt void RTC_WAKEUP_ISR(void)
{
if(RTC_ISR2_WUTF==1)
{
PE_ODR_ODR7 ^=0x01;
RTC_ISR2_WUTF=0;
}
}
|