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

下載本文檔

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

文檔簡介

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

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

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

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

1.搭建電路

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

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

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

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

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

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

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:顯示日期和時間…void RxDataProc(void);//接收數(shù)據(jù)處理函數(shù)說明…intmain(void){

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

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; //串口接收計數(shù)值清0 __HAL_UART_CLEAR_IDLEFLAG(&huart1); /*清除IDLE中斷請求標志*/

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

3233343536373839404142434445464748

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

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ù)字鐘的應用程序

6667686970717273747576777879808182 break; case 6: printf("星期六\r\n"); break; } printf("當前時間:%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ù)字鐘的應用程序

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è)置時間 iTime.Hours=*(fp+3); //修改小時 iTime.Minutes=*(fp+4);//修改分 iTime.Seconds=*(fp+5);//修改秒 HAL_RTC_SetTime(&hrtc,&iTime,RTC_FORMAT_BCD); printf("設(shè)置時間是:%02x:%02x:%02x\r\n",iTime.Hours, iTime.Minutes,iTime.Seconds); break; case 4: //55AA04ahamas5A設(shè)置鬧時 iAlarm.Alarm=0; //設(shè)置鬧鐘ID號 iAlarm.AlarmTime.Hours=*(fp+3); //設(shè)置鬧鐘的小時3.編寫數(shù)字鐘的應用程序

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è)置的鬧鐘時間是:%02x:%02x:%02x\r\n", iAlarm.AlarmTime.Hours, iAlarm.AlarmTime.Minutes, iAlarm.AlarmTime.Seconds ); break; default: printf("命令編號錯誤!\r\n"); } } else {/*沒收到數(shù)據(jù)尾0x5a*/ printf("數(shù)據(jù)的個數(shù)非法或者數(shù)據(jù)尾非法!\r\n"); }3.編寫數(shù)字鐘的應用程序

117118119120121122123124125126127128129130131132133

}else{ /*沒收到數(shù)據(jù)頭*/ printf("數(shù)據(jù)頭非法!\r\n");}}/********************************************************************** HAL_RTC_AlarmAEventCallback()功能:RTC鬧鐘事件回調(diào)函數(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)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論