Skip to content

USART_BAUD

askn37 edited this page Sep 27, 2026 · 4 revisions

USART 分数ボーレート発生器

非同期動作モード

USART を 非同期動作(CMODE_ASYNCHRONOUS)に設定した場合、EVSYS の USARTn_XCK チャネルを通じて、USARTn_BAUD に指定した 分数ボーレート発生器(USART Fractional Baud Rate Generator)の発生周波数を、直接観測することができる。

EVSYS_CHANNEL0 = EVSYS_CHANNEL0_USART0_XCK_gc;
EVSYS_USEREVSYSEVOUTF = EVSYS_USER_CHANNEL0_gc; /* Opt: PIN_PF2 */

PORTMUX_USARTROUTEA |= PORTMUX_USART0_NONE_gc;  /* Opt: Not connected to any pins */
USART0_BAUD = 64;
USART0_CTRLC = USART_CMODE_ASYNCHRONOUS_gc; /* default */
USART0_CTRLB = USART_TXEN_bm | USART_ODME_bm;

USARTn_BAUD の設定値は、F_CPU(CLK_PER)に対する 分周比として機能する。

$$ Period = \frac{BAUD}{32} $$

$$ Freq = \frac{CLK_{PER} \times 32 }{BAUD} $$

BAUD Period
64 1/2
96 1/3
128 1/4
256 1/8
: :
16384 1/512
32768 1/1024
0 1/2048

言い換えると、1周期を X us と等しくするには (X * F_CPU * 32 / 1e6) を USARTn_BAUD に与えれば良い。

  • RXMODE_NORMAL、RXMODE_CLK2X の別に関わらず、生成される周波数は同一。これは USART 目標ボーレートに対して、標準速(RXMODE_NORMAL)の 8倍、倍速(RXMODE_CLK2X)の 4倍に等しい。
  • 有効な最小値は64だが、0については65536として扱われる。
  • 割り切れずに残った剰余は、次以降の発生パルスに対して、CLK_PER の粒度で均等に分散され、平均化される。
  • RXMODE_GENAUTOおよびRXMODE_LINAUTOの場合は、自動採取により決定された周波数となる。

希少な USART 周辺機能ではあるが、この Hack は以下の用途を満たすことができる。

  • 設定中の USART ボーレートを、外部から観測/測定することで正確に知ることができる。通電現示 LED の駆動(Duty比1:1)を兼ねても良い。
  • TCA や TCB に代えて、CLK_PER/2 から CLK_PER/2048 範囲の、任意精度の周波数発生器/事象イベント発生器として利用できる。

同期動作モード

USART を 同期動作(CMODE_SYNCHRONOUS)にした場合、USARTn_XCK 事象イベントは次のように観測される。

  • USARTn_XCKピンに対応する PORTx.DIR ビットをセットしなければ、事象イベントは発生しない。
  • 事象イベントの発生周波数は 非同期モードと同様であるが、USARTn_BAUD の少数部 6-bit は無視される。

分周比は以下の USARTn_BAUD ビットに対応する累積結果に等しい。

MSB 15 14 13 12 11 10 9 8 7 6
Clock 1024 512 256 128 64 32 16 8 4 2
  • ただし 全ビットが 0 なら 2048 と解釈される。

詰まるところ、16-bit TCA/TCE を DIV2 かつ SINGLESLOPE 動作とした時の PER+1 値に等しい。

主装置SPI動作モード

USART を 主装置SPI動作(USART_CMODE_MSPI)にした場合、USARTn_XCK 事象イベントは次のように観測される。

  • 事象イベントの発生周波数は 同期モードと同様で、USARTn_BAUD の少数部 6-bit は無視される。
  • 事象イベントは USARTn_TXDATA 送信中のみ生成される。つまり 1-byte 送信する毎に 必ず 8 パルスずつ生成される。出力ポートは存在しなくても良い。
  • 事象イベントの論理は(USARTn_CTRLC の) UCPHA ビットで定まる。これが 1 なら HIGH が先行、0 なら LOW が先行する。

SPIn周辺機能との違いは、そちらが CLK_PER に対する分周比が "2,4,8,16,32,64,128" の 6通りしか選択できないのに対し、こちらは 2 から 2048 範囲の任意の(1024通りの)偶数倍分周比を選択できることにある。

LINKS

multix.jp/てくにかるむ(休眠中)
Multix Zinnia Product SDK [*AVR]
AVR.JP(日本語訳)
AVR-LIBC(日本語訳)

Clone this wiki locally