標(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 |