LoginSignup
1
1

More than 5 years have passed since last update.

ATXMEGA シリーズの USART における BSEL と BSCALE をお手軽に算出する方法

Last updated at Posted at 2015-04-05

何かと日本語資料が少ない 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 の指定すべき値とエラー率が一覧表示されます。

スクリーンショット 2015-04-05 10.12.16.png

グリーンのセルは小さいエラーで通信できることを示しています。


例えば、システムクロック 1MHz で、USART を 19.2kbps で使いたいときは、
- BSCALE: -1
- BSEL: 11
- CLK2X: 1
を選択すれば、エラー率 0.16% で通信できるようになることが上の画像からわかります。

USART の初期化のソースコードは以下のような感じでOK。

main.c
#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;
}
1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1