6 Real-Time Clock (RTC)
この章は、CH32F2x、CH32V2x、およびCH32V3xファミリ全体に適用されます。
リアルタイムクロック(RTC)は独立したタイマーモジュールです。
最大32ビットのプログラマブルカウンタをサポートします。
ソフトウェアを使用することで、リアルタイムクロック機能を実装し、 カウンタ値を変更してシステムの現在の時刻と日付を再設定できます。
RTCモジュールはバックアップ電源領域にあり、システムリセットやスタンバイモードからのウェイクアップの影響を受けません。
リアルタイムクロック(RTC)は独立したタイマーモジュールです。
最大32ビットのプログラマブルカウンタをサポートします。
ソフトウェアを使用することで、リアルタイムクロック機能を実装し、 カウンタ値を変更してシステムの現在の時刻と日付を再設定できます。
RTCモジュールはバックアップ電源領域にあり、システムリセットやスタンバイモードからのウェイクアップの影響を受けません。
6.1 主な特徴
・分周係数:最大220
・32ビットプログラマブルカウンタ
・複数のクロックソース、割り込み
・独立リセット
・32ビットプログラマブルカウンタ
・複数のクロックソース、割り込み
・独立リセット
6.2 機能説明
6.2.1 概要
|
図6-1に示すように、RTCモジュールは主にAPB1バスインターフェース、
分周器とカウンタ、制御レジスタとステータスレジスタの3つの部分で構成されています。 分周器とカウンタはバックアップ領域にあり、VBATから電源供給されます。 RTCCKは分周器(RTC_DIV)に入力された後、TR_CLKに分周されます。 分周器(RTC_DIV)には自己減分カウンタが搭載されていることに注意してください。 自己減分カウンタがオーバーフローに達すると、TR_CLKが出力されます。 その後、リロード値レジスタ(RTC_PSCR)からプリセット値が取得され、分周器にリロードされます。 |
図6-1 RTC構造ブロック図
|
分周器の値を読み取ることは、実際にはそのリアルタイム値(読み取り専用)を読み取ることを意味します。
分周器係数は、リロード値レジスタ(RTC_PSCR)に書き込む必要があります。
通常、TR_CLKの周期は1秒に設定され、TR_CLKは2番目のイベントをトリガーし、 同時にメインカウンタ(RTC_CNT)が1ずつ自動的に増加します。
メインカウンタがアラームレジスタの値と同じ値まで増加すると、アラームイベントがトリガーされます。
メインカウンタがオーバーフローまで増加されると、オーバーフローイベントがトリガーされます。
これら3つのイベントはすべて、対応する割り込みイネーブルビットによって制御される割り込みをトリガーできます。
分周器係数は、リロード値レジスタ(RTC_PSCR)に書き込む必要があります。
通常、TR_CLKの周期は1秒に設定され、TR_CLKは2番目のイベントをトリガーし、 同時にメインカウンタ(RTC_CNT)が1ずつ自動的に増加します。
メインカウンタがアラームレジスタの値と同じ値まで増加すると、アラームイベントがトリガーされます。
メインカウンタがオーバーフローまで増加されると、オーバーフローイベントがトリガーされます。
これら3つのイベントはすべて、対応する割り込みイネーブルビットによって制御される割り込みをトリガーできます。
6.2.2 リセット
リアルタイムクロックの特殊な用途のため、バックアップドメインには4組のレジスタ
(分周器、分周器リロード値、メインカウンタ、アラームクロック)があります。
これらは、バックアップドメインのリセット信号によってのみリセットできます。
RCCバックアップドメインのリセットの章を参照してください。
リアルタイムクロックの制御レジスタは、システムリセットまたは電源リセットによって制御されます。
これらは、バックアップドメインのリセット信号によってのみリセットできます。
RCCバックアップドメインのリセットの章を参照してください。
リアルタイムクロックの制御レジスタは、システムリセットまたは電源リセットによって制御されます。
6.2.3 特殊なレジスタ読み出し/書き込み操作
リアルタイムクロックの特殊な用途のため、RTCバスとAPB1バスは独立しており、APB1によるRTCの読み出しは必ずしもリアルタイムではありません。
APB1を介したRTCレジスタの読み出しは、APB1起動後のRTCの立ち上がりエッジを経由する必要があります。
この状況は、システムリセット、電源リセット、スタンバイモードまたはストップモードからのウェイクアップ後に発生する可能性があります。
制御レジスタ(CTLR)のRSFビットがハイに設定されている状態で待機すると便利です。
RTCへの書き込み操作については、前回の書き込み操作が終了した後、コンフィギュレーションモードで以下の手順に従って操作を行う必要があります。
(1) RTOFFビットが1に変化したかどうかを問い合わせます。
(2) CNFビットをセットしてコンフィギュレーションモードに入ります。
(3) 1つまたは複数のRTCレジスタへの書き込み操作を実行します。
(4) CNFビットをクリアしてコンフィギュレーションモードを終了し、 APBインターフェース1を介してRTCレジスタへの書き込みを開始します。
(5) RTOFFビットが1になるまで問い合わせる。ここまでで書き込みは完了です。
(2) CNFビットをセットしてコンフィギュレーションモードに入ります。
(3) 1つまたは複数のRTCレジスタへの書き込み操作を実行します。
(4) CNFビットをクリアしてコンフィギュレーションモードを終了し、 APBインターフェース1を介してRTCレジスタへの書き込みを開始します。
(5) RTOFFビットが1になるまで問い合わせる。ここまでで書き込みは完了です。
6.3 レジスタの説明
表6-1 RTC関連レジスタ
| Name | Access address | Description | Reset value |
|---|---|---|---|
| R16_RTC_CTLRH | 0x40002800 | RTC control register high bit | 0x0000 |
| R16_RTC_CTLRL | 0x40002804 | RTC control register low bit | 0x0000 |
| R16_RTC_PSCRH | 0x40002808 | Prescaler reload value register high bit | 0x0000 |
| R16_RTC_PSCRL | 0x4000280C | Prescaler reload value register low bit | 0x0000 |
| R16_RTC_DIVH | 0x40002810 | Prescaler divider register high bit | 0x0000 |
| R16_RTC_DIVL | 0x40002814 | Prescaler divider register low bit | 0x0000 |
| R16_RTC_CNTH | 0x40002818 | RTC counter high bit | 0x0000 |
| R16_RTC_CNTL | 0x4000281C | RTC counter low bit | 0x0000 |
| R16_RTC_ALRMH | 0x40002820 | Alarm clock register high bit | 0xFFFF |
| R16_RTC_ALRML | 0x40002824 | Alarm clock register low bit | 0xFFFF |
6.3.1 RTC制御レジスタの上位ビット(RTC_CTLRH)
RTC_CTLRH =RTC ConTroL Register High bit | Access base address 0x40002800 Offset address: 0x00
■レジスター内容
| 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| Reserved | OWIE | ALRIE | SECIE | ||||||||||||
| RO | RW | RW | RW | ||||||||||||
| 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
OWIE [RW]
オーバーフロー割り込み有効ビット| 1 | 有効 |
| 0 | 無効 |
ALRIE [RW]
アラーム割り込み有効ビット| 1 | 有効 |
| 0 | 無効 |
SECIE [RW]
2 番目の割り込み有効ビット| 1 | 有効 |
| 0 | 無効 |
6.3.2 RTC制御レジスタ下位ビット(RTC_CTLRL)
RTC_CTLRL =RTC ConTroL Register Low bit | Access base address 0x40002800 Offset address: 0x04
■レジスター内容
RTC に対して実行された最後の書き込み操作のステータスを示します。
RTC に対して操作を実行するには、このビットが 1 である必要があります。
このビットに1を書き込むとコンフィギュレーションモードに入り、カウンタ(R16_RTC_CNTx)、 アラームレジスタ(R16_RTC_ALRMx)、およびプリスケーラリロード値レジスタ(R16_RTC_PSCRx)への書き込みが可能になります。
書き込み操作は、このビットに1を書き込んでソフトウェアでクリアした場合にのみ実行できます。
プリスケーラ(PSCRx)、アラーム(ALRMx)、カウンタRW0(CNTx)の読み書き操作を行う前に、 このビットがハードウェアによってセットされている(レジスタ同期されている)ことを確認してください。
これらのレジスタを読み書きする場合、またはAPBIがリセットされた後、あるいはAPB1クロックが停止した後は、 まずこのビットをリセットする必要があります。
OWIEビットがセットされている場合は、オーバーフロー割り込みも生成されます。
このビットはソフトウェアによってクリアのみ可能で、セットすることはできません。
カウンタ値がアラームレジスタ(ALRMx)の値に達すると、このビットはハードウェアによってセットされます。
アラーム割り込みイネーブルビット(ALRIE)がセットされている場合は、アラーム割り込みも生成されます。
このビットはソフトウェアによってクリアのみ可能で、セットすることはできません。
| 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| Reserved | RTOFF | CNF | RSF | OWF | ALRF | SECF | |||||||||
| RO | RO | RW | RWO | RWO | RWO | RWO | |||||||||
| 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
RTOFF [RO]
RTC 操作ステータス表示ビット。RTC に対して実行された最後の書き込み操作のステータスを示します。
RTC に対して操作を実行するには、このビットが 1 である必要があります。
| 1 | RTC への最後の書き込み操作が完了しました |
| 0 | RTC への最後の書き込み操作がまだ進行中です |
CNF [RW]
コンフィギュレーションフラグビット。このビットに1を書き込むとコンフィギュレーションモードに入り、カウンタ(R16_RTC_CNTx)、 アラームレジスタ(R16_RTC_ALRMx)、およびプリスケーラリロード値レジスタ(R16_RTC_PSCRx)への書き込みが可能になります。
書き込み操作は、このビットに1を書き込んでソフトウェアでクリアした場合にのみ実行できます。
| 1 | コンフィギュレーションモードに入ります |
| 0 | コンフィギュレーションモードを終了し、RTCレジスタの更新を開始します |
RSF [RW]
レジスタ同期フラグビット。プリスケーラ(PSCRx)、アラーム(ALRMx)、カウンタRW0(CNTx)の読み書き操作を行う前に、 このビットがハードウェアによってセットされている(レジスタ同期されている)ことを確認してください。
これらのレジスタを読み書きする場合、またはAPBIがリセットされた後、あるいはAPB1クロックが停止した後は、 まずこのビットをリセットする必要があります。
| 1 | レジスタ同期済み |
| 0 | レジスタが同期されていません |
OWF [RW]
カウンタオーバーフローフラグ。 32ビットカウンタがオーバーフローすると、このビットがハードウェアによってセットされます。OWIEビットがセットされている場合は、オーバーフロー割り込みも生成されます。
このビットはソフトウェアによってクリアのみ可能で、セットすることはできません。
| 1 | セット不可 |
| 0 | クリア |
ALRF [RW]
アラームフラグ。カウンタ値がアラームレジスタ(ALRMx)の値に達すると、このビットはハードウェアによってセットされます。
アラーム割り込みイネーブルビット(ALRIE)がセットされている場合は、アラーム割り込みも生成されます。
このビットはソフトウェアによってクリアのみ可能で、セットすることはできません。
| 1 | セット不可 |
| 0 | クリア |
SECF [RW]
秒イベントフラグ。 クロックがプリスケーラで分周された後、立ち下がりエッジを生成すると、カウンタは1ずつ増加し、秒イベントを生成し、このビットがセットされます。 秒割り込みが有効になっている場合(SECIEビットがセットされている場合)、同時に秒割り込みも生成されます。 このビットはソフトウェアによってのみクリアでき、ソフトウェアによってセットすることはできません。| 1 | セット不可 |
| 0 | クリア |
6.3.3 プリスケーラリロード値レジスタ上位ビット(RTC_PSCRH)
PSCRH =PreSCaler reload value Register High bit | Access base address 0x40002800 Offset address: 0x08
■レジスター内容
| 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| Reserved | PSCR | ||||||||||||||
| RO | RW | ||||||||||||||
| 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
PSCR [RW]
リロード値の上位ビット。6.3.4 プリスケーラリロード値レジスタ下位ビット(RTC_PSCRL)
PSCRL =PreSCaler reload value Register Low bit | Access base address 0x40002800 Offset address: 0x0C
■レジスター内容
実際の分周係数は (PSCR[19:0]+1) です。
例えば、RTC入力周波数が32768Hzの場合、この値を0x7fffに設定すると、信号を1秒周期で分周できます。
| 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| PSCR | |||||||||||||||
| RW | |||||||||||||||
| 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
PSCR [RW]
リロード値の下位ビット。実際の分周係数は (PSCR[19:0]+1) です。
例えば、RTC入力周波数が32768Hzの場合、この値を0x7fffに設定すると、信号を1秒周期で分周できます。
6.3.5 プリスケーラ分周レジスタ上位ビット(RTC_DIVH)
DIVH =prescaler DIVider register High bit | Access base address 0x40002800 Offset address: 0x10
■レジスター内容
| 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| Reserved | DIV | ||||||||||||||
| RO | RO | ||||||||||||||
| 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
DIVH [RO]
プリスケーラ分周器レジスタの上位ビット。6.3.6 プリスケーラ分周レジスタ下位ビット (RTC_DIVL)
DIVL =prescaler DIVider register Low bit | Access base address 0x40002800 Offset address: 0x14
■レジスター内容
DIVは実際には自己減分カウンタです。DIVカウンタは、RTC_CLKの入力クロックごとに1ずつ減少します。
オーバーフロー後、TR_CLKを出力し、同時にPSCRから値をリロードします。
DIVは読み取り専用で、現在のプリスケーラ分周器のカウンタの残値が読み取られます。
| 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| DIV | |||||||||||||||
| RO | |||||||||||||||
| 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
DIVL [RO]
プリスケーラ分周レジスタの下位ビット。DIVは実際には自己減分カウンタです。DIVカウンタは、RTC_CLKの入力クロックごとに1ずつ減少します。
オーバーフロー後、TR_CLKを出力し、同時にPSCRから値をリロードします。
DIVは読み取り専用で、現在のプリスケーラ分周器のカウンタの残値が読み取られます。
6.3.7 RTCカウンターハイビット(RTC_CNTH)
RTC_CNTH =RTC CouNTer high bit | Access base address 0x40002800 Offset address: 0x18
■レジスター内容
| 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| CNT | |||||||||||||||
| RW | |||||||||||||||
| 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
CNTH [RW]
6.3.8 RTCカウンターロービット(RTC_CNTL)
RTC_CNTL =RTC CouNTer Low bit | Access base address 0x40002800 Offset address: 0x1C
■レジスター内容
RTCタイマーの中核コンポーネント。クロックはTRCLKで供給されます(周期は通常1秒に設定されています)。
CNT[31:0]を読み出すことで現在時刻を計算します。
この値を書き込むには、コンフィギュレーションモードに入ります。
| 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| CNT | |||||||||||||||
| RW | |||||||||||||||
| 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
CNTH [RW]
カウンタの下位ビット。RTCタイマーの中核コンポーネント。クロックはTRCLKで供給されます(周期は通常1秒に設定されています)。
CNT[31:0]を読み出すことで現在時刻を計算します。
この値を書き込むには、コンフィギュレーションモードに入ります。
6.3.9 アラームレジスタの上位ビット(RTC_ALRMH)
ALRMH =ALaRM register High bit (RTC_ALRMH) | Access base address 0x40002800 Offset address: 0x20
■レジスター内容
| 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| ALRM | |||||||||||||||
| RW | |||||||||||||||
| 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
ALRM [RW]
アラームレジスタの上位ビット6.3.10 アラームレジスタの下位ビット(RTC_ALRML)
ALRML =ALaRM register Low bit (RTC_ALRMH) | Access base address 0x40002800 Offset address: 0x24
■レジスター内容
アラームレジスタALRM[31:0]の値がカウンタCNT[31:0]の値と一致すると、アラームイベントが生成されます。
この値を変更するには、コンフィギュレーションモードに入ります。
| 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| ALRM | |||||||||||||||
| RW | |||||||||||||||
| 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
ALRM [RW]
アラームレジスタの下位ビット。アラームレジスタALRM[31:0]の値がカウンタCNT[31:0]の値と一致すると、アラームイベントが生成されます。
この値を変更するには、コンフィギュレーションモードに入ります。
