嵌入式技術(shù)及應(yīng)用(STM32CubeMX版)課件 任務(wù)20 用RTC制作數(shù)字鐘_第1頁
嵌入式技術(shù)及應(yīng)用(STM32CubeMX版)課件 任務(wù)20 用RTC制作數(shù)字鐘_第2頁
嵌入式技術(shù)及應(yīng)用(STM32CubeMX版)課件 任務(wù)20 用RTC制作數(shù)字鐘_第3頁
嵌入式技術(shù)及應(yīng)用(STM32CubeMX版)課件 任務(wù)20 用RTC制作數(shù)字鐘_第4頁
嵌入式技術(shù)及應(yīng)用(STM32CubeMX版)課件 任務(wù)20 用RTC制作數(shù)字鐘_第5頁
已閱讀5頁,還剩43頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

任務(wù)20 用RTC制作數(shù)字鐘電子工業(yè)出版社任務(wù)要求STM32用RTC記錄當(dāng)前日期(年、月、日、星期)和時(shí)間(時(shí)、分、秒),用串口1與計(jì)算機(jī)進(jìn)行串行通信。計(jì)算機(jī)通過串口調(diào)試助手向STM32發(fā)送控制命令,用來設(shè)置或者顯示當(dāng)前的日期與時(shí)間。串口的波特率BR=115200bps,數(shù)據(jù)位8位,停止位1位。要求用RTC和串口1制作一個(gè)帶有鬧鐘功能的數(shù)字鐘。具體要求如下:(1)RTC的初始日期為2023年1月1日星期日,時(shí)間為17:02:04。(2)可通過串口發(fā)送命令來顯示當(dāng)前的日期和時(shí)間。(3)可設(shè)置當(dāng)前的日期和時(shí)間、設(shè)置鬧鐘的時(shí)間,設(shè)置數(shù)據(jù)的格式為BCD碼。(4)鬧鐘時(shí)間到后,每隔10s自動(dòng)輸出當(dāng)前時(shí)間,輸出格式為“定時(shí)時(shí)間到,當(dāng)前時(shí)間為:hh:mm:ss”(5)計(jì)算機(jī)發(fā)送的控制命令以及調(diào)試助手中顯示的數(shù)據(jù)如表所示。任務(wù)要求控制命令及回顯數(shù)據(jù)命令功能串口調(diào)試助手顯示的數(shù)據(jù)55AA015A顯示當(dāng)前的日期和時(shí)間按格式要求輸出當(dāng)前日期與時(shí)間55AA02yymmdd5A設(shè)置日期設(shè)置日期是:20yy/mm/dd55AA03hhmmss5A設(shè)置時(shí)間設(shè)置時(shí)間是:hh:mm:ss55AA04ahamas5A設(shè)置鬧時(shí)設(shè)置的鬧鐘時(shí)間是:ah:am:as其他非法輸入非法表中,命令數(shù)據(jù)為16進(jìn)制數(shù),55AA為數(shù)據(jù)頭,5A為數(shù)據(jù)尾,yymmdd、hhmmss、ahamas為設(shè)置值,數(shù)據(jù)格式為BCD碼,例如,STM32的串口接收到0x55AA022211145A,就是要將日期設(shè)置為2022/11/14,此時(shí)需要用串口向計(jì)算機(jī)發(fā)送“設(shè)置日期是:2022/11/14”。任務(wù)要求控制命令及回顯數(shù)據(jù)命令功能串口調(diào)試助手顯示的數(shù)據(jù)55AA015A顯示當(dāng)前的日期和時(shí)間按格式要求輸出當(dāng)前日期與時(shí)間55AA02yymmdd5A設(shè)置日期設(shè)置日期是:20yy/mm/dd55AA03hhmmss5A設(shè)置時(shí)間設(shè)置時(shí)間是:hh:mm:ss55AA04ahamas5A設(shè)置鬧時(shí)設(shè)置的鬧鐘時(shí)間是:ah:am:as其他非法輸入非法串口接收到0x55AA015A命令后,STM32需要輸出當(dāng)前的日期和時(shí)間,輸出格式如下:當(dāng)前日期:2023/01/01,星期日當(dāng)前時(shí)間:17:02:04知識(shí)儲(chǔ)備

1.STM32中RTC的應(yīng)用特性RTC是RealTimeClock的縮寫,其含義是實(shí)時(shí)時(shí)鐘。STM32中集成有一個(gè)RTC,其實(shí)質(zhì)是一個(gè)獨(dú)立的定時(shí)器,用來記錄時(shí)間(時(shí)、分、秒)和日期(年、月、日),STM32中的RTC具有以下特性:(1)RTC主要由APB1總線接口和RTC核心部分組成。APB1總線接口負(fù)責(zé)RTC核心部分與APB1總線連接,這一部分由STM32的主電源供電。(2)RTC核心部分由預(yù)分器、計(jì)數(shù)器、鬧鐘等幾部分組成,分別產(chǎn)生最長周期為1s的計(jì)數(shù)脈沖、并對脈沖計(jì)數(shù)和產(chǎn)生定時(shí)鬧鐘。RTC核心部分由后備電源供電,因此,STM32的主電源斷電后,只要后備電源不斷電,RTC仍會(huì)正常走時(shí)。RTC的實(shí)質(zhì)是一個(gè)掉電后仍能繼續(xù)運(yùn)行的特殊定時(shí)器。

(3)RTC的核心部分工作在備份域中,STM32復(fù)位或者從待機(jī)模式喚醒等狀態(tài)都不影響RTC的設(shè)置和時(shí)間的走時(shí)。(4)RTC的核心部分需通過備份域復(fù)位信號(hào)復(fù)位。(5)RTC具有日期(年、月、日、星期)和時(shí)間(時(shí)、分、秒)計(jì)時(shí)功能,還可以提供亞秒,小時(shí)具有12或24小時(shí)2種制式。(6)RTC具有閏年處理功能,能自動(dòng)將月份的天數(shù)調(diào)整為28、29(閏年的2月)、30和31天。(7)RTC的時(shí)鐘源有3種選擇。1.STM32中RTC的應(yīng)用特性

LSI為內(nèi)部的RC振蕩器,其頻率約為40KHz,存在較大的誤差。在實(shí)際應(yīng)用中,RTC的時(shí)鐘源一般選擇頻率為32.768KHz的外部低速晶體振蕩器,其電路如圖所示。(8)RTC有秒中斷、鬧鐘中斷和溢出中斷等3個(gè)可屏蔽中斷。1.STM32中RTC的應(yīng)用特性函數(shù)的用法(1)HAL_RTC_GetTime()函數(shù)2.HAL庫中有關(guān)RTC的操作函數(shù)原型HAL_StatusTypeDefHAL_RTC_GetTime(RTC_HandleTypeDef*hrtc,RTC_TimeTypeDef*sTime,uint32_tFormat);功能獲取當(dāng)前時(shí)間,并存入指定時(shí)間型結(jié)構(gòu)體變量中。參數(shù)2sTime:獲取的時(shí)間所存放的地址。該參數(shù)是一個(gè)指向RTC_TimeTypeDef(時(shí)間結(jié)構(gòu)體)型變量的指針。RTC_TimeTypeDef類型的定義如下:typedefstruct{uint8_tHours;/*小時(shí),取值為0~23*/uint8_tMinutes;/*分鐘,取值為0~59*/uint8_tSeconds;/*秒,取值為0~59*/}RTC_TimeTypeDef;函數(shù)的用法(1)HAL_RTC_GetTime()函數(shù)2.HAL庫中有關(guān)RTC的操作函數(shù)原型HAL_StatusTypeDefHAL_RTC_GetTime(RTC_HandleTypeDef*hrtc,RTC_TimeTypeDef*sTime,uint32_tFormat);功能獲取當(dāng)前時(shí)間,并存入指定時(shí)間型結(jié)構(gòu)體變量中。參數(shù)1hrtc:指向時(shí)實(shí)鐘結(jié)構(gòu)體變量的指針。在HAL庫中,時(shí)實(shí)鐘結(jié)構(gòu)體變量為hrtc,用來保存RTC的配置信息。參數(shù)3Format:輸出數(shù)據(jù)的格式。取值如下:RTC_FORMAT_BIN:二進(jìn)制數(shù)RTC_FORMAT_BCD:BCD碼返回值HAL的狀態(tài)。先定義一個(gè)RTC_TimeTypeDef類型的結(jié)構(gòu)體變量tim,然后用HAL_RTC_GetTime()函數(shù)獲取當(dāng)前時(shí)間,并存入結(jié)構(gòu)體變量tim中,然后從tim的各成員中讀取小時(shí)、分鐘和秒值。例如,獲取當(dāng)前時(shí)間,并存入時(shí)間變量time中的程序如下:RTC_TimeTypeDef time;HAL_RTC_GetTime(&hrtc,&time,RTC_FORMAT_BIN);上述程序執(zhí)行后,則time.Hours中存放的是小時(shí)值,time.Minutes中存放的是分鐘值,time.Seconds中存放的是秒值。獲取當(dāng)前時(shí)間的方法2.HAL庫中有關(guān)RTC的操作函數(shù)函數(shù)的用法(2)HAL_RTC_GetDate()函數(shù)2.HAL庫中有關(guān)RTC的操作函數(shù)原型HAL_StatusTypeDefHAL_RTC_GetDate(RTC_HandleTypeDef*hrtc,RTC_DateTypeDef*sDate,uint32_tFormat);功能獲取當(dāng)前日期,并存入指定日期型結(jié)構(gòu)體變量中。參數(shù)2sDate:獲取的日期所存放的地址。該參數(shù)是一個(gè)指向RTC_DateTypeDef(日期結(jié)構(gòu)體)型變量的指針。RTC_DateTypeDef類型的定義如下:typedefstruct{uint8_tWeekDay;/*星期,取值為1(星期一)~6(星期六)、0(星期日)*/uint8_tMonth;/*月,取值為1~12*/uint8_tDate;/*日,取值為1~31*/uint8_tYear;/*年,取值為0~99*/}RTC_DateTypeDef;函數(shù)的用法2.HAL庫中有關(guān)RTC的操作函數(shù)原型HAL_StatusTypeDefHAL_RTC_GetDate(RTC_HandleTypeDef*hrtc,RTC_DateTypeDef*sDate,uint32_tFormat);功能獲取當(dāng)前時(shí)間,并存入指定時(shí)間型結(jié)構(gòu)體變量中。參數(shù)1hrtc:指向時(shí)實(shí)鐘結(jié)構(gòu)體變量的指針。在HAL庫中,時(shí)實(shí)鐘結(jié)構(gòu)體變量為hrtc,用來保存RTC的配置信息。參數(shù)3Format:輸出數(shù)據(jù)的格式。取值如下:RTC_FORMAT_BIN:二進(jìn)制數(shù)RTC_FORMAT_BCD:BCD碼返回值HAL的狀態(tài)。(2)HAL_RTC_GetDate()函數(shù)先定義一個(gè)RTC_DateTypeDef類型的結(jié)構(gòu)體變量dat,然后用HAL_RTC_GetDate()函數(shù)獲取當(dāng)前日期,并存入結(jié)構(gòu)體變量dat中,然后從dat的各成員中讀取星期、年、月、日的值。例如,獲取當(dāng)前日期,并存入日期變量date中的程序如下:RTC_DateTypeDef date;HAL_RTC_GetDate(&hrtc,&date,RTC_FORMAT_BIN);上述程序執(zhí)行后,則date.WeekDay中存放的是星期值,date.Month中存放的是月值,date.Date中存放的是日值,date.Year中存放的是年值。獲取當(dāng)前日期的方法2.HAL庫中有關(guān)RTC的操作函數(shù)函數(shù)的用法2.HAL庫中有關(guān)RTC的操作函數(shù)原型HAL_StatusTypeDefHAL_RTC_SetTime(RTC_HandleTypeDef*hrtc,RTC_TimeTypeDef*sTime,uint32_tFormat);功能設(shè)置當(dāng)前時(shí)間。參數(shù)1hrtc:指向時(shí)實(shí)鐘結(jié)構(gòu)體變量的指針。參數(shù)2sTime:時(shí)間變量的指針。該時(shí)間變量是一個(gè)RTC_TimeTypeDef(時(shí)間結(jié)構(gòu)體)型變量,用來保存所要設(shè)置的時(shí)間值。參數(shù)3Format:輸出數(shù)據(jù)的格式。取值如下:RTC_FORMAT_BIN:二進(jìn)制數(shù)RTC_FORMAT_BCD:BCD碼返回值HAL的狀態(tài)。(3)HAL_RTC_SetTime()函數(shù)先定義一個(gè)RTC_TimeTypeDef類型的結(jié)構(gòu)體變量tim,然后對tim變量的各成員賦值,再用HAL_RTC_SetTime()函數(shù)設(shè)置當(dāng)前時(shí)間。例如,將當(dāng)前時(shí)間設(shè)為18:23:48的程序如下:RTC_TimeTypeDeftime;time.Hours=18;time.Minutes=23;time.Seconds=48;HAL_RTC_SetTime(&hrtc,&time,RTC_FORMAT_BIN);設(shè)置當(dāng)前時(shí)間的方法2.HAL庫中有關(guān)RTC的操作函數(shù)函數(shù)的用法2.HAL庫中有關(guān)RTC的操作函數(shù)原型HAL_StatusTypeDefHAL_RTC_SetDate(RTC_HandleTypeDef*hrtc,RTC_DateTypeDef*sDate,uint32_tFormat);功能設(shè)置當(dāng)前日期。參數(shù)1hrtc:指向時(shí)實(shí)鐘結(jié)構(gòu)體變量的指針。參數(shù)2sDate:日期變量的指針。該日期變量是一個(gè)RTC_DateTypeDef(日期結(jié)構(gòu)體)型變量,用來保存所要設(shè)置的日期值。參數(shù)3Format:輸出數(shù)據(jù)的格式。取值如下:RTC_FORMAT_BIN:二進(jìn)制數(shù)RTC_FORMAT_BCD:BCD碼返回值HAL的狀態(tài)。(4)HAL_RTC_SetDate()函數(shù)先定義一個(gè)RTC_DateTypeDef類型的結(jié)構(gòu)體變量dat,然后對dat變量的各成員賦值,再用HAL_RTC_SetDate()函數(shù)設(shè)置當(dāng)前日期。例如,將當(dāng)前日期設(shè)為21-11-16的程序如下:RTC_DateTypeDefdate;date.Year=21;date.Month=11;date.Date=16;HAL_RTC_SetDate(&hrtc,&date,RTC_FORMAT_BIN);設(shè)置當(dāng)前日期的方法2.HAL庫中有關(guān)RTC的操作函數(shù)函數(shù)的用法(5)HAL_RTC_SetAlarm()函數(shù)2.HAL庫中有關(guān)RTC的操作函數(shù)原型HAL_StatusTypeDefHAL_RTC_SetAlarm(RTC_HandleTypeDef*hrtc,RTC_AlarmTypeDef*sAlarm,uint32_tFormat);功能設(shè)置鬧鐘時(shí)間。參數(shù)2sAlarm:指向鬧鐘結(jié)構(gòu)體變量的指針。該變量是一個(gè)RTC_AlarmTypeDef(鬧鐘結(jié)構(gòu)體)型的結(jié)構(gòu)變量,用來保存所要設(shè)置的鬧鐘時(shí)間。RTC_AlarmTypeDef類型的定義如下:typedefstruct{RTC_TimeTypeDefAlarmTime;/*鬧鐘時(shí)間*/uint32_tAlarm;/*鬧鐘ID號(hào),對于STM32F1x其ID號(hào)為0*/}RTC_AlarmTypeDef;函數(shù)的用法2.HAL庫中有關(guān)RTC的操作函數(shù)原型HAL_StatusTypeDefHAL_RTC_SetAlarm(RTC_HandleTypeDef*hrtc,RTC_AlarmTypeDef*sAlarm,uint32_tFormat);功能設(shè)置鬧鐘時(shí)間。參數(shù)1hrtc:指向時(shí)實(shí)鐘結(jié)構(gòu)體變量的指針。在HAL庫中,時(shí)實(shí)鐘結(jié)構(gòu)體變量為hrtc,用來保存RTC的配置信息。參數(shù)3Format:輸出數(shù)據(jù)的格式。取值如下:RTC_FORMAT_BIN:二進(jìn)制數(shù)RTC_FORMAT_BCD:BCD碼返回值HAL的狀態(tài)。(5)HAL_RTC_SetAlarm()函數(shù)先定義一個(gè)RTC_AlarmTypeDef類型的結(jié)構(gòu)體變量alarm,然后對alarm變量的各成員賦值,再用HAL_RTC_SetAlarm()函數(shù)設(shè)置鬧鐘時(shí)間。例如,將鬧鐘時(shí)間設(shè)為18:23:48的程序如下:RTC_AlarmTypeDefalarm; //定義鬧鐘變量alarm.Alarm=0; //設(shè)置鬧鐘ID號(hào)alarm.AlarmTime.Hours=18; //設(shè)置鬧鐘的小時(shí):18時(shí)alarm.AlarmTime.Minutes=23; //設(shè)置鬧鐘的分:23分alarm.AlarmTime.Seconds=48; //設(shè)置鬧鐘的秒:48秒HAL_RTC_SetAlarm(&hrtc,&alarm,RTC_FORMAT_BIN);//設(shè)置鬧鐘2.HAL庫中有關(guān)RTC的操作函數(shù)用HAL_RTC_SetAlarm()函數(shù)設(shè)置鬧鐘時(shí)間的方法函數(shù)的用法2.HAL庫中有關(guān)RTC的操作函數(shù)原型HAL_StatusTypeDefHAL_RTC_SetAlarm_IT(RTC_HandleTypeDef*hrtc,RTC_AlarmTypeDef*sAlarm,uint32_tFormat);功能設(shè)置鬧鐘時(shí)間并開啟鬧鐘中斷。參數(shù)1hrtc:指向時(shí)實(shí)鐘結(jié)構(gòu)體變量的指針。參數(shù)2sAlarm:指向鬧鐘結(jié)構(gòu)體變量的指針。該變量是一個(gè)RTC_AlarmTypeDef(鬧鐘結(jié)構(gòu)體)型的結(jié)構(gòu)變量,用來保存所要設(shè)置的鬧鐘時(shí)間。參數(shù)3Format:輸出數(shù)據(jù)的格式。取值如下:RTC_FORMAT_BIN:二進(jìn)制數(shù)RTC_FORMAT_BCD:BCD碼返回值HAL的狀態(tài)。(6)HAL_RTC_SetAlarm_IT()函數(shù)先定義一個(gè)RTC_AlarmTypeDef類型的結(jié)構(gòu)體變量alarm,然后對alarm變量的各成員賦值,再用HAL_RTC_SetAlarm()函數(shù)設(shè)置鬧鐘時(shí)間。例如,將鬧鐘時(shí)間設(shè)為18:23:48,并開啟鬧鐘中斷,其程序如下:RTC_AlarmTypeDefalarm; //定義鬧鐘變量alarm.Alarm=0; //設(shè)置鬧鐘ID號(hào)alarm.AlarmTime.Hours=0x18; //設(shè)置鬧鐘的小時(shí):18時(shí)alarm.AlarmTime.Minutes=0x23; //設(shè)置鬧鐘的分:23分alarm.AlarmTime.Seconds=0x48; //設(shè)置鬧鐘的秒:48秒HAL_RTC_SetAlarm_IT(&hrtc,&alarm,RTC_FORMAT_BCD);/*設(shè)置鬧鐘,并開啟鬧鐘中斷,數(shù)據(jù)為BCD碼*/用HAL_RTC_SetAlarm_IT()函數(shù)設(shè)置鬧鐘時(shí)間的方法2.HAL庫中有關(guān)RTC的操作函數(shù)函數(shù)的用法2.HAL庫中有關(guān)RTC的操作函數(shù)原型__weakvoidHAL_RTC_AlarmAEventCallback(RTC_HandleTypeDef*hrtc);功能鬧鐘中斷的回調(diào)函數(shù)。若使能了鬧鐘中斷,則當(dāng)鬧鐘時(shí)間到,STM32就會(huì)執(zhí)行此函數(shù)。參數(shù)hrtc:指向時(shí)實(shí)鐘結(jié)構(gòu)體變量的指針。返回值HAL的狀態(tài)。(7)HAL_RTC_AlarmAEventCallback()函數(shù)注意:在HAL中,該函數(shù)為弱函數(shù),內(nèi)部無操作,需用戶重新定義。重定義的內(nèi)容為鬧鐘時(shí)間到后STM32所要處理的工作。voidHAL_RTC_AlarmAEventCallback(RTC_HandleTypeDef*hrtc){ /*鬧鐘時(shí)間到時(shí)的處理*/ HAL_RTC_SetAlarm_IT(hrtc,&alarm,RTC_FORMAT_BIN);/*再次設(shè)置鬧鐘,并開啟鬧鐘中斷,數(shù)據(jù)為二進(jìn)制數(shù),如果不需要再設(shè)開鬧鐘,則去掉此句*/}2.HAL庫中有關(guān)RTC的操作函數(shù)重定義HAL_RTC_AlarmAEventCallback()函數(shù)的框架結(jié)構(gòu)說明:STM32進(jìn)入鬧鐘中斷服務(wù)函數(shù)中后會(huì)關(guān)閉鬧鐘中斷,所以,在用戶自定義的鬧鐘中斷的回調(diào)函數(shù)中,如果要再鬧鐘中斷,則需在函數(shù)最后面重新開啟鬧鐘中斷,否則鬧鐘中斷服務(wù)函數(shù)執(zhí)行后,STM32將不再鬧鐘。2.HAL庫中有關(guān)RTC的操作函數(shù)回調(diào)函數(shù)的形參是一個(gè)指針,參數(shù)名是hrtc。在回調(diào)函數(shù)中hrtc為局部變量,它雖與全局量hrtc同名,但兩者并不是同一個(gè)變量,在函數(shù)體中若局變量與全局變量同名,則所用的變量為局部變量,而不是全局變量。在第4行,HAL_RTC_SetAlarm_IT()函數(shù)的第1個(gè)形數(shù)也是一個(gè)指針,它與回調(diào)函數(shù)的參數(shù)為同一參數(shù)。因此,第4行中HAL_RTC_SetAlarm_IT()函數(shù)的第1個(gè)實(shí)參為hrtc。如果回調(diào)函數(shù)的形參為RTC_HandleTypeDef*shrtc(參數(shù)名與hrtc不同),則第4行代碼應(yīng)為:HAL_RTC_SetAlarm_IT(&hrtc,&alarm,RTC_FORMAT_BIN);//全局變量hrtc的地址或者:HAL_RTC_SetAlarm_IT(shrtc,&alarm,RTC_FORMAT_BIN);//回調(diào)函數(shù)中的形參2.HAL庫中有關(guān)RTC的操作函數(shù)例如,STM32每隔1分鐘就用串口1輸出當(dāng)前時(shí)間,如果用鬧鐘中斷編程,則用戶重定義的鬧鐘中斷的回調(diào)函數(shù)如下:voidHAL_RTC_AlarmAEventCallback(RTC_HandleTypeDef*shrtc){ RTC_AlarmTypeDefiAlarm; RTC_TimeTypeDef iTime; HAL_RTC_GetTime(shrtc,&iTime,RTC_FORMAT_BIN); printf("當(dāng)前時(shí)間為:%2d:%2d:%2d\r\n",iTime.Hours,iTime.Minutes,iTime.Seconds); iTime.Minutes+=1; if(iTime.Minutes>59) { iTime.Minutes=0; iTime.Hours+=1; if(iTime.Hours>23) iTime.Hours=0; }2.HAL庫中有關(guān)RTC的操作函數(shù)例如,STM32每隔1分鐘就用串口1輸出當(dāng)前時(shí)間,如果用鬧鐘中斷編程,則用戶重定義的鬧鐘中斷的回調(diào)函數(shù)如下: iAlarm.Alarm=0; iAlarm.AlarmTime=iTime; HAL_RTC_SetAlarm_IT(shrtc,&iAlarm,RTC_FORMAT_BIN);/*再次設(shè)置鬧鐘,并開啟鬧鐘中斷,數(shù)據(jù)為二進(jìn)制數(shù)*/}實(shí)現(xiàn)方法與步驟任務(wù)20的硬件電路:

1.搭建電路

2.生成RTC的初始化代碼步驟(1)啟動(dòng)STM32CubeMX,然后新建STM32CubeMX工程、配置SYS、RCC和時(shí)鐘,配置的結(jié)果與任務(wù)10相同。(2)配置通用串口1(USART1)按照前面任務(wù)中介紹的方法將串口1配置成異步通信口,波特率為115200bps,8位數(shù)據(jù)位,1位停止位,接收中斷的優(yōu)先級(jí)為1級(jí)。

2.生成RTC的初始化代碼(3)配置RTC第1步:設(shè)置RCC

2.生成RTC的初始化代碼(3)配置RTC第2步:激活RTC的時(shí)鐘源和日歷功能。第3步:配置RTC的參數(shù)。

2.生成RTC的初始化代碼(3)配置RTC第4步:設(shè)置RTC鬧鐘中斷。

2.生成RTC的初始化代碼(3)配置RTC第5步:設(shè)置RTC的時(shí)鐘源。(4)配置工程將工程名設(shè)置成Task20,并設(shè)置保存工程的位置、所用的IDE以及代碼生器的相關(guān)選項(xiàng),將工程保存至“D:\ex”文件夾中,然后生成Keil工程代碼。

3.編寫數(shù)字鐘的應(yīng)用程序步驟(1)將任務(wù)10中的User子文件夾復(fù)制至“D:\ex\Task20”文件夾中。User子文件夾中保存的是串行通信文件Serial.c和Serial.h。(2)打開任務(wù)20的Keil工程,并在Keil工程中新建User組,然后將“D:\ex\Task20\User”文件夾中的Serial.c文件添加至User組中。(3)在Keil工程的include路徑中添加“D:\ex\Task20\User”文件夾,該文件夾是Serial.h頭文件所在的文件夾。(4)在main.c文件中編寫用戶應(yīng)用程序,程序代碼如下:

12345678910111213141516…#include "stdio.h"#include "string.h"#include "Serial.h"…const uint8_tComStr[3]={0x55,0xaa}; //命令頭const uint8_t ComStr1[5]={0x55,0xaa,0x01,0x5a};//命令1:顯示日期和時(shí)間…void RxDataProc(void);//接收數(shù)據(jù)處理函數(shù)說明…intmain(void){

…HAL_UART_Receive_IT(&huart1,&aRxBuf,1); /*使能串口1接收中斷,并指定接收緩沖區(qū)和接收數(shù)據(jù)長度*/while(1){3.編寫數(shù)字鐘的應(yīng)用程序

1617

1819202122232425262728293031{

if(__HAL_UART_GET_FLAG(&huart1,UART_FLAG_IDLE)!=RESET) /*判斷是否是空閑中斷(IDLE)發(fā)生*/

{/****************************************************************/ RxDataProc();//接收數(shù)據(jù)處理/****************************************************************/ memset(UserRxBuf,0,UserRxCnt);//串口接收緩沖區(qū)清0 UserRxCnt=0; //串口接收計(jì)數(shù)值清0 __HAL_UART_CLEAR_IDLEFLAG(&huart1); /*清除IDLE中斷請求標(biāo)志*/

}}}…/********************************************************************** RxDataProc()功能:串口接收數(shù)據(jù)處理3.編寫數(shù)字鐘的應(yīng)用程序

3233343536373839404142434445464748

參數(shù):無返回值:無***********************************************************************/void RxDataProc(void){char * fp;RTC_TimeTypeDef iTime; //定義時(shí)間變量RTC_DateTypeDef iDate; //定義日期變量RTC_AlarmTypeDef iAlarm; //定義鬧鐘變量if((strstr((constchar*)UserRxBuf,(constchar*)ComStr1))!=NULL){ //收到0x55aa015a 顯示日期和時(shí)間 HAL_RTC_GetTime(&hrtc,&iTime,RTC_FORMAT_BIN);//獲取當(dāng)前時(shí)間 HAL_RTC_GetDate(&hrtc,&iDate,RTC_FORMAT_BIN);//獲取當(dāng)前日期 printf("當(dāng)前日期:%d/%02d/%02d,",2000+iDate.Year, iDate.Month,iDate.Date); switch(iDate.WeekDay) //輸出星期 {3.編寫數(shù)字鐘的應(yīng)用程序

4950515253545556575859606162636465 case 0: printf("星期日\r\n"); break; case 1: printf("星期一\r\n"); break; case 2: printf("星期二\r\n"); break; case 3: printf("星期三\r\n"); break; case 4: printf("星期四\r\n"); break; case 5: printf("星期五\r\n");3.編寫數(shù)字鐘的應(yīng)用程序

6667686970717273747576777879808182 break; case 6: printf("星期六\r\n"); break; } printf("當(dāng)前時(shí)間:%02d:%02d:%02d\r\n",iTime.Hours, iTime.Minutes,iTime.Seconds); return;

}

if((fp=strstr((constchar*)UserRxBuf,(constchar*)ComStr))!=NULL){ //收到0x55aa if(*(fp+6)==0x5a) //檢查是否收到了幀尾0x5a { //收到了幀尾0x5a switch(*(fp+2)) //判斷命令的類型

即命令的第3字節(jié) { case 2: //55AA02yymmdd5A設(shè)置日期 iDate.Year=*(fp+3);3.編寫數(shù)字鐘的應(yīng)用程序

8384858687888990919293949596979899 iDate.Month=*(fp+4); iDate.Date=*(fp+5); HAL_RTC_SetDate(&hrtc,&iDate,RTC_FORMAT_BCD); printf("設(shè)置日期是:%x/%02x/%02x\r\n", 0x2000+iDate.Year,iDate.Month,iDate.Date); break; case 3: //55AA03hhmmss5A設(shè)置時(shí)間 iTime.Hours=*(fp+3); //修改小時(shí) iTime.Minutes=*(fp+4);//修改分 iTime.Seconds=*(fp+5);//修改秒 HAL_RTC_SetTime(&hrtc,&iTime,RTC_FORMAT_BCD); printf("設(shè)置時(shí)間是:%02x:%02x:%02x\r\n",iTime.Hours, iTime.Minutes,iTime.Seconds); break; case 4: //55AA04ahamas5A設(shè)置鬧時(shí) iAlarm.Alarm=0; //設(shè)置鬧鐘ID號(hào) iAlarm.AlarmTime.Hours=*(fp+3); //設(shè)置鬧鐘的小時(shí)3.編寫數(shù)字鐘的應(yīng)用程序

100101102103104105106107108109110111112113114115116

iAlarm.AlarmTime.Minutes=*(fp+4); //設(shè)置鬧鐘的分 iAlarm.AlarmTime.Seconds=*(fp+5); //設(shè)置鬧鐘的秒 /*設(shè)置鬧鐘,并開啟鬧鐘中斷,數(shù)據(jù)為BCD碼*/ HAL_RTC_SetAlarm_IT(&hrtc,&iAlarm,RTC_FORMAT_BCD); printf("設(shè)置的鬧鐘時(shí)間是:%02x:%02x:%02x\r\n", iAlarm.AlarmTime.Hours, iAlarm.AlarmTime.Minutes, iAlarm.AlarmTime.Seconds ); break; default: printf("命令編號(hào)錯(cuò)誤!\r\n"); } } else {/*沒收到數(shù)據(jù)尾0x5a*/ printf("數(shù)據(jù)的個(gè)數(shù)非法或者數(shù)據(jù)尾非法!\r\n"); }3.編寫數(shù)字鐘的應(yīng)用程序

117118119120121122123124125126127128129130131132133

}else{ /*沒收到數(shù)據(jù)頭*/ printf("數(shù)據(jù)頭非法!\r\n");}}/********************************************************************** HAL_RTC_AlarmAEventCallback()功能:RTC鬧鐘事件回調(diào)函數(shù)參數(shù):指向時(shí)實(shí)鐘結(jié)構(gòu)體變量的指針返回值:無***********************************************************************/voidHAL_RTC_AlarmAEventCallback(RTC_HandleTypeDef*hrtc){

溫馨提示

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

評論

0/150

提交評論