STM8L的RTC除了具有显示日期时间的功能外,还具有将STM8L周期性的从低功耗模式唤醒的功能.
由于使用的是RTC时钟,在STM8进入低功耗模式时,这个时钟不会被关闭,所以RTC的自动唤醒计数器可以在低功耗模式下工作.
如上图,RTC的自动唤醒部分的结构比较简单.拥有一个预分频器WUCKSEL,可以提供2,4,8,16分频,上游的RTCCLK一般是等于LSE的频率,即RTCCLK的频率为32768Hz. 同时自动唤醒部分还拥有一个16位的自动重装载计数器,该计数器向下计数到0时,会溢出,自动装载计数值,同时将STM8L从低功耗模式中唤醒.
STM8L数据书册上有关于自动唤醒功能的配置流程,如下图.
这里要注意的是,这个自动唤醒是要开启自动唤醒中断的,如果没有开中断,无法将STM8从低功耗模式下唤醒.
如上图,本例程中WUCKSEL的分频值为2,所以提供给自动唤醒计数器的频率是16384Hz,周期是1000000us/16384=61us.
根据上图中,自动唤醒的时间设置,WUTRH,WUTRH中的数值,0x1002=4098.
所以自动唤醒的时间是:4098*61us=249.987ms.
/****************************************************************************************
*开发环境: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为高速推挽输出
* 入口参数:无
* 出口参数:无
* 说 明:
* 范 例:无
******************************************************************************************************/
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)
* 功 能:重新设置RTC的时分秒年月日,同时闹铃设置为一秒进入一次中断
* 入口参数:无
* 出口参数:无
* 说 明:
* 范 例:无
******************************************************************************************************/
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*/
//----设置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*/
//------关闭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 */
//------设置自动唤醒时间------
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");//执行此条语句后,STM8L152C6进入低功耗模式,主时钟关闭,但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;
}
}
|