概要
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 | - | - | |
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 | - | - | - | - | |
1000000 | $7000 | $8000 | $A000 | $C000 | $E000 | |
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
BlueSky Social: @multix.jp
GitHub: https://github.com/askn37/
Product: https://askn37.github.io/
Copyright (c) askn (K.Sato) multix.jp
Released under the MIT license
https://opensource.org/licenses/mit-license.php
https://www.oshwa.org/