目錄
一、MX配置
1. 設置LSE
2. 配置RTC
- 激活時鐘源
- 激活日曆
- 配置2020年2月3日09:40:0 (HAL庫的年份從2000年開始計算,Year變量可以填寫0至99的數)
3. 使能鬧鐘中斷(本人使用的是STM32F103C8T6,貌似沒有帶喚醒的中斷,L1和F4纔有)
4. 設置時鐘樹
注:沒有外部的RTC晶振的話,也可以選擇內部的LSI時鐘,之前的配置一致。
二、軟件生成的關鍵代碼
三、 用戶代碼
1. 時間的設置及獲取
RTC_TimeTypeDef nTime;
//設置時間 BCD
nTime.Hours = 0x20;
nTime.Minutes = 0x30;
nTime.Seconds = 0x10;
HAL_RTC_SetTime(&hrtc,&nTime,RTC_FORMAT_BCD);
//或者2進制設置
nTime.Hours = 20;
nTime.Minutes = 30;
nTime.Seconds = 10;
HAL_RTC_SetTime(&hrtc,&nTime,RTC_FORMAT_BIN);
//獲取時間
HAL_RTC_GetTime(&hrtc,&nTime,RTC_FORMAT_BIN);
printf("Time--%d:%d:%d\r\n",nTime.Hours,nTime.Minutes,nTime.Seconds);
2. 定時中斷
RTC_AlarmTypeDef aTime;
//設置鬧鐘
aTime.Alarm = 0;
aTime.AlarmTime.Hours = 0x09;
aTime.AlarmTime.Minutes = 0x41;
aTime.AlarmTime.Seconds = 0x0;
HAL_RTC_SetAlarm_IT(&hrtc,&aTime,RTC_FORMAT_BCD);
//回調函數
void HAL_RTC_AlarmAEventCallback(RTC_HandleTypeDef *nhrtc) //句柄需要取新名避免與hrtc衝突
{
HAL_RTC_GetTime(nhrtc,&nTime,RTC_FORMAT_BIN);
printf("Alarm--%d:%d:%d\r\n",nTime.Hours,nTime.Minutes,nTime.Seconds);
//以下的設置是實現每間隔1分鐘響應一次中斷--------------------
nTime.Minutes+=1;
if(nTime.Minutes==60)
{
nTime.Hours += 1;
if(nTime.Hours == 24)
{
nTime.Hours = 0;
}
nTime.Minutes=0;
}
aTime.AlarmTime = nTime;
HAL_RTC_SetAlarm_IT(&hrtc,&aTime,RTC_FORMAT_BIN);
//--------------------------------------------------------
}
說明:鬧鐘中斷如果沒有修改,則會在每天定時響應一次中斷。
附:回調函數的配置方法
1. 在stm32f1xx_it.c中找到對應的中斷響應函數
2. 選中函數後按F3 或者 右鍵點擊 Open Declaration 跳轉至該函數定義
找到會被調用到的回調函數 HAL_RTC_AlarmAEventCallback(hrtc)
可以繼續探索下去,這個函數已經有定義,但在之前有 _ _ weak ,意味着用戶有定義則覆蓋。
用戶自定義和的回調函數結構就按照上圖代碼。需要去除__weak 以及 { } 內的內容。