STM32CubeIDE HAL庫函數操作RTC實時時鐘 及 定時鬧鐘中斷

目錄

一、MX配置

二、軟件生成的關鍵代碼

三、 用戶代碼

附:回調函數的配置方法


一、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 以及 { } 內的內容。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章