目录
前言
代码:
1.rtc.h:
2.rtc.c:
3.main.c:
前言
RTC也被称为实时时钟,是我们学习单片机和蓝桥杯比赛中的一个重要部分,
本文章将展示RTC代码的基本配置和一些代码解析。
RTC实验包括了RTC中的基本配置、NIVC配置和LCD的显示模块。
头文件:
?在RTC的配置过程中注意需要添加需要的头文件。
代码:
1.rtc.h:
#ifndef __RTC_H
#define __RTC_H
#include "stm32f10x.h"
/* Includes ------------------------------------------------------------------*/
void RTC_Init(u8 hour,u8 min,u8 sec);
#endif /* __LCD_H */
2.rtc.c:
#include "rtc.h"
#include "stm32f10x.h"
void RTC_Init(u8 hour,u8 min,u8 sec)
{
//先初始化中断
NVIC_InitTypeDef NVIC_InitStruct;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_BKP|RCC_APB1Periph_PWR,ENABLE); //使能PWR和BKP外设时钟
NVIC_InitStruct.NVIC_IRQChannel=RTC_IRQn; //RTC全局中断
NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority=0; //先占优先级1位,从优先级3位
NVIC_InitStruct.NVIC_IRQChannelSubPriority=0; //先占优先级0位,从优先级4位
NVIC_InitStruct.NVIC_IRQChannelCmd=ENABLE; //使能该通道中断
NVIC_Init(&NVIC_InitStruct);
//先配置后备区
PWR_BackupAccessCmd(ENABLE); //使能后备寄存器访问
BKP_DeInit(); //复位备份区域
//RCC
RCC_LSICmd(ENABLE);//使能LSI时钟
while(RCC_GetFlagStatus(RCC_FLAG_LSIRDY)==RESET);//检查指定的RCC标志位设置值与否
RCC_RTCCLKConfig(RCC_RTCCLKSource_LSI);//设置RTC时钟
RCC_RTCCLKCmd(ENABLE);//使能RTC时钟
RTC_WaitForSynchro(); //等待APB1时钟与RTC时钟同步
RTC_WaitForLastTask();//等待最近一次对RTC寄存器的写操作完成
RTC_ITConfig(RTC_IT_SEC,ENABLE);//使能RTC秒中断
RTC_WaitForLastTask();
RTC_SetPrescaler(40000-1);//设置分频
RTC_WaitForLastTask();
RTC_SetCounter(hour*3600+min*60+sec);//设置初始时间
RTC_WaitForLastTask();
}
extern u8 RTC_Flag;
void RTC_IRQHandler(void)
{
if(RTC_GetFlagStatus(RTC_IT_SEC)==1)
{
RTC_Flag=1;
RTC_ClearITPendingBit(RTC_IT_SEC);
if(RTC_GetCounter()==86400)
{
RTC_SetCounter(0);
RTC_WaitForLastTask();
}
}
}
3.main.c:
#include "stm32f10x.h"
#include "lcd.h"
#include "stdio.h"
#include "rtc.h"
u32 TimingDelay = 0;
void Delay_Ms(u32 nTime);
u8 RTC_Flag=0;
u32 time_total=0;
u8 hour=0,min=0,sec=0;
u8 str[20];
//Main Body
int main(void)
{
SysTick_Config(SystemCoreClock/1000);
RTC_Init(12,0,0); //初始化RTC,设置时间(小时,分钟,秒)
STM3210B_LCD_Init();
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);// 设置中断优先级分组2
LCD_Clear(Black);
LCD_SetBackColor(Black);//2
LCD_SetTextColor(White);//3
LCD_DisplayStringLine(Line2,(unsigned char*)"HELLO WORLD");
while(1)
{
if(RTC_Flag)
{
time_total =RTC_GetCounter();
hour = time_total/3600;
min = time_total%3600/60;
sec = time_total%3600%60;
RTC_Flag=0;
sprintf((char*)str,"%02d:%02d:%02d",hour,min,sec);
LCD_DisplayStringLine(Line3,str);
}
}
}
void Delay_Ms(u32 nTime)
{
TimingDelay = nTime;
while(TimingDelay != 0);
}
使用RTC_Init()函数设置时间,然后在使用sprintf()和LCD_DisplayStringLine()进行显示
?LCD与LED之间存在冲突,本文就不展开讲解。
|