こんばんは、ファルコンM です。
PIC のharmony ライブラリを使って、ESP-WROOM-02と通信する方法。
harmony はPIC32bit で使えるライブラリ。
開発環境
- マイコン PIC32MZ0512EFE064
PICのポート設定
- UART TX … PIN45 RD11
- UART RX … PIN44 RD10
- ESP-WROOM-02 の電源 … PIN61 RE1 ( ※ こちらの環境特有 )
プロジェクト作成
MPLAB を立ち上げ File → New Project を選択する。
Categories : Microchip Embedded、Projects : 32-bit MPLAB Harmony Project を選択する。
Project Location にプロジェクトのパス、Project Name にプロジェクト名、Target Device でマイコンを選択する。
Project Name は Test_32bitと入力する。
Target Device は今回使用する PIC32MZ512EFE064 を選択する。
Finish を押すと、プロジェクトが作成される。
Harmony の設定
プロジェクトを作成したら、Harmony のビューが自動的に立ち上がる。立ち上がらないときは、Tools → Eembedded → MPLAB Harmony Configurator を選択する。
Options → MPLAB Harmony & Application Configuration → Device & Project Configuration で PIC32MZ0512EFE064 Device Configuration を選択する。
ここで、コンフィグレーションビットを設定する。
DEVCFG0 で Background Debugger Enable( DEBUG ) をON にする。これを設定しないとデバックができない。
また、ICE\ICD Comm Channel Select を設定する。デバッカとマイコンが繋がるポートを選択。これは、回路図を見て設定する。
私の環境は、デバッカとつなぐピンは PGEC2、PGED2 を使用していたので、ICS_PGx2 とした。
Options → MPLAB Harmony & Application Configuration → Harmony Framework Configuration → Drivers を選択。
USART で上記設定をする。
USART Driver Instance0 にチェックを入れ、Band Rate を115200 に変更しただけ。
PinSettings で設定を変更する。44、45、61 ピンでFunction で選択する。
44ピン U1RX、45ピン U1TX、61ピン GPIO_OUT とした。
61ピンは Name も変更した。Name を変更しないと、コード出力した時、ポート設定の定義が出力されない。
Options → MPLAB Harmony & Application Configuration → Application Configuration を選択。wifi アプリケーションを追加する。
Number of Applications を2とする。
新しく Application 1 Configuration が出るので、Application Name にwifi と入力する。
以上でharmony の設定が完了した。コード生成のボタンを押してコードを生成する。( ↑の写真の左から5番目のボタン。
ソースコード修正
- 起動したら、ESP-WROOM-02 の電源を入れる
- ESP-WROOM-02 から”ready\r\n” を受信したら、起動完了
するだけのプログラム。
以下を修正する。
wifi.h
// enum 追加 typedef enum { WIFI_STATE_START_INIT=0, WIFI_STATE_START_EXE, WIFI_STATE_START_ALLRECEIVE, WIFI_STATE_START_DONE, } WIFI_STATES_START; // WIFI_DATA 構造体にメンバを追加 typedef struct { - 略 - DRV_HANDLE usartHandle; WIFI_STATES_START stateStart; uint8_t idxStartRecv; void (*callbackStart)(); } WIFI_DATA; // 外部関数のプロトタイプ宣言 void WIFI_Initialize ( void ); void WIFI_Start( void (*callback)(void) );
wifi.c
// 定義 #define D_WIFI_READY "ready\r\n" // 内部関数宣言 static void startTasks(void); static void receiveData(const SYS_MODULE_INDEX index); // WIFI_Tasks 関数にコード追加 void WIFI_Tasks ( void ) { - 略 - case WIFI_STATE_SERVICE_TASKS: { startTasks(); // 追加 break; } - 略 - } // 関数追加 void WIFI_Start( void (*callback)(void) ) { if( wifiData.stateStart != WIFI_STATE_START_INIT ) { return; } // USART 開始 wifiData.usartHandle = DRV_USART_Open(DRV_USART_INDEX_0, DRV_IO_INTENT_READWRITE|DRV_IO_INTENT_BLOCKING ); if ( wifiData.usartHandle == DRV_HANDLE_INVALID ) { return; } // 受信コールバック設定 DRV_USART_ByteReceiveCallbackSet(DRV_USART_INDEX_0, receiveData); // コールバック設定 wifiData.callbackStart = callback; wifiData.stateStart = WIFI_STATE_START_EXE; // Wifi モジュール電源ON PowerOn(); return; } static void startTasks(void) { switch(wifiData.stateStart) { case WIFI_STATE_START_ALLRECEIVE: { if( wifiData.callbackStart != NULL ) { wifiData.callbackStart(); } wifiData.stateStart = WIFI_STATE_START_DONE; break; } default: break; } return; } static void receiveData(const SYS_MODULE_INDEX index){ uint8_t data; if(!DRV_USART_ReceiverBufferIsEmpty(wifiData.usartHandle)) { data = DRV_USART_ReadByte(wifiData.usartHandle); if( data == D_WIFI_READY[wifiData.idxStartRecv]) { wifiData.idxStartRecv++; if( wifiData.idxStartRecv >= strlen(D_WIFI_READY)) { wifiData.stateStart = WIFI_STATE_START_ALLRECEIVE; } } } }
app.c
// 内部関数宣言 static void callbackStart(void); // コード追加 void APP_Tasks ( void ) { -略- case APP_STATE_SERVICE_TASKS: { WIFI_Start(callbackStart); break; } -略- } // コールバック関数の追加 static void callbackStart(void) { return; }
以上。このコードを動かせば、wifi モジュールと通信できる。
デバックできない場合は、こちらの記事を参考に。
コメントを残す