ch32v003-getting-started-ja

MounRiver Studioで使う CH32V003 はじめの一歩

View on GitHub

目次に戻る

USART ユニバーサル同期/非同期受送信機

概要

ブロック図

受信動作

TE (transmit enable bit) がセットされると、送信シフトレジスタ内のデータが TXピンに出力され、クロックが CKピンに出力される。

データの送信は Lowのスタートビットで開始され、最下位ビットから順に出力される。M (word length) ビットの設定に応じて 8bitまたは 9bitのデータが送信され、パリティチェックビットが有効な場合、データの後にパリティビットが付加される。最後に設定可能な長さのストップビットが送出されて送信が終了する。

実際の送信動作では、TEがセットされた後、Highが 10bitまたは 11bitのアイドルフレームが送信されてから、実際のデータが送信される。

SBKビットによるブレイクフレーム送出では Lowが 10bitまたは 11bit続いた後に、ストップビットが付加される。

ボーレートジェネレータ

送受信機のボーレート = HCLK / (16 * USARTDIV)

であり、HCLKは HBのクロックである。USARTDIVの値は USART_BRR内の DIV_Mおよび DIV_Fフィールドによって決定され、以下の式で算出される。

USARTDIV = DIV_M + (DIV_F / 16)

ボーレートジェネレータによって生成されるボーレートは、誤差が発生する場合があるが、最も近い値を選択する以外に、HBクロック周波数を上げることで誤差を低減することもできる。

例えば、HCLKが 48MHzの時にボーレートを 76800bpsに設定する場合、USARTDIVの値を 39.0625に設定すると、正確に 76800bpsが得られる。

一方、921600bpsが必要な場合、USARTDIVの値は約 3.255である。USART_BRRに設定可能な最も近い値は 3.25であり、実際のボーレートは 923076bpsとなる。誤差は 0.16%である。

送信側から送られた送信波形が受信側に伝送される際、送信側と受信側のボーレートには誤差が生じる。主な誤差要因は以下の三点である。

受信側には一定の受信許容誤差があり、上記三点の合計誤差がモジュールの許容限界を下回る場合は送受信に影響はない。

許容限界はボーレートレジスタの小数部の使用とデータ長によって影響を受け、小数部および 9bitデータ長を使用すると許容限界は低下するが、誤差が 3%未満であれば通信可能である。

設定値の計算

ボーレートレジスタに設定する値を計算すると

ボーレート = HCLK / (16 * USARTDIV) 
USARTDIV = DIV_M + (DIV_F / 16)

(16 * USARTDIV) = HCLK / ボーレート
USARTDIV = HCLK / ボーレート / 16

整数部 DIV_M = HCLK / ボーレート / 16
小数部 DIV_F = (HCLK / ボーレート) & 0x0f
(DIV_Fは 4bitなので下位 4bitだけ取り出す)

となる。

同期モード

同期モードでは、データを送信時に CK ピンからクロック信号を出力する。

同期モードを有効にするには、コントロールレジスタ2の CLKENビットをセットする。また、LINモード、スマートカードモード、赤外線モード、半二重モードが無効になっている必要がる。

クロック出力制御について、いくつかの注意点が存在する。

クロックタイミング

クロックタイミング

データのサンプルと保持時間

データサンプル

1-wire 半二重モード

半二重モードでは、1本のピン (TXピンのみ) を使用して送受信を行うことができ、TXピンと RXピンはチップ内部で接続されている。

半二重モードを有効にするには、コントロールレジスタ3の HDSELビットをセットする。また、LINモード、スマートカードモード、赤外線モード、同期モードは無効になっている必要がある。

設定後は、TXの I/Oポートをオープンドレイン出力、出力モード Highに設定する必要がある。オープンドレイン出力であるから外部にプルアップ抵抗が必要。

TEをセットすると、データレジスタに書き込まれたデータは即座に送信される。

半二重モードでは、複数のデバイスが単一バスで送受信を行う場合にバス競合が発生する可能性があるため、ユーザがソフトウェアで回避する必要がある。

スマートカード

スマートカードモードは、ISO7816-3 プロトコルに準拠したスマートカードコントローラへのアクセスをサポートする。

スマートカードモードを有効にするには、コントロールレジスタ3の SCENビットをセットする。また、LINモード、ハーフデュプレックスモード、赤外線モードが無効になっている必要がある。クロック出力のために CLKENは有効にしてもよい。

スマートカードモードでは、USARTを 8bitデータ + 1bitパリティに設定し、ストップビットは送受信ともに 1.5bitに設定することが推奨される。スマートカードモードは 1-wire半二重プロトコルであり、TXラインを用いてデータ通信を行うため、TXはオープンドレイン出力に設定する必要があり、外部にプルアップ抵抗を設ける必要がある。

受信側がデータフレームを受信しパリティエラーを検出した場合、ストップビット期間中に 1サイクルだけ TXを Lowに駆動することで NACK信号を送信側へ伝達する。

送信側はこの NACK信号を検出しフレームエラーを生成するので、アプリケーション側で再送処理を行うことが可能となる。

USARTの TCフラグ (送信完了) により、GT(ガードタイム) の生成を 1クロック遅延させることができ、受信側は自身が設定した NACK信号をスタートビットとして誤認識することはない。

パリティーエラー時の波形

パリティエラー

スマートカードモードにおいて、CKピンから出力される波形は通信とは無関係であり、単にスマートカードに対してクロックを供給するものである。 このクロックは AHBクロックを基準とし、5bitの設定可能なクロック分周器によって分周される。

IrDA

USARTモジュールは、IrDA赤外線トランシーバの制御をサポートする。

IrDAを使用するには、LINEN、STOP、CLKEN、SCEN、HDSELビットをクリアする必要がある。

USARTモジュールと SIR物理層(赤外線トランシーバ)間では NRZ (non-return to zero) 符号化が使用され、最大 115200bpsまで対応する。

IrDAは半二重プロトコルであり、USARTが SIR物理層へデータを送信している場合、IrDAデコーダは新たに送信された赤外線信号を無視する。USARTが SIRからデータを受信している場合、SIRは USARTからの信号を受け付けない。

USARTから SIR、および SIRから USARTへのレベル論理は異なる。SIRの受信論理では Highレベルが 1、Lowレベルが 0であるが、SIRの送信論理では Highレベルが 0、Lowレベルが 1である。

DMA

USARTモジュールは DMA機能をサポートしており、高速かつ連続的な送受信を実現できる。

DMAが有効な場合、TXEがセットされると、DMAは設定されたメモリ領域から送信バッファへデータを書き込む。

DMAを使用して受信する場合、RXNEがセットされるたびに、DMAは受信バッファ内のデータを設定したメモリ領域へ転送する。

割り込み

USARTモジュールは、以下を含む複数の割り込み要因をサポートしている

割り込みソース 有効ビット
送信データ空 (TXE) TXEIE
送信許可 (CTS) CTSIE
送信完了 (TC) TCIE
受信データあり (RXNE)
オーバーランエラー (ORE)
RXNEIE
アイドル検出 (IDLE) IDLEIE
パリティエラー (PE) PEIE
ブレイク (LBD) LBDIE
ノイズフラグ (NE)
オーバーフロー (ORE)
フレーミングエラー (FE)
EIE

USARTレジスタ

USART1->STATR
USART1->DATAR
USART1->BRR
USART1->CTLR1
USART1->CTLR2
USART1->CTLR3
USART1->GPR
STATR ステータスレジスタ 初期値 0x000000c0
[31:10] RO Reserved
[    9] CTS  RW0 CTS状態変化フラグ        1:nCTS端子変化あり
[    8] LBD  RW0 LINブレイクフラグ        1:ブレイク検出
[    7] TXE  RO  送信データレジスタエンプティフラグ 1:送信データなし
[    6] TC   RW0 送信完了フラグ           1:送信完了
[    5] RXNE RW0 受信データありフラグ      1:受信データあり
[    4] IDLE RO  バスアイドルフラグ        1:アイドル状態
[    3] ORE  RO  オーバーロードエラーフラグ 1:受信データを読み出す前に次のデータを受信した
                 (後から受信したデータは捨てられる)
[    2] NE   RO  ノイズエラーフラグ         1:エラー
[    1] FE   RO  フレーミングエラーフラグ   1:エラー
[    0] PE   RO  パリティエラーフラグ       1:エラー
DATAR データレジスタ 初期値 0x000000xx
[31: 9]         RO Reserved
[ 8: 0] DR[8:0] RW データレジスタ
読み出しは受信データレジスタからの読み出し、書き込みは送信データレジスタへの書き込みになる。
BRR ボーレートレジスタ 初期値 0x00000000
[31:16]                    RO Reserved
[15: 4] DIV_Mantissa[11:0] RW 分周器の整数部
[ 3: 0] DIV_Fraction[3:0]  RW 分周器の小数部
CTLR1 コントロールレジスタ1 初期値 0x00000000
[31:14] RO Reserved
[   13] UE     RW USARTイネーブル
                  0を書いた場合、現在の通信が完了してから動作が停止する
[   12] M      RW データ長設定 0:8bit 1:9bit
[   11] WAKE   RW ウェイクアップ選択 0:バスアイドル 1:アドレスマーカー
[   10] PCE    RW パリティイネーブル
[    9] PS     RW パリティ選択 0:偶数パリティ 1:奇数パリティ
[    8] PEIE   RW パリティエラー割り込みイネーブル
[    7] TXEIE  RW 送信データレジスタ空割り込みイネーブル
[    6] TCIE   RW 送信完了割り込みイネーブル
[    5] RXNEIE RW 受信データあり割り込みイネーブル
[    4] IDLEIE RW バスアイドル割り込みイネーブル
[    3] TE     RW 送信イネーブル
[    2] RE     RW 受信イネーブル
[    1] RWU    RW 受信ウェイクアップ
                  0:レシーバは通常動作モード
                  1:レシーバはサイレントモード
[    0] SBK    RW ブレイク送信ビット
CTLR2 コントロールレジスタ2 初期値 0x00000000
[31:15]           RO Reserved
[   14] LINEN     RW LINモードイネーブル
[13:12] STOP[1:0] RW ストップビット設定
                     00:1    10: 2
                     01:0.5  11: 1.5
                     (設定値の並びが不自然だけれど、STM32も同じなので多分これであっている)
[   11] CLKEN     RW クロックイネーブル
[   10] CPOL      RW クロック極性 0:アイドル時 CK=0 1:アイドル時 CK=1
[    9] CPHA      RW クロック位相 0:最初のCK偏移でデータキャプチャ開始 1:2番目のCK偏移でキャプチャ
[    8] LBCL      RW 最終ビットクロックパルス出力 0:しない 1:する
[    7]           RO Reserved
[    6] LBDIE     RW LINブレイク割り込みイネーブル
[    5] LBDL      RW LINブレイク検出長 0:10bit 1:11bit
[    4]           RO Reserved
[ 3: 0] ADD[3:0]  RW USARTノードアドレス
                     マルチプロセッサ通信で使用する本機のアドレスで、アドレスマークによるウェイクアップに使用される。

CPOL=0, CPHA=0 _____+--+__+--+__
CPOL=0, CPHA=1 __+--+__+--+__+--
CPOL=1, CPHA=0 -----+__+--+__+--
CPOL=1, CPHA=1 --+__+--+__+--+__
                    ^     ^
                    +-----+-- データキャプチャ
CTLR3 コントロールレジスタ3 初期値 0x00000000
[31:11]       RO Reserved
[   10] CTSIE RW CTS割り込みイネーブル
[    9] CTSE  RW CTSイネーブル
[    8] RTSE  RW RTSイネーブル
[    7] DMAT  RW 送信DMAイネーブル
[    6] DMAR  RW 受信DMAイネーブル
[    5] SCEN  RW スマートカードモードイネーブル
[    4] NACK  RW スマートカードNACKイネーブル
[    3] HDSEL RW 半二重モードイネーブル
[    2] IRLP  RW IrDA低電力モードイネーブル(IREN=1の時のみ有効)
[    1] IREN  RW IrDAモードイネーブル
[    0] EIE   RW エラー割り込みイネーブル
                 受信DMA有効 (DMAR=1) のときに通信エラーが発生すると割り込みが発生
CTS (Clear To Send)   送信許可 CTS=0の間、次のデータ送信を一時保留
RTS (Request To Send) 送信要求 USARTが受信可能なら RTS=1 になる
GPR プロテクションタイム/プリスケーラレジスタ 初期値 0x00000000
[31:16]          RO Reserved
[15: 8] GT[7:0]  RW ガードタイム値(スマートカードモード用)
[ 7: 0] PSC[7:0] RW プリスケーラ値
                    IrDA省電力モードでは、ソースクロックがこの値で除算される。
                    通常のIrDAモードでは、1のみ設定可能。
                    スマートカードモードでは、ソースクロックがこの値の 2倍で除算されて
                    スマートカードのクロックとして使われる。(下位 5bitが有効)

この文章のライセンス

CC0 1.0 Universal

2026-02-28作成 2026-03-01更新 佐藤恭一 kyoutan.jpn.org

目次に戻る