UMEHOSHI ITA TOP PAGE    COMPUTER SHIEN LAB

UMEHOSHI IT 基板の使い方の詳細ページ


[UMEHOSHI IT] 基板のテスト用プログラム内容

[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社のサブライセンスを受けたものだからです。)

[UMEHOSHI IT] 基板のテスト用プログラム概要

次のように起動して動作します。(各ソースの詳細は後述しています。)
実行はmain.cにあるmain()でスタートします。
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()の概要で、この順番で進みます。
これは「MPLAB Harmony」で生成されたコードを編集して作ったコードです。
  1. init_main()『:my_sys.c』の呼び出し
    この中で、マイクロコントローラ (PIC32MX270F256B-50I/SP)内のメモリをどう使うかの初期を行った後に init_handle_area()『:my_sys.c』を呼び出しています。
    init_handle_area()の内容は以下の通りです。
    1. ユーザRAMエリア確保()
    2. パワーオン時(リセット無関係)だけ、ユーザRAMエリア初期化(_HANDLES配列内容の設定
    3. リセット時のRAMエリア初期化(_HANDLES配列内容の設定
    4. _handle_user_set_func() (handlers[_IDX_HANDLE_USER_SET_FUNC] の関数実行)

    上記で行っているのは、RAMエリアの初期設定だけです。
     この定義関数を呼び出しているのは、後述するinit_interrupt()で行っています。
  2. SYS_Initialize ( NULL )『:system_config/defalt/framework/system_init.c』の呼び出し
    MPLAB Harmony modulesで生成されたコードで変更していない。ここでUSBや指定IOの初期化が行われる。
    (ここでIOの初期化が行われるので、この処理の前でIOの制御は不可能ですが、[Pin Setting]で指定しない箇所の初期化は可能)
  3. init_interrupt()『:my_sys.c』の呼び出し
    割り込み関連の初期化と、上記init_handle_area()で設定されたRAMエリアに登録された初期化用ハンドラの呼び出し。
    それは、コアタイマ、Timer1,2,PWM,ADCとTimer3,Timer4,5,UARTの初期化処理です。
    また この中の最後で、handlers[_IDX_INIT_SUB_FUNC]のマクロ_init_sub_func()を実行しているが、 デフォルト関数では基板の起動時に予約するLED D1の点灯処理が存在する。
  4. while ( true ) の無限ループ
    この中で、SYS_Tasks ( )『:system_config/defalt/framework/system_tasks.c』を呼び出しています。
    この呼び出し繰り返しで、MPLAB Harmony modulesで生成されたUSB関連の状態に応じた処理が行われます。
    このSYS_Tasks ( )内には、APP_Tasks()『:app.c』の呼び出しがあり、 これがMPLAB Harmony利用者のコードになっており、
    ここから USB受信応答処理のMy_APP_Tasks()『:my_app.c』が呼ばれています。

init_main()init_interrupt() の関係

[UMEHOSHI ITA]の制御で使っているIC「PIC32MX270F256B-I/SO」のフラッシュメモリには、 テスト用プログラムが書き込まれいています。
このプログラムを「テスト・ウメ・フラッシュ」と呼び、 これを利用したユーザー用のプログラムを「ウメ・エディットプログラム」と呼んでいます。

「テスト・ウメ・フラッシュ」には、デフォルトで コアタイマ、Timer1,2,PWM,ADCとTimer3,Timer4,5,UARTに関する処理が埋め込まれ、 この呼び出しアドレスをRAM領域に登録しているのがinit_main()です。
そして、起動時にこの処理を呼び出してデバイスなどを初期化しているのが init_interrupt() です。

APP_Tasks()『:app.c』と、My_APP_Tasks()『:my_app.c』処理(USBの受信処理)

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を介してプログラムをする場合のため用意したモードです。)