|
自己做的一個(gè)STM32實(shí)時(shí)時(shí)鐘,給有需要的朋友拿去學(xué)習(xí)。
單片機(jī)源程序如下:
- //////////////////////////////////////////////////////////
- //本例程演示了RTC的設(shè)置與使用方法
- //////////////////////////////////////////////////////////
- #include <stdio.h>
- #include "ASCII.h"
- #include "HZ_GB2312.h"
- #include "gui.h"
- #include "number.c"
- #define LED1_OFF GPIO_SetBits(GPIOC, GPIO_Pin_0)
- #define LED1_ON GPIO_ResetBits(GPIOC, GPIO_Pin_0)
- #define LED2_OFF GPIO_SetBits(GPIOC, GPIO_Pin_1)
- #define LED2_ON GPIO_ResetBits(GPIOC, GPIO_Pin_1)
- #define LED3_OFF GPIO_SetBits(GPIOC, GPIO_Pin_2)
- #define LED3_ON GPIO_ResetBits(GPIOC, GPIO_Pin_2)
- #define LED1_STATUS GPIO_ReadOutputDataBit(GPIOC, GPIO_Pin_0)
- #define LED2_STATUS GPIO_ReadOutputDataBit(GPIOC, GPIO_Pin_1)
- #define LED3_STATUS GPIO_ReadOutputDataBit(GPIOC, GPIO_Pin_2)
- //vu32 flag_display = 0;
- //配置LED對(duì)應(yīng)端口
- void LED_Configuration(void)
- {
- GPIO_InitTypeDef GPIO_InitStructure;
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE );
-
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
- GPIO_Init(GPIOC, &GPIO_InitStructure);
- }
- //通用延時(shí)函數(shù)
- #define TIME_MS 12000 //@72M
- #define TIME_US 10 //@72M
- //長(zhǎng)延時(shí)函數(shù)
- void Delay_ms(unsigned int n)
- {
- unsigned int i,j;
-
- for(i=n;i>0;i--)
- for(j=TIME_MS;j>0;j--);
- }
- //短延時(shí)函數(shù)
- void Delay_us(unsigned int n)
- {
- unsigned int i,j;
-
- for(i=n;i>0;i--)
- for(j=TIME_US;j>0;j--);
- }
- //系統(tǒng)中斷管理
- void NVIC_Configuration(void)
- {
- NVIC_InitTypeDef NVIC_InitStructure;
- 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);
- }
- void RTC_Configuration(void)
- {
- //后備域時(shí)鐘使能
- RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE);
- //后備域訪問(wèn)使能
- PWR_BackupAccessCmd(ENABLE);
- //復(fù)位后備域
- BKP_DeInit();
-
- //低頻外部時(shí)鐘LSE使能
- RCC_LSEConfig(RCC_LSE_ON);
- //等待LSE就緒
- while(RCC_GetFlagStatus(RCC_FLAG_LSERDY) == RESET);
- //選擇LSE作為RTC時(shí)鐘源
- RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE);
- //RTC時(shí)鐘使能
- RCC_RTCCLKCmd(ENABLE);
- //等待RTC寄存器同步
- RTC_WaitForSynchro();
- //等待RTC寄存器最近一次寫操作完成
- RTC_WaitForLastTask();
- //秒中斷使能
- RTC_ITConfig(RTC_IT_SEC, ENABLE);
- //等待RTC寄存器最近一次寫操作完成
- RTC_WaitForLastTask();
- //配置預(yù)分頻系數(shù)為32767+1,當(dāng)選擇32.768kHz晶振時(shí)RTC計(jì)數(shù)頻率為1Hz
- RTC_SetPrescaler(32767);
- //等待RTC寄存器最近一次寫操作完成
- RTC_WaitForLastTask();
- }
- //配置系統(tǒng)時(shí)鐘,使能各外設(shè)時(shí)鐘
- void RCC_Configuration(void)
- {
- SystemInit();
- RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOC |RCC_APB2Periph_ADC1
- |RCC_APB2Periph_GPIOD| RCC_APB2Periph_AFIO , ENABLE );
- }
- void RTC_Check()
- {
- if(BKP_ReadBackupRegister(BKP_DR1) != 0xA5A5) //如果后備寄存器不為特定值,配置RTC
- {
- RTC_Configuration(); //RTC配置
- RTC_WaitForLastTask(); //等待RTC寄存器最后一次寫操作完成
-
- RTC_SetCounter(0); //設(shè)置RTC計(jì)數(shù)器值
- RTC_WaitForLastTask(); //等待RTC寄存器最后一次寫操作完成
-
- BKP_WriteBackupRegister(BKP_DR1, 0xA5A5);
- }
- else //如果后背寄存器為特定值,僅簡(jiǎn)單操作RTC
- {
-
- RTC_WaitForSynchro(); //等待RTC寄存器同步
- RTC_ITConfig(RTC_IT_SEC, ENABLE); //使能RTC秒中斷
- RTC_WaitForLastTask(); //等待RTC寄存器最近一次寫操作完成
- }
-
- RCC_ClearFlag(); //清除標(biāo)志
- }
- //配置所有外設(shè)
- void Init_All_Periph(void)
- {
- SystemInit();
- LED_Configuration();
- NVIC_Configuration();
-
- LCD_Init(); //LCD彩屏初始化
- LCD_ClearScreen(WHITE); //清屏
- }
- u8 isIn;
- //主函數(shù)
- int main(void)
- {
- // char buf[25];
- u32 TimeVar;
-
- Init_All_Periph();
-
- RTC_Check(); //實(shí)時(shí)時(shí)鐘檢查
-
- GUI_Text(20,50,"Elapsed Time:",BLUE,WHITE);
-
- //先固定顯示兩個(gè)冒號(hào)的位置
- LCD_DrawPicture(100, 120, Colon_Image);
- LCD_DrawPicture(200, 120, Colon_Image);
- while(1)
- {
- if(isIn)
- {
- TimeVar = RTC_GetCounter();
-
- LCD_DrawPicture(20, 120, Num_Image[TimeVar/3600%24/10]); //時(shí) 十位
- LCD_DrawPicture(60, 120, Num_Image[TimeVar/3600%24%10]); //時(shí) 個(gè)位
- LCD_DrawPicture(120, 120, Num_Image[TimeVar/60%60/10]); //分 十位
- LCD_DrawPicture(160, 120, Num_Image[TimeVar/60%60%10]); //分 個(gè)位
- LCD_DrawPicture(220, 120, Num_Image[TimeVar%60/10]); //秒 十位
- LCD_DrawPicture(260, 120, Num_Image[TimeVar%60%10]); //秒 個(gè)位
- isIn = 0;
- }
- }
- }
- //RTC中斷服務(wù)函數(shù)
- void RTC_IRQHandler()
- {
- if(RTC_GetITStatus(RTC_IT_SEC) != RESET) //判斷是否為秒中斷
- {
- isIn = 1;
- RTC_ClearITPendingBit(RTC_IT_SEC); //清除秒中斷標(biāo)志
- }
- }
復(fù)制代碼
所有資料51hei提供下載(大家不要下載,資源不正確,編譯不通過(guò),求大神幫忙修改下):
RTC實(shí)時(shí)時(shí)鐘.rar
(514.44 KB, 下載次數(shù): 138)
2017-10-11 22:17 上傳
點(diǎn)擊文件名下載附件
|
評(píng)分
-
查看全部評(píng)分
|