Repository navigation
USART_BAUD
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)に対する 分周比として機能する。
| 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値に等しい。
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通りの)偶数倍分周比を選択できることにある。
Twitter(X): @askn37
BlueSky Social: @multix.jp
GitHub: https://github.com/askn37/
Product: https://askn37.github.io/
Copyright (c) 2026 askn (K.Sato) multix.jp
Released under the MIT license
https://opensource.org/licenses/mit-license.php
https://www.oshwa.org/
multix.jp/てくにかるむ(休眠中)
Multix Zinnia Product SDK [*AVR]
AVR.JP(日本語訳)
AVR-LIBC(日本語訳)