RTCリアルタイムクロック
1. RTCリアルタイムクロックの概要
STM32のリアルタイムクロックRTCは独立したタイマーです。RTCモジュールには一連の連続カウントカウンターがあります。対応するソフトウェア構成の下で、クロックカレンダー機能を提供できます。カウンター値を変更すると、システムの現在の日時をリセットでき
ます。RTCモジュールまた、クロックコンフィギュレーションシステム(RCC_BDCRレジスタ)はバックエリアにあります。つまり、システムがリセットされるか、スタンバイモードから復帰した後も、RTC設定とイベントは変更されません。ただし、システムのリセット後は、バックアップ領域(BKP)での誤操作を防ぐため、バックアップレジスタとRTCへのアクセスは自動的に禁止されます。そのため、時刻を設定する前に、バックアップ領域の書き込み保護を解除してください。RTCの簡略ブロック図は次のとおりです。
RTCは2つの主要部分で構成されています。最初の部分(APB1インターフェイス)はAPB1バスへの接続に使用されます。このユニットには、APB1バスを介して読み書きできる一連の16ビットレジスタも含まれます。その他の部分(RTCコア)は、グループプログラマブルカウンターは2つのメインモジュールで構成され、最初のモジュールはRTCのプリスケーラーモジュールで、1秒のRTC時間基準TR_CLKを生成するようにプログラムできます。2番目のモジュールは、現在のシステム時間に初期化できる32ビットプログラマブルカウンター(RTC_CNT)です。32ビットクロックカウンターは、毎秒4294967296秒(約136年)を記録できます。一般的なアプリケーションには十分な
RTC です目覚まし時計を生成するために使用される目覚まし時計レジスタRTC_ALRもあります。システム時間は、TR_CLKサイクルに従って累積され、RTC_ALRレジスタに格納されたプログラム可能な時間と比較されます。RTC_CNT= RTC_ALRの場合、アラーム割り込みが生成され、アラーム機能が実現されます
2.ハードウェア設計
この実験では、連続出力時間がRTCの2番目の割り込みを介してシリアルポート1を介して出力され、アラーム割り込みを設定することによってアラームリマインダが実現され、D1インジケータはシステムが正常に動作していることを示します。
- D1インジケーター
- USART1シリアルポート
- RTC
3.ソフトウェア設計
3.1 STM32CubeMX設定
- RCC設定で外部高速水晶発振器(HSE)と外部低速水晶発振器(LSE)を有効にし、クロックツリーでRTC周波数を32.768KHzに設定します。
- PC0はGPIOプッシュプル出力モード、プルアップ、高速に設定され、デフォルトの出力レベルは高
- USART1は非同期通信モードとして選択され、ボーレートは115200ビット/秒に設定され、送信データ長は8ビット、パリティなし、1ストップビットです。
- クロックソースをアクティブにし、カレンダーをアクティブにし、RTC出力なしを選択し、最初の日付と時刻を設定します
- RTCグローバル割り込みとアラーム割り込みを有効にする
- プロジェクト名を入力し、プロジェクトパス(中国語以外)を選択し、MDK-ARM V5を選択します。IPごとに「.c / .h」ファイルのペアとして生成されたペリフェラルの初期化を確認します。「コードを生成」をクリックしてプロジェクトコードを生成します
3.2 MDK-ARMプログラミング
- 2番目の割り込み処理コールバック関数とアラーム割り込み処理関数をrtc.cファイルに書き込みます
extern RTC_DateTypeDef GetDate;
extern RTC_TimeTypeDef GetTime;
void HAL_RTCEx_RTCEventCallback(RTC_HandleTypeDef *hrtc){
HAL_RTC_GetTime(hrtc,&GetTime,RTC_FORMAT_BIN);
HAL_RTC_GetDate(hrtc,&GetDate,RTC_FORMAT_BIN);
printf("Date:%02d-%02d-%02d\r\n",2000+GetDate.Year,GetDate.Month,GetDate.Date);
printf("Time:%02d:%02d:%02d\r\n",GetTime.Hours,GetTime.Minutes,GetTime.Seconds);
printf("\r\n");
}
void HAL_RTC_AlarmAEventCallback(RTC_HandleTypeDef *hrtc){
printf("Alarm Active...!!!\n");
}
- アラーム設定関連のコードをmain.cファイルに書き込み、関連する割り込みをオンにします
/* USER CODE BEGIN PV */
RTC_DateTypeDef GetDate;
RTC_TimeTypeDef GetTime;
RTC_AlarmTypeDef sAlarm;
/* USER CODE END PV */
/* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);
int main(void){
HAL_Init();
SystemClock_Config();
/* Initialize all configured peripherals */
MX_GPIO_Init();
MX_RTC_Init();
MX_USART1_UART_Init();
/* USER CODE BEGIN 2 */
__HAL_RTC_SECOND_ENABLE_IT(&hrtc,RTC_IT_SEC); //开启秒中断
sAlarm.Alarm = RTC_ALARM_A;
sAlarm.AlarmTime.Hours = 16;
sAlarm.AlarmTime.Minutes = 20;
sAlarm.AlarmTime.Seconds = 30;
HAL_RTC_SetAlarm_IT(&hrtc,&sAlarm,RTC_FORMAT_BIN); //设置闹钟并使能闹钟中断
/* USER CODE END 2 */
while (1){
HAL_Delay(1000);
HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_0);
}
}
4.ダウンロードの確認
コンパイルが正しく行われたら、開発ボードにダウンロードします。D1インジケーターが1秒ごとに点滅し、シリアルポートアシスタントが対応する日付と時刻を1秒ごとに出力し、アラーム設定時間が経過すると、関連するアラーム割り込み関数のステートメントが出力されます。