TIPS 2016年3月25日

SAMマイコンでUART(SERCOM)を使う

この記事は、SAM D10マイコンでASF(Atmel Software Framework)を使わずにUARTを利用する場合のTipsです。ASFを使う場合にはAT11626が参考になります。

SAMマイコンではUARTのほか、SPIなど、シリアル通信用の機能は「SERCOM」と呼ばれるモジュールにまとめられています。

起動時にはSERCOMモジュールにクロックが供給されていないため、SERCOMを使用することができません。

SERCOMを使用するためにはCOREクロックとAPBクロックの2種類のクロックを有効化する必要があります。COREクロックは通信速度(ボーレート)の基準となるクロックです。APBクロックは、SERCOMのレジスタを書き込み・読み込みするために必要なクロックです。

COREクロックの有効化

SERCOMのCOREクロックは、基本的にGCLK(General Clock)モジュールから供給します。外部のピンから直接COREクロックを供給することもできますが、ここでは省略します。

まず、SERCOMに使うGCLKモジュールのチャンネルを決めて、GCLKモジュールのCLKCTRLレジスタにより、SERCOMにクロックを供給します。

例: GCLK1をSERCOM1のCOREクロックとして利用する設定
GCLK->CLKCTRL.reg = ( 1<<14 ) | (1 << 9) | (0x0F);

APBクロックの有効化

次に、APBクロックを供給するには、PMモジュールのAPBCMASKレジスタにより、利用したいSERCOMモジュールのビットに1を書き込みます。

例: SERCOM1にAPBクロックを供給する場合

PM->APBCMASK.bit.SERCOM1_ = 1;

※APBクロックが供給されないと、SERCOM関連のレジスタに書き込みができません。いくら書き込んでもレジスタの値が変わりません。

ボーレートの設定

UARTのBAUDレジスタに設定する値は、以下の式で求めることができます。

BAUD = 65536 * ( 1 - オーバーサンプリングレート * ボーレート / COREクロック周波数 )

オーバーサンプリングレートはデフォルトでは16固定です。

例:
ボーレート19200bps, COREクロック1MHzの場合
65536 * ( 1 - 16 * 19200 / 1000000 ) = 45403.3408 (丸めて、BAUD=45403)

簡単なエコーバックのコード

#include "sam.h"

uint16_t c;

/** ここでPORTのPMUXによりUARTに使うピンを設定しておきます **/

PM->APBCMASK.bit.SERCOM1_ = 1; // SERCOM1 APBクロック有効化
GCLK->CLKCTRL.reg = ( 1<<14 ) | (0x0F); // GCLK0 -> SERCOM1 COREクロック有効化
SERCOM1->USART.CTRLA.bit.MODE = 1; // 1: 内部からのクロックを使用
SERCOM1->USART.CTRLA.bit.RXPO = 1; // PAD[1] ピンを受信に使用
SERCOM1->USART.CTRLA.bit.TXPO = 0; // PAD[0] ピンを受信に使用
SERCOM1->USART.CTRLA.bit.DORD = 1; // LSB First
SERCOM1->USART.BAUD.bit.BAUD = *****; //ボーレート設定
SERCOM1->USART.CTRLB.bit.TXEN = 1; // 送信有効化
SERCOM1->USART.CTRLB.bit.RXEN = 1; // 受信有効化
SERCOM1->USART.CTRLA.bit.ENABLE = 1; // 全体の有効化

while (1)
{
while( ! (SERCOM1->USART.INTFLAG.bit.RXC) );
c = SERCOM1->USART.DATA.reg;
while( ! (SERCOM1->USART.INTFLAG.bit.DRE) );
SERCOM1->USART.DATA.reg = c;
}

受信が完了するとRXCビットがセットされます。受信データはDATAレジスタから読み出します。
送信するにはDATAレジスタに値を代入します。代入すると自動的に送信されます。
送信の前にはINTFLAGレジスタのDREビットが1になっていることを確認します。

気をつける点

・レジスタの設定をする際には、すべての設定を終えてから、最後にCTRLAのENABLEビットを1にする必要があります。CTRLAのENABLEビットが1になると、ライトプロテクトがかかり、他のレジスタを書き換えることができなくなります。

・SERCOMのUSARTのデフォルト設定では、MSBから先に送信されます。このままですと、'A'などアスキー文字リテラルを送信すると文字化けします。CTRLAレジスタのDORDビットを1にすることで、LSBから先に送信されるようになります。

この記事に関連する商品

この記事をシェア

最近のTIPS