找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 5485|回复: 1
收起左侧

STM8L的RTC自动唤醒

[复制链接]
ID:140343 发表于 2016-10-9 23:50 | 显示全部楼层 |阅读模式
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;
  }
}


回复

使用道具 举报

ID:216265 发表于 2022-3-7 16:54 | 显示全部楼层
谢谢,谢谢,我这就试试,
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表