PIC32でUART通信する (MPLAB X Harmony)

スポンサーリンク

PIC32マイコンを使ってUARTで通信する

ちょっとした都合でPIC32を使って、UART通信する必要が出てきたので、そのやり方をメモがてら紹介します。

PICといえばプロアマ問わず、古くから使われる有名マイコンで、情報も溢れています。

しかし、最新のPICで推奨されているHarmonyと呼ばれるFrameworkの情報はあまり出回っていない(古い情報が多すぎて見つけにくい)ので、単純なUART通信をするにもなかなか難しい面があるようです。

ちなみに、今回使用したPICはPIC32MX220F032Bという型番のものです。

秋月などでDIPパッケージとして1つ300円以下で売られているため、ブレッドボードやユニバーサル基板等でちょいと試すのに最適です。

秋月 PIC32MX220F032B : http://akizukidenshi.com/catalog/g/gI-05852/

開発環境の準備

MPLAB X IDE

今回使用するIDEは、Microchip(PICを作っているメーカー)OfficialのMPLAB Xになります。

手元で試したのはv4.20です。いま確認したところ、最新版のv5.0も出ているようです。

Windows, Mac, Linuxそれぞれに用意されており、以下からダウンロードできます。

http://www.microchip.com/mplab/mplab-x-ide

(ページ下部のDownloadタブを選択)

MPLAB XC Compiler

コンパイラですが、こちらもOfficialのMPLAB XC Compilerを使用します。

以下からIDEと同様にダウンロードできます。

http://www.microchip.com/mplab/compilers

MPLAB Harmony

最新のPIC用SW開発フレームワークであるHarmonyを使用するには、別途ダウンロード&インストールが必要です。

以下から同様にダウンロードできます。

http://www.microchip.com/mplab/mplab-harmony

MPLAB Harmoney Configurator (MPLAB X IDE Plugin)

Harmonyを使用するには、MPLAB X IDEにHarmony用のPluginをダウンロードする必要があります。

MPLAB X IDEを起動して、メニューからTools->Pluginを選択します。

検索BOXで”Harmony”と検索すると、Harmony Configuratorが出てくるので、そちらをインストールします。

Harmonyによるソースコードの自動生成

ここまでくると、事前準備は完了です。

Harmonyでは、Configuratorを使って諸々の設定をすると、簡単にコーディングをするためのソースコードが自動生成されるようになっています。

MPLAB X IDEのメニューから、Tools->Embedded->MPLAB Harmony Configuratorを選択します。

ここでHarmonyのインストール先を聞かれた場合は、先ほどインストールしたHarmonyのインストール場所を指定してください。

起動すると、以下のような画面が出てきます。

Optionsタブで、UART通信のための設定をしていきます。

ボーレートやパリティビットなどについては通信仕様に従って設定してください。

次に、Pin DiagramタブでUART通信に使用するピンを指定してきます。

ピンをクリック->U1TX, U1RXを選択し、送信・受信用ピンを指定してください。

なお、OptionでUSART Module IDを2にした場合は、U2TX, U2RXになります。

これで設定は完了です。Configurator上部のGenerate Codeボタンを押しましょう。

通信用のソースコード編集

コード自動生成を行うと、プロジェクトにファイルが複数追加されるかと思います。

SWの中心となるのは、app.cというソースコードになります。

OfficialのTutorialでは、UART通信をするのに別のソースコードも編集することになるのですが、(割り込み部分)

今回紹介するのはapp.c内で完結する手順になります。ただし、pollingではなくきちんと割り込みによる通信を行います。

以下、ひとつずつポイントを紹介してきます。

最後にapp.c全体のソースコードも貼っておきますので、参考にしてください。

UARTのOpen

まず、起動時にUARTをOpenする必要があります。

まず、Global変数として以下を宣言します。

DRV_HANDLE myUSARTHandle;

起動時に呼ばれるAPP_Initializeで、UARTをオープンします。

myUSARTHandle = DRV_USART_Open(DRV_USART_INDEX_0, DRV_IO_INTENT_EXCLUSIVE);

受信時の割り込み設定

データを受信した際の割り込み設定と、割り込み時に呼ばれる関数を設定します。

まず、受信時に呼ばれる関数を定義します。

void APP_USARTReceiveEventHandler ( const SYS_MODULE_INDEX index )
{
while(1) {
char c = DRV_USART_ReadByte(myUSARTHandle);
PutCharacter(‘a’);
if(DRV_USART_ReceiverBufferIsEmpty(myUSARTHandle)) {
break;
}
}
}

受信した際に、DRV_USART_ReadByte(myUSARTHandle)でデータを1バイト読み込み、PutCharacter関数で、’a’という文字をUARTで再度送信しています。

何か他の処理をしたい場合はここに追記してください。

if(DRV_USART_ReceiverBufferIsEmpty(myUSARTHandle))というif文で、UART Bufferの中が空になるまで処理を繰り返しています。

PutCharacter関数は自分で定義した関数なのですが、こちらは送信部分の説明で詳細を示します。

最後に、UART割り込み発生時に上記の関数を呼び出すように、登録をします。

以下をAPP_Initialize内に追記してください。

DRV_USART_ByteReceiveCallbackSet(DRV_USART_INDEX_0, APP_USARTReceiveEventHandler);

UART送信

データを送信する処理は、受信時にも使用したPutCharacterという関数を例として示します。

以下のような関数を定義すると、呼び出す度にに指定したchar1バイトをUARTで送信します。

bool PutCharacter(const char character) {
if (PLIB_USART_TransmitterIsEmpty(USART_ID_1)) {
PLIB_USART_TransmitterByteSend(USART_ID_1, character);
return true;
} else {
return false;
}
}

受け取ったchar型の変数をPLIB_USART_TransmitterByteSend関数で送信します。

この例では、if (PLIB_USART_TransmitterIsEmpty(USART_ID_1))で、送信できる状態かを判断し、Empty出ない場合は送信しないような処理にしています。

ソース全文

最後に、少し長いですが、実際のapp.cのソースを貼ってしまいます。

スポンサーリンク