您的位置 首页 数字

简略初始化STM32的RTC

RTC嘛就跟DS1302差不多吧…当然了可分频又有32位的计数器…报警、秒、溢出中断…..等等。RTC在APB1总线上….要使用RTC,一般来说…

RTC嘛 就跟DS1302 差不多吧…当然了可分频又有32位的计数器…报警、秒、溢出中止…..等等。RTC在APB1总线上….

要运用 RTC,一般来说也顺带地运用上后备存放器—这是由于RTC 是一个简略的秒中止
定时器,年月日时分秒的信息必需求找个地方能掉电保存才有含义.STM32 的备份存放器(BKP)是42个16位的存放器,可用来存储84个字节的用户应用程序数据。他们处在备份域里,当VDD电源被堵截,他们依然由VBAT保持供电。当体系在待机形式下被唤醒,或体系复位或电源复位时,他们也不会被复位。 此外,BKP操控存放器用来办理侵入检测和RTC校准功用。 复位后,对备份存放器和RTC的拜访被制止,并且备份域被维护以避免或许存在的意外的写操作它是用后备电池供电的,只需装备好后,即便体系关电,32768 的
晶振和后备存放器的数据也会得以保持.并且RTC的计数器是会持续秒递加的.那么要配
置RTC,就有必要敞开以下东西:
#include “stm32f10x_bkp.h” 这个是后备存放器
#include “stm32f10x_pwr.h” 电源办理
#include “stm32f10x_rtc.h” RTC库

开端吧…..先是中止

void NVIC_Configuration(void)
{
NVIC_InitTypeDef NVIC_InitStructure;

/* Configure one bit for preemption priority */
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);

/*RTC*/
NVIC_InitStructure.NVIC_IRQChannel = RTC_IRQn;//RTC大局中止
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NV%&&&&&%_InitStructure);
}

然后设置 RTC

#include “STM32Lib\\stm32f10x.h”
#include “hal.h”

static u8 RTC_Blank=0;
/***********************************
**函数名:RTC_Configuration
**功用:RTC设置
**注意事项:要根据是否是第一次设置,才进入下面的RTC设定
判别是否第一次设置,只需求判别RTC后备存放器1的值是否为事前写入的0XA5A5,假如不是,则
RTC是第一次上电,需求初始化RTC,并把实践时刻转化为RTC计数值,这儿没有设置实践时刻,仅仅简略地初始化了RTC
************************************/
void RTC_Configuration(void)
{

/*PWR时钟(电源操控)与BKP时钟(RTC后备存放器)使能*/
RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE);

/*使能RTC和后备存放器拜访*/
PWR_BackupAccessCmd(ENABLE);

/*从指定的后备存放器(BKP_DR1)中读出数据*/
if(BKP_ReadBackupRegister(BKP_DR1) != 0xA5A5)
{
/* 将外设BKP的悉数存放器重设为缺省值 */
BKP_DeInit();

/*启用 LSE(外部低速晶振)*/
RCC_LSEConfig(RCC_LSE_ON);
/*等候外部晶振震动 需求等候比较长的时刻*/
while(RCC_GetFlagStatus(RCC_FLAG_LSERDY) == RESET);

/*运用外部晶振32.768K作为RTC时钟*/
RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE);
//答应RTC
RCC_RTCCLKCmd(ENABLE);
//等候RTC存放器同步 原因下文阐明
RTC_WaitForSynchro();
//等候最近一次对RTC存放器的写操作完结
RTC_WaitForLastTask();

//答应RTC的秒中止(还有闹钟中止和溢出中止可设置)
RTC_ITConfig(RTC_IT_SEC, ENABLE);
//又是等候上一次对RTC存放器的写操作完结
RTC_WaitForLastTask();
//32768晶振预分频值是32767,不过一般来说晶振都不那么准
RTC_SetPrescaler(32776);//假如需求校准晶振,可修正此分频值
RTC_WaitForLastTask();

//写入RTC后备存放器1 0xa5a5
BKP_WriteBackupRegister(BKP_DR1, 0xA5A5);
RTC_Blank=1;/*这个标志代表RTC是没有预设的(或许说是没有上扣子电池) 用串口呀啥的输出来。*/

}
//假如RTC现已设置
else
{
//等候RTC与APB同步
RTC_WaitForSynchro();
RTC_WaitForLastTask();

//使能秒中止
RTC_ITConfig(RTC_IT_SEC, ENABLE);//这句能够放到前面吗?
RTC_WaitForLastTask();//又等….
}

//铲除标志
RCC_ClearFlag();
}

为啥要不断的等呢??

RTC核彻底独立于RTC APB1接口。 软件经过APB1接口拜访RTC的预分频值、计数器值和闹钟值。可是,相关的可读存放器只在与RTC APB1时钟进行从头同步的RTC时钟的上升沿被更新。RTC标志也是如此的。 这意味着,假如APB1接口从前被封闭,而读操作又是在刚刚从头敞开APB1之后,则在第一次的内部存放器更新之前,从APB1上读出的RTC存放器数值或许被破坏了(一般读到0)。

因而,若在读取RTC存放器时,RTC的APB1接口从前处于制止状态,则软件首要有必要等候RTC_CRL存放器中的RSF位(存放器同步标志)被硬件置’1’。

注:RTC的 APB1接口不受WFI和WFE等低功耗形式的影响。

/*******************************************************************************
* Function Name : RTC_IRQHandler RTC中止
* Description :
* Input : None
* Output : None
* Return : None
*******************************************************************************/
extern volatile bool Sec;//1S标志
void RTC_IRQHandler(void)
{
if(RTC_GetITStatus(RTC_IT_SEC) != RESET)//RTC发生了秒中止(也有或许是溢出或许闹钟中止)

/*RTC_IT_OW溢出中止/RTC_IT_ALR闹钟中止/RTC_IT_SEC秒中止*/
{
RTC_ClearITPendingBit(RTC_IT_SEC);
Sec=TRUE;

//避免RTC计数溢出,这儿约束了RTC计数值的巨细.0x0001517f实践便是一天的秒数
if(RTC_GetCounter() >= 0x0001517f)
{
RTC_SetCounter(0x0);

RTC_WaitForLastTask();
}
}
}

#include”STM32Lib\\stm32f10x.h”
#include”hal.h”

volatilebool Sec=FALSE;

int main(void)
{
ChipHalInit();//片内硬件初始化
ChipOutHalInit();//片外硬件初始化

TestRtc();//测验RTC
for(;;)
{
if(Sec==TRUE)
{
Sec=FALSE;
GPIOA->ODR^=GPIO_Pin_8;//闪灯
}
}
}

最简略 最底层的CRT写好了……….其实还有很多很帅的功用 比方是否掉电重启 是否是SeSET 复位 等 应该在CRT前 都检测好……..

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/zhishi/shuzi/252387.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部