UMEHOSHI ITA TOP PAGE COMPUTER SHIEN LAB
[UMEHOSHI ITA]の制御で使っているIC「PIC32MX270F256B-I/SO」のフラッシュメモリには、テスト用プログラムが書き込まれいています。
このプログラムを「テスト・ウメ・フラッシュ」と呼ぶことにしていますが、
以下でこのソースファイルを解説します。
なお、
「テスト・ウメ・フラッシュ」を利用したユーザー用のプログラムを
「ウメ・エディットプログラム」と呼ぶことにします。
この「ウメ・エディットプログラム」で利用可能なマクロは、
こちらで紹介しています。
また、
[UMEHOSHI ITA]基板内のテスト用プログラム内部を利用する例は、こちらを参照してください。
以下で[UMEHOSHI IT] 基板のテスト用プログラム(「テスト・ウメ・フラッシュ」)の情報を公開し説明します。
この基板のテスト用プログラムは、このリンクで示す[test_ume]のプロジェクトの続きととして、作られたものです。
上記リンクの中で紹介した「my_app.c」を、『後述のmy_app.c』に置き換えてください。
(これにより、単なるエコープログラムから仕様を拡張しています。)
この変更に伴い、main.c 、app.c 、app.h も変更しています。
プロジェクトにの各ソースは以下の内容になっています。 (プログラムの変遷)
このページから始まって、
CDCのプログラミングを行ったこのページの作品や、
続けて 上記のソースを使ってビルドした場合、
USB のVender IDは「0x04D8」で、Prodact IDは 0x000Aになっております。
よってumehoshiアプリを使う場合は、
Prodact IDは 0x000Aを使ってください。
この「Prodact IDの 0x000A」は、
マイクロチップテクノロジー社の CDC RS-232エミュレーションデモ用なので、 商品用に使うことはできません。
これはご自身の趣味や実験用として、ご自身の責任において使えるIDです。
商品用に使う場合は、別途にMicrochip社のサブライセンスを受けられるか、USB-IFに申請しして ベンダーIDを入手する必要があります。
(ご自身でビルドする場合、「テスト・ウメ・フラッシュ」で使っている「Vender ID:0x04D8、Prodact ID:0xEC27」は、
使わないでください。
これはMicrochip社のサブライセンスを受けたものだからです。)
int main ( void ) { init_main();// my_sys.c // この内部で、init_handle_area()を呼び出しでハンドラテーブルと、ユーザRAMエリア初期( _handle_user_set_func()) /* Initialize all MPLAB Harmony modules, including application(s). */ SYS_Initialize ( NULL ); init_interrupt();// my_sys.c (ユーザRAMエリアからの呼び出しも行う)_init_sub_func() while ( true ) { /* Maintain state machines of all polled MPLAB Harmony modules. */ SYS_Tasks ( ); } /* Execution should not come here during normal operation */ return ( EXIT_FAILURE ); }以下がmain()の概要で、この順番で進みます。
[UMEHOSHI ITA]の制御で使っているIC「PIC32MX270F256B-I/SO」のフラッシュメモリには、
テスト用プログラムが書き込まれいています。
このプログラムを「テスト・ウメ・フラッシュ」と呼び、
これを利用したユーザー用のプログラムを「ウメ・エディットプログラム」と呼んでいます。
「テスト・ウメ・フラッシュ」には、デフォルトで
コアタイマ、Timer1,2,PWM,ADCとTimer3,Timer4,5,UARTに関する処理が埋め込まれ、
この呼び出しアドレスをRAM領域に登録しているのがinit_main()です。
そして、起動時にこの処理を呼び出してデバイスなどを初期化しているのが
init_interrupt() です。
APP_Tasks()は、mainループ内のSYS_Tasks ( )『:system_config/defalt/framework/system_tasks.c』内から呼び出されており、
このAPP_Tasks関数の呼び出し(SYS_Task内容)は、「MPLAB Harmony」のコード自動生成を利用したものです。
『app.h』で「MPLAB Harmony」利用者用の構造体「APP_DATA」が定義され、
この変数appDataが『app.c』で定義されて、
この変数の状態に応じた状態遷移が、APP_Tasksで行われてプログラムが進行するスタイルになっています。
APP_Tasks()関数内では、変数appData.stateで場合に応じたcaseの分岐が行われます。
そして、「テスト・ウメ・フラッシュ」ではこの関数内switch分岐のdefault:で、
_my_app_tasks(); のマクロ呼び出しに変更しています。
そして、このマクロからMy_APP_Tasks()『:my_app.c』を呼び出して、
USBなどの中心的処理が行っています。
(マクロ呼び出しの関数は後述するMy_APP_Tasks_Through()『:my_app.c』の変更が可能になっています。)
My_APP_Taskの処理は、変数appData.stateが[ APP_STATE_SERVICE_TASKS ]であるcaseで、
「MPLAB Harmony」で指定したイベントハンドラの登録で動作します。
「テスト・ウメ・フラッシュ」では、「MPLAB Harmony」のコード自動生成により
USB_DEVICE_EventHandlerSet(appData.deviceHandle, APP_USBDeviceEventHandler, 0);
でイベントハンドラの登録が行われ、それを利用し作られています。
この登録は、USBのイベント応答でAPP_USBDeviceEventHandlerのコールバック関数を実行するための記述です。
つまり USBの処理は、変数appDataを介して
My_APP_TasksでUSBに対する指示が行われ、
イベント応答がAPP_USBDeviceEventHandlerで行われるという関係です。
さて『app.c』から呼び出す_my_app_tasks();のマクロは、
デフォルトの起動時にMy_APP_Tasks()『:my_app.c』が呼び出される設定になっています。
この状態で、USBから「UME専用Hexコマンド」を受け付ける状態です。
また、同時にUARTとのやり取りも可能です。これを【通常モード】と呼びます。
「UME専用Hexコマンド」で「T」+「Enter」で【 一時スルーモード】になります。
この状態では、UARTから受信したデータはUSBの送信バッファに送られます。
逆にUSBから受信したデータは、UARTバッファに送られます。
ここでUSBに『"\ncode from through mode to nomal mode 123\r"』のデータの並びを送れば【 一時スルーモード】から
「UME専用Hexコマンド」を受ける【通常モード】に戻ります。
【通常モード】でUARTからの受信データがあると、
(recive_and_send_uart_no_through関数により) _recv_uart1( data )マクロで受信データが処理さ、UART送信バッファの内容を
UARTへ出力します。UART送信バッファへの登録は_send_uart1( data )などでできます。
_recv_uart1( data )マクロのデフォルトでは単純にUSBへ送信するバッファに送られます。
(この【通常モード】や【 一時スルーモード】の時、この時のUARTの入出力はフロー制御をしていません。)
そして起動時にSW2を2秒以上で4秒未満を押すと、『app.c』から呼び出す_my_app_tasks();のマクロは、
My_APP_Tasks_Through()『:my_app.c』が呼び出される設定に変わります。
これはスルーモードと呼ぶ状態で、単純にUARTから受信データをUSBへ出力し、
USBからの受信データをUARTへ出力する状態です。このスルーモードは【 一時スルーモード】と異なり、
リセットしないと復帰しません。
この状態は、単純なUSBとUART間で伝達するだけのUSB分岐処理関数です。
それはマイクロコントローラ (PIC32MX270F256B-50I/SP)のUSBを介して、このUART1に繋がるチップ(例えばRN42、RN4020、ESP32など)
と直接にTera Termのどの端末で操作するためのモードです。
(なおこの状態で、UARTの入出力はフロー制御をしていません。ESP32-WROOM-32Dの制御ツール「esptool.py 」を使う場合は、このモードで利用します。)
そして起動時にSW2を4秒以上を押すと、この『app.c』から呼び出す_my_app_tasks();のマクロは、
My_APP_Tasks()『:my_app.c』が呼び出しに戻ります。
これはコマンドモードと呼ぶ状態で、UARTから「UME専用Hexコマンド」を受け付ける状態です。
(この状態ではUARTの入出力はフロー制御をしています。
RN42などのBluethoothを介してプログラムをする場合のため用意したモードです。)