前回のブログではクロックを設定してLチカするところまで紹介しました。
今回はUARTの設定をしてデバッグ用にテキストメッセージをPCに送れるようにしていきたいと思います。
MPLAB Harmony 3 Configurator上での設定
SAMマイコンでは、serial communication interface (SERCOM)モジュールが用意されており、I2C, SPI, USARTのいずれかに割り当てることができるようになっています。
今回はSERCOM0をUARTの機能に割り当てていこうと思います。
いつも通りMPLAB X IDEを開いたあとに、Tools->Embedded>MPLAB Harmony 3 Configuratorを開きます。
右側のAvailable ComponentsからSERCOM0ドラッグしてProject Graphに移動し、右のように設定しました。
標準出力の出力先をUARTにしたい場合は右側からSTDIOも同様にドラッグして、SERCOM0のUARTと線で接続しておきます。
次にSERCOM0のピンを割り当てていきます。Tools>Pin Configurationから設定を開きます。
タブでPin Diagram, Pin Table, Pin Settingを切り替えることができます。どこから設定しても反映されますが、まずはPin Tableから設定可能なピンを確認するのがわかりやすいと思います。
行が機能、列がピンになっており、青色部分が設定可能な位置です。選択すると緑になり、同じ行の他の位置はグレーアウトします。
今回はSERCOMをUARTとして使うので最低限TXとRXに必要なSERCOM_PAD[0]と[1]をピン番号26,27に設定しました。
Pin Settingを確認すると以下のようにFunctionがSERCOM_xxxに変わっていることが確認できます。オリジナルの名前を設定したい場合はPin SettingのCustom Nameに入れることで変更可能です。
Pin Diagramも設定した部分のピン番号26,27が緑色になり、表示がSERCOM_xxxになっています。
これに対応するように回路図の該当部分もUARTのTXとRXを接続しました。
最後にTools>Clock Configurationからクロック設定を確認しておきます。Peripheral Clock Configurationをクリックして開き、SERCOM_COREの有効化されていることを確認しました。
今回はクロックソースはそのままにしてあります。
ここまででGUIから設定は完了です。
いつも通りコード生成して保存して終了します。
Hello, World!
前回のコードを流用してmainのコードを以下のように変更しました。
500msごとにメッセージを送信します。
uint8_t buffer[]= "Hello World!\r\n"; int main ( void ) { /* Initialize all modules */ SYS_Initialize ( NULL ); SysTick->LOAD = 120000 - 1; SysTick->VAL = 0; SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk; uint32_t time = 0; LED0_Set(); LED1_Set(); LED2_Set(); while ( true ) { /* Maintain state machines of all polled MPLAB Harmony modules. */ SYS_Tasks ( ); if(SysTick->VAL != 0 && SysTick->CTRL & SysTick_CTRL_COUNTFLAG_Msk) { time++; } if(time > 500) { SERCOM0_USART_Write(&buffer[0], sizeof(buffer)); printf("Message from printf.\r\n"); LED0_Toggle(); LED1_Toggle(); LED2_Toggle(); time = 0; } } /* Execution should not come here during normal operation */ return ( EXIT_FAILURE ); }
SERCOM0_USART_Writeは直接SERCOMの機能を使っています。
printfでの標準出力への送信と送信先は同じです。
TeraTermなどの適当なシリアルモニタで受信すると以下のように表示されます。
今回のブログはここまでです。
UARTを設定したので簡単なprintfデバッグができるようになりました。
今の設定だとブロッキングで送っているので処理時間に注意する必要があります。今後他の設定も試していきたいなと思います。
また、printf自体もマイコンで使用する場合、時間もメモリもそれなりにかかるので組み込みでは注意した方が良い場合もあるかもしれません。皆さんChanさんのxprintfとか使ってるのかなぁとか思っているのですが、どうされている方が多いんですかね。おすすめあれば教えていただけると嬉しいです。
参考資料
Microchip, Creating a “Hello World” Application on SAM Microcontrollers Using Harmony 3 MPLAB Harmony Configurator (MHC)
http://ww1.microchip.com/downloads/en/DeviceDoc/Creating_Hello_World_%20Application_on_SAM_Using_MHC_DS90003231A.pdf