使用STM32的RTC功能,制作一份私人專屬的日歷,就SO簡單了。不廢話,上效果圖:本文引用地址:http://m.butianyuan.cn/article/201611/321300.htm
鄙人通過串口輸出時間到超級終端的(SecureCRT 5.5這貨最好),如果配上TFT就制作一個簡易的電子日歷了。這個里面主要涉及RTC的初始化,時間數(shù)據(jù)的初始化輸入,串口輸出,還有就是公歷時間和農(nóng)歷時間的轉(zhuǎn)換處理。通過串口初始化RTC數(shù)據(jù),RTC通過串口把時間顯示出來,上代碼:
工程結(jié)構(gòu)圖:
1、main.c如下:
#include"stm32f10x.h"
#include"beep.h"
#include"led.h"
#include"usart1.h"
#include"rtc.h"
int main(void)
{
USART_Config();
Beep_Init();
Beep_State(1,BeepOn);
Led_Init();
Led_Spark(LedAll,1,LedOn);
RTC_NVIC_Config(); //RTC嵌套中斷向量初始化
RTC_Display();
}
2、beep led usart這些在博客其他文章里面出現(xiàn)過,這里就不提也罷。
3、RTC.c這是本文的重點了。
C文件如下:
#include"stm32f10x.h"
#include"rtc.h"
#include"usart1.h"
#include"date.h"
#include"calendar.h"
#include
u8 SecondFlag=0;
struct rtc_time systmtime;
u8 const *WEEK_STR[] = {"日", "一", "二", "三", "四", "五", "六"}; //這是一個指針數(shù)組的賦值 不是指向一個數(shù)組的指針 而是一個數(shù)組的每一個元素都是一個指針
//==============================================================================================1-RTC初始化部分
void RTC_NVIC_Config(void)
{
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_SetVectorTable(NVIC_VectTab_FLASH,0x0000); //起始地址位于FLASH
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //優(yōu)先級分組方式2
NVIC_InitStructure.NVIC_IRQChannel =RTC_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=1;
NVIC_InitStructure.NVIC_IRQChannelSubPriority =0;
NVIC_InitStructure.NVIC_IRQChannelCmd =ENABLE;
NVIC_Init(&NVIC_InitStructure);
}
static void RTC_Config(void)
{
RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR|RCC_APB1Periph_BKP,ENABLE);
PWR_BackupAccessCmd(ENABLE);
BKP_DeInit();
RCC_LSEConfig(RCC_LSE_ON);
while(RCC_GetFlagStatus(RCC_FLAG_LSERDY)==RESET); //等待LSE準備就緒
RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE);
RCC_RTCCLKCmd(ENABLE);
RTC_WaitForSynchro();
RTC_ITConfig(RTC_IT_SEC,ENABLE);
RTC_WaitForLastTask();
RTC_SetPrescaler(32767);
RTC_WaitForLastTask();
}
//==============================================================================================2--設置時間部分
static u8 RTC_USART_Scanf(uint32_t value)
{
uint32_t index = 0;
uint32_t tmp[2] = {0, 0};
while (index < 2)
{
while (USART_GetFlagStatus(USART, USART_FLAG_RXNE) == RESET)
{}
tmp[index++] = (USART_ReceiveData(USART));
if ((tmp[index - 1] < 0x30) || (tmp[index - 1] > 0x39))
{
if((index == 2) && (tmp[index - 1] == )) //第一個輸入的是數(shù)字,第二個是按的回車鍵的情況
{
tmp[1] = tmp[0];
tmp[0] = 0x30;
}
else
{
printf("Please enter valid number between 0 and 9 -->: ");
index--;
}
}
else
{
printf("%c", tmp[index - 1]); //輸入一個顯示一個數(shù)字
}
}
index = (tmp[1] - 0x30) + ((tmp[0] - 0x30) * 10);
if (index > value)
{
printf("Please enter valid number between 0 and %d -->: ", value);
return 0xFF;
}
return index;
}
評論