[modernAVR] USART BAUD レジスタ設定値早見表

## 概要

modernAVR 世代の USART周辺機能は、分数ボーレート発生器を持っている。対応する設定レジスタ`USARTn.BAUD` は、10ビットの整数部と、6ビットの小数部を持つ。自ずと設定可能な最小値と上限値があり、設定可能なボーレート`F_BAUD`は CPU動作クロック `F_CPU` に依存して左右される。この記事は設定可能な計算済の主だった `BAUD`数値を列挙したものだ。

`BAUD`設定値は、USART周辺機能の使用動作によって算出方法が異なり、以下の三種類がある。

- 非同期標準速動作
- 非同期倍速動作
- 同期主装置動作

なお USART周辺機能は SPI主装置SPI動作で使うこともできるが、この場合は同期主装置動作の設定値を使用する。

同期動作従装置を選択した場合、`USARTn.BAUD`は使用されない。また非同期自動ボーレート従装置動作を選択した場合、`USARTn.BAUD`は採取された最新値を記憶するのに使用される。

## F_CPU

modernAVR 世代は、内蔵高速 OSCHFの種類によって、以下の2系統に分かれる。

- 20MHz/16MHz系統 - tinyAVR-0/1/2、megaAVR-0、AVR-EA、AVR-EB
- 24Mhz系統 - AVR-DA、AVR-DB、AVR-DD、AVR-DU

前者の系統は FUSE設定によって、最高20MHz または 16Mhz いずれかの OSCHFを選択できる。それに対する分周比を 1、2、4、6、8、10、16、24、32、48、64 から選択できる。起動時の規定分周比は 6なので、起動時の規定動作速度は 2.66MHz または 3.33MHz である。

後者の系統の OSCHFは 1MHz、2MHz、3MHz、4MHz、8MHz、12MHz、16Mhz、20Mhz、24Mhz、さらに非推奨オーバークロックだが 28MHz、32MHz から基準周波数を選び、これに 1、2、4、6、8、10、16、24、32、48、64 から分周比を選んで掛け合わせることができる。起動時の規定動作速度は 4MHz である。

いずれの規定動作速度も旧来の AVRの 1MHzより高速で、OSCHF設定を変更しなくとも 115200bps の UART速度を確保できるため、ブートローダーの規定速度はこのボーレートであることが普通だ。一方でそれ以上ブートローダーを高速化するには、OSCHF設定変更は必須である。

なおどの系統でも、32768Hz の XSOC低速基準周波数を選ぶことができ、それに分周比を掛けることで 512Hz の超低速動作を実現可能だが、この速度で UART を扱うのは非実用的なため、ここでは論じない。

## 誤差調整範囲

一般的な 8N1 フレームでは、フレーム長は 10bitであることからボーレートの最大許容誤差は ±2%以内（累積誤差がその10倍になる）であり、これを超えると非同期動作は脱調する可能性が高まる。しかし分数ボーレート発生器の小数部は 6ビットであるため、特に高速度域では調整速度が荒くなってしまう。これを超える誤差の吸収には、F_CPU を生成する OSCHF自体の校正機能（1/1024=0.097%精度）を使用しなければならない。

## OSC誤差校正バイト

主に20MHz/16MHz動作系統の、一部の modernAVRは OSC誤差校正バイトを持っている。

> `OSC16ERR3V` `OSC16ERR5V` `OSC20ERR3V` `OSC20ERR5V` など

これらの校正バイトは OSCHFに対する 1/1024精度の増減値を保持しているが、分数ボーレート発生器は 1/64精度でしかないことから、その使用は適していない。必要であれば前述のように OSCHF自体の校正機能（1/1024精度）を使用すべきである。

## UART 非同期標準速動作

非同期標準速動作での BAUDレジスタ設定値は以下の式で求められる。

`BAUD = floor( (64 * F_CPU) / (16 * F_BAUD) + 0.5 )`

ただし、

`0x40 <= BAUD < 0x10000`

である。従って F_CPUに対する F_BAUDの数値範囲は

`F_CPU/16384 < F_BAUD <= F_CPU/16`

であると換言できる。

|F_BAUD|1M|2M|2.66M|3M|3.33M|4M|
|-:|-:|-:|-:|-:|-:|-:|
|300|$3415|$682B|$8AE4|$9C40|$AD9C|$D055
|600|$1A0B|$3415|$4572|$4E20|$56CE|$682B
|1200|$D05|$1A0B|$22B9|$2710|$2B67|$3415
|2400|$683|$D05|$115C|$1388|$15B4|$1A0B
|4800|$341|$683|$8AE|$9C4|$ADA|$D05
|9600|$1A1|$341|$457|$4E2|$56D|$683
|19200|$D0|$1A1|$22C|$271|$2B6|$341
|38400|$68|$D0|$116|$139|$15B|$1A1
|57600|$45|$8B|$B9|$D0|$E7|$116
|76800|-|$68|$8B|$9C|$AE|$D0
|115200|-|$45|$5D|$68|$74|$8B
|230400|-|-|-|-|-|$45
|460800|-|-|-|-|-|-
|921600|-|-|-|-|-|-
|250000|-|-|-|-|-|$40
|500000|-|-|-|-|-|-

|F_BAUD|5M|6M|7M|8M|10M|12M|
|-:|-:|-:|-:|-:|-:|-:|
|300|-|-|-|-|-|-
|600|$8235|$9C40|$B64B|$D055|-|-
|1200|$411B|$4E20|$5B25|$682B|$8235|$9C40
|2400|$208D|$2710|$2D93|$3415|$411B|$4E20
|4800|$1047|$1388|$16C9|$1A0B|$208D|$2710
|9600|$823|$9C4|$B65|$D05|$1047|$1388
|19200|$412|$4E2|$5B2|$683|$823|$9C4
|38400|$209|$271|$2D9|$341|$412|$4E2
|57600|$15B|$1A1|$1E6|$22C|$2B6|$341
|76800|$104|$139|$16D|$1A1|$209|$271
|115200|$AE|$D0|$F3|$116|$15B|$1A1
|230400|$57|$68|$7A|$8B|$AE|$D0
|460800|-|-|-|$45|$57|$68
|921600|-|-|-|-|-|-
|250000|$50|$60|$70|$80|$A0|$C0
|500000|-|-|-|$40|$50|$60
|1000000|-|-|-|-|-|-

|F_BAUD|14M|16M|20M|24M|28M|32M|
|-:|-:|-:|-:|-:|-:|-:|
|300|-|-|-|-|-|-
|600|-|-|-|-|-|-
|1200|$B64B|$D055|-|-|-|-
|2400|$5B25|$682B|$8235|$9C40|$B64B|$D055
|4800|$2D93|$3415|$411B|$4E20|$5B25|$682B
|9600|$16C9|$1A0B|$208D|$2710|$2D93|$3415
|19200|$B65|$D05|$1047|$1388|$16C9|$1A0B
|38400|$5B2|$683|$823|$9C4|$B65|$D05
|57600|$3CC|$457|$56D|$683|$798|$8AE
|76800|$2D9|$341|$412|$4E2|$5B2|$683
|115200|$1E6|$22C|$2B6|$341|$3CC|$457
|230400|$F3|$116|$15B|$1A1|$1E6|$22C
|460800|$7A|$8B|$AE|$D0|$F3|$116
|921600|-|$45|$57|$68|$7A|$8B
|250000|$E0|$100|$140|$180|$1C0|$200
|500000|$70|$80|$A0|$C0|$E0|$100
|1000000|-|$40|$50|$60|$70|$80
|2000000|-|-|-|-|-|$40
|2500000|-|-|-|-|-|-

> `USARTn.BAUD`レジスタの既定値は 0x0000なので、設定値が 0xFF 以下であるなら下位バイトを書き換えるだけで良い。

## UART 非同期倍速動作

非同期倍速動作での BAUDレジスタ設定値は以下の式で求められる。

`BAUD = floor( (64 * F_CPU) / (8 * F_BAUD) + 0.5 )`

ただし、

`0x40 <= BAUD < 0x10000`

である。従って F_CPUに対する F_BAUDの数値範囲は

`F_CPU/8192 < F_BAUD <= F_CPU/8`

であると換言できる。

|F_BAUD|1M|2M|2.66M|3M|3.33M|4M|
|-:|-:|-:|-:|-:|-:|-:|
|300|$682B|$D055|-|-|-|-
|600|$3415|$682B|$8AE4|$9C40|$AD9C|$D055
|1200|$1A0B|$3415|$4572|$4E20|$56CE|$682B
|2400|$D05|$1A0B|$22B9|$2710|$2B67|$3415
|4800|$683|$D05|$115C|$1388|$15B4|$1A0B
|9600|$341|$683|$8AE|$9C4|$ADA|$D05
|19200|$1A1|$341|$457|$4E2|$56D|$683
|38400|$D0|$1A1|$22C|$271|$2B6|$341
|57600|$8B|$116|$172|$1A1|$1CF|$22C
|76800|$68|$D0|$116|$139|$15B|$1A1
|115200|$45|$8B|$B9|$D0|$E7|$116
|230400|-|$45|$5D|$68|$74|$8B
|460800|-|-|-|-|-|$45
|921600|-|-|-|-|-|-
|250000|-|$40|$55|$60|$6B|$80
|500000|-|-|-|-|-|$40
|1000000|-|-|-|-|-|-

|F_BAUD|5M|6M|7M|8M|10M|12M|
|-:|-:|-:|-:|-:|-:|-:|
|300|-|-|-|-|-|-
|600|-|-|-|-|-|-
|1200|$8235|$9C40|$B64B|$D055|-|-
|2400|$411B|$4E20|$5B25|$682B|$8235|$9C40
|4800|$208D|$2710|$2D93|$3415|$411B|$4E20
|9600|$1047|$1388|$16C9|$1A0B|$208D|$2710
|19200|$823|$9C4|$B65|$D05|$1047|$1388
|38400|$412|$4E2|$5B2|$683|$823|$9C4
|57600|$2B6|$341|$3CC|$457|$56D|$683
|76800|$209|$271|$2D9|$341|$412|$4E2
|115200|$15B|$1A1|$1E6|$22C|$2B6|$341
|230400|$AE|$D0|$F3|$116|$15B|$1A1
|460800|$57|$68|$7A|$8B|$AE|$D0
|921600|-|-|-|$45|$57|$68
|250000|$A0|$C0|$E0|$100|$140|$180
|500000|$50|$60|$70|$80|$A0|$C0
|1000000|-|-|-|$40|$50|$60
|2000000|-|-|-|-|-|-

|F_BAUD|14M|16M|20M|24M|28M|32M|
|-:|-:|-:|-:|-:|-:|-:|
|300|-|-|-|-|-|-
|600|-|-|-|-|-|-
|1200|-|-|-|-|-|-
|2400|$B64B|$D055|-|-|-|-
|4800|$5B25|$682B|$8235|$9C40|$B64B|$D055
|9600|$2D93|$3415|$411B|$4E20|$5B25|$682B
|19200|$16C9|$1A0B|$208D|$2710|$2D93|$3415
|38400|$B65|$D05|$1047|$1388|$16C9|$1A0B
|57600|$798|$8AE|$ADA|$D05|$F31|$115C
|76800|$5B2|$683|$823|$9C4|$B65|$D05
|115200|$3CC|$457|$56D|$683|$798|$8AE
|230400|$1E6|$22C|$2B6|$341|$3CC|$457
|460800|$F3|$116|$15B|$1A1|$1E6|$22C
|921600|$7A|$8B|$AE|$D0|$F3|$116
|250000|$1C0|$200|$280|$300|$380|$400
|500000|$E0|$100|$140|$180|$1C0|$200
|1000000|$70|$80|$A0|$C0|$E0|$100
|2000000|-|$40|$50|$60|$70|$80
|2500000|-|-|$40|$4D|$5A|$66
|3000000|-|-|-|$40|$4B|$55
|4000000|-|-|-|-|-|$40
|5000000|-|-|-|-|-|-

> 最小値の 0x40 に対してキャリブレーション校正を適用すると下限を割り込む場合がある。

## USART 同期主装置動作

同期主装置動作では、SPI通信と同様に主装置の XCK信号出力（つまり3線式）で 従装置側の USART送受信部を直接駆動できるため、以下の利点がある。

- 非同期動作では達成できない高速通信
- 従装置側の速度設定が不要で、対応速度範囲は F_CPUにのみ制限される

同期動作での BAUDレジスタ設定値は以下の式で求められる。得られた値はレジスタの10ビット整数部に与えなければならない。

`BAUD[15-6] = floor( (64 * F_CPU) / (2 * F_BAUD) + 0.5 )`

つまり

`BAUD = floor( (64 * F_CPU) / (2 * F_BAUD) + 0.5 ) * 64`

ただし、

- BAUDの小数部（bit[5-0]）は設定できず、常にゼロとしなければならない
- F_BAUDは F_CPUの 1/4以下でなければならない

という制約があるため設定可能ボーレート範囲は、

`F_CPU/32 < F_BAUD <= F_CPU/4`

である。これは高速通信は得意だが、低速側は苦手なことを意味する。

よって設定可能数値は、0x2000未満では F_CPU/4 より早くなってしまうため、

`0x2000 <= BAUD < 0x10000` (BAUDの下位6ビットはゼロ固定)

に限られる。

> つまるところ選択可能な F_CPU に対する代表的な速度比は（設定可能な F_CPU値を割り切れる） 1/4、1/5、1/8、1/10、1/16、1/20、1/25 のいずれかになるだろう。一部の F_CPU 値では 1/15、1/30 等でも割り切れる。

|F_BAUD|1M|2M|2.66M|3M|3.33M|4M|
|-:|-:|-:|-:|-:|-:|-:|
|19200|-|-|-|-|-|-
|38400|$D040|-|-|-|-|-
|57600|$8B00|-|-|-|-|-
|76800|$6840|$D040|-|-|-|-
|115200|$4580|$8B00|$B940|$D040|$E780|-
|230400|$22C0|$4580|$5C80|$6840|$73C0|$8B00
|460800|-|$22C0|$2E40|$3400|$39C0|$4580
|921600|-|-|-|-|-|$22C0
|250000|$2000|$4000|$5540|$6000|$6AC0|$8000
|500000|-|$2000|$2AC0|$3000|$3540|$4000
|1000000|-|-|-|-|-|$2000
|2000000|-|-|-|-|-|-

|F_BAUD|5M|6M|7M|8M|10M|12M|
|-:|-:|-:|-:|-:|-:|-:|
|115200|-|-|-|-|-|-
|230400|$AD80|$D040|$F300|-|-|-
|460800|$56C0|$6840|$7980|$8B00|$AD80|$D040
|921600|$2B80|$3400|$3CC0|$4580|$56C0|$6840
|250000|$A000|$C000|$E000|~~$10000~~|-|-
|500000|$5000|$6000|$7000|$8000|$A000|$C000
|1000000|$2800|$3000|$3800|$4000|$5000|$6000
|2000000|-|-|-|$2000|$2800|$3000
|2500000|-|-|-|-|$2000|$2680
|3000000|-|-|-|-|-|$2000
|4000000|-|-|-|-|-|-

|F_BAUD|14M|16M|20M|24M|28M|32M|
|-:|-:|-:|-:|-:|-:|-:|
|230400|-|-|-|-|-|-
|460800|$F300|-|-|-|-|-
|921600|$7980|$8B00|$AD80|$D040|$F300|-
|250000|-|-|-|-|-|-
|500000|$E000|~~$10000~~|-|-|-|-
|1000000|$7000|$8000|$A000|$C000|$E000|~~$10000~~
|2000000|$3800|$4000|$5000|$6000|$7000|$8000
|2500000|$2CC0|$3340|$4000|$4CC0|$5980|$6680
|3000000|$2540|$2AC0|$3540|$4000|$4AC0|$5540
|4000000|-|$2000|$2800|$3000|$3800|$4000
|5000000|-|-|$2000|$2680|$2CC0|$3340
|6000000|-|-|-|$2000|$2540|$2AC0
|7000000|-|-|-|-|$2000|$2480
|8000000|-|-|-|-|-|$2000

なお AVR-DUシリーズでは USB周辺機能を併用する場合 F_CPU 値を 最小12MHz から 20MHz（推奨）で使用しなければならないため、実用的な USART同期速度は 500kbpsから 5Mbps のあたりに限られる。

> AVR64DU28/32の初期ロットには 最高速20MHzまでしか動作保証がされない不具合（Eratta）がある。

## Copyright and Contact

Twitter(X): [@askn37](https://twitter.com/askn37) \
BlueSky Social: [@multix.jp](https://bsky.app/profile/multix.jp) \
GitHub: [https://github.com/askn37/](https://github.com/askn37/) \
Product: [https://askn37.github.io/](https://askn37.github.io/)

Copyright (c) askn (K.Sato) multix.jp \
Released under the MIT license \
[https://opensource.org/licenses/mit-license.php](https://opensource.org/licenses/mit-license.php) \
[https://www.oshwa.org/](https://www.oshwa.org/)