超透徹的STM32講解資料——RTC時鐘(共14頁)_第1頁
超透徹的STM32講解資料——RTC時鐘(共14頁)_第2頁
超透徹的STM32講解資料——RTC時鐘(共14頁)_第3頁
超透徹的STM32講解資料——RTC時鐘(共14頁)_第4頁
超透徹的STM32講解資料——RTC時鐘(共14頁)_第5頁
已閱讀5頁,還剩9頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

1、精選優(yōu)質(zhì)文檔-傾情為你奉上這部分的內(nèi)容實現(xiàn)的功能是將時間傳輸?shù)缴衔粰C。第一:串口的配置,前面已經(jīng)詳細(xì)的講過,這里不再講解。第二:中斷的配置,由于我們需要時間每秒自加一次,一次需要用到中斷,在中斷服務(wù)程序中實現(xiàn)秒的自加,前面也已講過中斷的配置,這里就不詳細(xì)講解,只給出代碼 /* * 函數(shù)名:NVIC_Configuration * 描述 :配置RTC秒中斷的主中斷優(yōu)先級為1,次優(yōu)先級為0 * 輸入 :無 * 輸出 :無 * 調(diào)用 :外部調(diào)用 */void NVIC_Configuration(void)NVIC_InitTypeDef NVIC_InitStructure;/*設(shè)置先占優(yōu)先級1位

2、,從占優(yōu)先級3位*/NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);/*選擇RTC的IRQ通道*/NVIC_InitStructure.NVIC_IRQChannel =RTC_IRQn;/*設(shè)置中斷先占優(yōu)先級為1*/NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority =1;/*設(shè)置中斷從占優(yōu)先級為1*/NVIC_InitStructure.NVIC_IRQChannelSubPriority =0;/*使能RTC的IRQ通道*/NVIC_InitStructure.NVIC_IRQChanne

3、lCmd =ENABLE;NVIC_Init(&NVIC_InitStructure);第三:對于RTC的使用,首先我們要判斷是否是第一次使用RTC,如果是第一次使用那么肯定要設(shè)置時間的初始值以及對RTC進(jìn)行相應(yīng)的配置,而如果不是第一次使用,那么我們就無需再設(shè)置時間的初始值以及對RTC進(jìn)行相應(yīng)的配置,只需讓RTC計數(shù)器繼續(xù)計數(shù)就可以了。那么我們?nèi)绾尾拍芘袛郣TC是否為第一次使用呢?STM32中有一個后備寄存器,寄存器中的值不會因為掉電而改變,既然如此那我們肯定會這樣想,當(dāng)我第一次使用RTC時,往后備寄存器中寫入一個值,下次再使用RTC時,我只要判斷后備寄存器中的值是否為我第一次用RTC

4、時寫入的值,如果相等,說明我以前已經(jīng)用過RTC了,現(xiàn)在我無需再對RTC進(jìn)行配置了,因為第一次都配置好了(RTC和后備寄存器一樣,RTC寄存器中設(shè)置的值不會因為掉電而改變),但要注意的是RTC的允許中斷這一位在每次復(fù)位后會回到默認(rèn)值,所以每次復(fù)位后我們都要再次設(shè)置允許RTC中斷。下面我們就看看RTC的配置程序: /* * 函數(shù)名:RTC_Configuration * 描述 :配置RTC * 輸入 :無 * 輸出 :無 * 調(diào)用 :外部調(diào)用 */void RTC_Configuration(void) /* 使能PWR和BKP時鐘 */RCC_APB1PeriphClockCmd(RCC_APB

5、1Periph_PWR | RCC_APB1Periph_BKP, ENABLE); /*取消后備區(qū)域的寫保護(hù),因為后備寄存器中放的是重要的數(shù)據(jù),默認(rèn)是不允許往里面寫入值的 */PWR_BackupAccessCmd(ENABLE);/* 將后背寄存器的寄存器值設(shè)為默認(rèn)值 */BKP_DeInit();/* 打開外部低速晶振,RTC可以選擇的時鐘源是外部和內(nèi)部低速晶振及外部高速晶振,這里我們選擇外部低速晶振32768HZ */RCC_LSEConfig(RCC_LSE_ON);/*等待外部低速晶振準(zhǔn)備就序*/while(RCC_GetFlagStatus(RCC_FLAG_LSERDY) =

6、RESET)/*選擇外部低速晶振為RTC的時鐘源*/RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE);/* Enable RTC Clock */RCC_RTCCLKCmd(ENABLE);/* 等待RTC寄存器與RTC的APB時鐘同步 */RTC_WaitForSynchro();/* 等待上次對RTC寄存器配置完成 */RTC_WaitForLastTask();/* 使能RTC中斷 */RTC_ITConfig(RTC_IT_SEC, ENABLE); /* 等待上次對RTC寄存器配置完成 */RTC_WaitForLastTask(); /* 設(shè)置RTC的預(yù)

7、分頻值,因為外部低速晶振是32768,所以選擇 */ /* RTC計數(shù)器計數(shù)頻率= RTCCLK/RTC_PR = (32.768 KHz)/(32767+1) */RTC_SetPrescaler(32767); /* 等待上次對RTC寄存器配置完成 */RTC_WaitForLastTask();下面再來看看在RTC中斷中寫了哪些程序:/* * 函數(shù)名:RTC_IRQHandler(void) * 描述 :RTC中斷服務(wù)函數(shù) * 輸入 :無 * 輸出 :無 * 調(diào)用 :無 */void RTC_IRQHandler(void) /*判斷中斷標(biāo)志位是否被置位*/if (RTC_GetITSt

8、atus(RTC_IT_SEC) != RESET)/* 清除中斷標(biāo)志位 */RTC_ClearITPendingBit(RTC_IT_SEC);/* TimeDisplay是一個標(biāo)志位,只有等于1時才讓串口發(fā)送時間數(shù)據(jù),即讓串口一秒發(fā)一次時間值 */TimeDisplay = 1;/* Wait until last write operation on RTC registers has finished */RTC_WaitForLastTask();/* 當(dāng)時間走到23:59:59秒時RTC計數(shù)器中的值清零,0x=23*3600+56*60+59*/if (RTC_GetCounter

9、() = 0x)RTC_SetCounter(0x0);/* Wait until last write operation on RTC registers has finished */RTC_WaitForLastTask();第四:RTC配置好后肯定要對初始時間的設(shè)置進(jìn)行相應(yīng)的配置了,首先是如何從串口中接受設(shè)置的時間初始值:/* * 函數(shù)名:USART_Scanf * 描述 :串口從超級終端中獲取數(shù)值 * 輸入 :- value 用戶在超級終端中輸入的數(shù)值 * 輸出 :無 * 調(diào)用 :被Time_Regulate(void)調(diào)用 */ uint8_t USART_Scanf(uint3

10、2_t value)uint32_t index = 0;uint32_t tmp2 = 0, 0;while (index < 2)/* 等待數(shù)據(jù)接受完成 */while (USART_GetFlagStatus(USART1, USART_FLAG_RXNE) = RESET)/*將數(shù)據(jù)給數(shù)組tmp, 從串口終端里面輸進(jìn)去的數(shù)是ASCII碼值*/tmpindex+ = (USART_ReceiveData(USART1); /*判斷接受到的數(shù)據(jù)是否在0到9之間*/if (tmpindex - 1 < 0x30) | (tmpindex - 1 > 0x39)printf(

11、"nrPlease enter valid number between 0 and 9");index-;/*將接受的兩個數(shù)據(jù)組成一個兩位數(shù) */index = (tmp1 - 0x30) + (tmp0 - 0x30) * 10);/* 判斷組成后的值是否有無,比如組成的小時不能超過23,分秒不能超過59,value 即為23,或59*/if (index > value)printf("nrPlease enter valid number between 0 and %d", value);return 0xFF;return index;

12、上面的函數(shù)是被下面的Time_Regulate(void)函數(shù)調(diào)用的。 /* * 函數(shù)名:Time_Regulate * 描述 :返回用戶在超級終端中輸入的時間值,并將值儲存在 * RTC 計數(shù)寄存器中。 * 輸入 :無 * 輸出 :用戶在超級終端中輸入的時間值,單位為 s * 調(diào)用 :被Time_Adjust調(diào)用,調(diào)用USART_Scanf */uint32_t Time_Regulate(void)uint32_t Tmp_HH = 0xFF, Tmp_MM = 0xFF, Tmp_SS = 0xFF;printf("rn=Time Settings=");printf

13、("rn Please Set Hours");while (Tmp_HH = 0xFF) /*將串口接受的數(shù)據(jù)給Tmp_HH ,23便是傳遞給USART_Scanf(value)中的形參value的*/Tmp_HH = USART_Scanf(23);printf(": %d", Tmp_HH);printf("rn Please Set Minutes");while (Tmp_MM = 0xFF)Tmp_MM = USART_Scanf(59);printf(": %d", Tmp_MM);printf(&q

14、uot;rn Please Set Seconds");while (Tmp_SS = 0xFF)Tmp_SS = USART_Scanf(59);printf(": %d", Tmp_SS);/* 將時分秒轉(zhuǎn)換成秒放入RTC計數(shù)器中*/return(Tmp_HH*3600 + Tmp_MM*60 + Tmp_SS);/* * 函數(shù)名:Time_Adjust * 描述 :時間調(diào)節(jié) * 輸入 :無 * 輸出 :無 * 調(diào)用 :主函數(shù)調(diào)用 */void Time_Adjust(void)/* Wait until last write operation on RTC

15、 registers has finished */RTC_WaitForLastTask();/* 將設(shè)置的初始時間值裝入RTC計數(shù)器,RTC開始運行時,計數(shù)器里面的值會在初始值的基礎(chǔ)上自動一秒加1次*/RTC_SetCounter(Time_Regulate();/* Wait until last write operation on RTC registers has finished */RTC_WaitForLastTask();時間的初始值設(shè)置好之后肯定是讓時間正常的走起來,同時在上位機上顯示時間/* * 函數(shù)名:Time_Show * 描述 :在超級終端中顯示當(dāng)前時間值 * 輸

16、入 :無 * 輸出 :無 * 調(diào)用 :主函數(shù)調(diào)用,調(diào)用函數(shù)Time_Display(uint32_t TimeVar) */ void Time_Show(void)printf("nr");while (1)/* 只有TimeDisplay 為1時才在上位機上顯示時間,TimeDisplay是用戶自己定義的標(biāo)示符,在RTC中斷服務(wù)函數(shù)中被置1,即1秒被置1一次,也就是1秒才讓串口向上位機發(fā)一次時間*/if (TimeDisplay = 1)/* 將RTC計數(shù)器中的值傳給函數(shù) Time_Display */Time_Display(RTC_GetCounter();Time

17、Display = 0;/* * 函數(shù)名:Time_Display * 描述 :顯示當(dāng)前時間值 * 輸入 :-TimeVar RTC計數(shù)值,單位為 s * 輸出 :無 * 調(diào)用 :被Time_Show調(diào)用*/void Time_Display(uint32_t TimeVar)uint32_t THH = 0, TMM = 0, TSS = 0;/* 將極速器中的值換成時分秒分別賦給THH ,TMM,TSS */THH = TimeVar / 3600;TMM = (TimeVar % 3600) / 60;TSS = (TimeVar % 3600) % 60;/*將時間傳到上位機上顯示*/

18、printf(" Time: %0.2d:%0.2d:%0.2dr", THH, TMM, TSS);到此程序全部寫完了,是不是看的有點暈頭轉(zhuǎn)向啊,那就正常了,哥可是弄了一天才理順的,好好多看幾遍吧。好的下面我們再看看主函數(shù)是按什么順序調(diào)用上面的函數(shù)的#include "stm32f10x.h"#include "usart1.h"#include "rtc.h"/* * 函數(shù)名:main * 描述 :主函數(shù) * 輸入 :無 * 輸出 :無 * 調(diào)用 :調(diào)用外部函數(shù)USART1_Config(),ADC1_Init(),printf */int main(void)/* USART1 con

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論