何かと日本語資料が少ない ATXMEGA シリーズの USART に関して。
USART は ATMEGA の USART (UART) と使い方はほぼ同じですが、ATMEGA シリーズとは違い BSCALE (Baud Rate Scale factor) というクロック尺度調整機能がついています。この BSCALE と BSEL (Baud Rate bits) を組み合わせることにより、どんなシステムクロックでも任意のボーレートを設定できるようになっています。
しかし、BSCALE の算出方法はデータシートを見てもいまいちピンときません。avr-gcc のライブラリにもお手軽に USART を使える関数やマクロも見当たらず。
アプリケーションノートを探してみると、なんとエクセルのボーレート計算マクロがありました!
AVR1307: Using the XMEGA USART (pdf, ソースコードやエクセルファイルなどのzip)
この zip の中に Baudrate_Calculations.xls
というファイルがあります。このエクセルファイルを開いて CPU Clock と User Baurate を指定するだけで、 BSCALE, BSEL, CLK2X の指定すべき値とエラー率が一覧表示されます。
グリーンのセルは小さいエラーで通信できることを示しています。
例えば、システムクロック 1MHz で、USART を 19.2kbps で使いたいときは、
- BSCALE: -1
- BSEL: 11
- CLK2X: 1
を選択すれば、エラー率 0.16% で通信できるようになることが上の画像からわかります。
USART の初期化のソースコードは以下のような感じでOK。
#define F_CPU 1000000UL
・・・ 省略 ・・・
void initUsart()
{
// USARTCO, 19.2kbps, -0.16%
// BSCALE:-1, BSEL:11, CLK2X: 1
// Set BSCALE and BSEL
USARTC0_BAUDCTRLA = 11;
USARTC0_BAUDCTRLB = USART_BSCALE3_bm | USART_BSCALE2_bm | USART_BSCALE1_bm | USART_BSCALE0_bm;
// Enable RX,TX and CLK2X
USARTC0_CTRLB = USART_RXEN_bm | USART_TXEN_bm | USART_CLK2X_bm;
// Async, 8bits, non parity-bits, 1stop-bit
USARTC0_CTRLC = USART_CMODE_ASYNCHRONOUS_gc | USART_CHSIZE_8BIT_gc | USART_PMODE_DISABLED_gc;
}