平成26年10月21日
MPLAB Harmonyの使い方(8) USBライブラリの導入
FreeRTOSの導入ではMPLAB Harmony Configratorのメリットはそれ程多くはないという結論になりました。
これはFreeRTOSが独自の設定ファイルFreeRTOSConfig.hをもっており、MPLAB Harmony Configratorでは、この設定ファイルの変更まではやってくれないためです。
このため人手でFreeRTOSConfig.hを設定しなおすときに、ライブラリとして再コンパイルした方が便利でした。
おそらくは他のサードパーティ製ツールでも同じように個々の設定は人手で行うのでしょう。
今度はUSBライブラリを導入します。
USBライブラリはMPLAB Harmony Configratorを介した設定項目が多いので、このツールのメリットも大きいと期待します。
使用するサンプルプロジェクトはcdc-com_port_dualです。
閑話休題
なんと、PIC32のサンプルプログラムには複数UARTのサンプルがあった!!
数ヶ月前までPIC24Fを使って同じことをしようと紆余曲折していた時には全く気が付かなかったのに、まさかこんな近くにお手本があったとは。
で、極めてざっとプログラムを眺めてみたのですが、従来のプログラムの焼き直しではなく、新規に書き直したようです。
従来のMALのそれはPIC18・PIC24・PIC32と全く構造の異なるCPUを一つのソースプログラムにまとめたため、各所に条件マクロが多用された非常に読み難いプログラムでした。
おかげでプログラムを読み直す手間は増えますが、今PIC32専用のプログラムとして内容を把握しておけば先々では楽が出来るでしょう。
このプロジェクトにはPIC32でも複数の評価ボードに対応しているようです。
取りあえずpic32mx_usb_sk2_int_dynという設定(評価ボードはPIC32_USB_SK2)を変更します。
私は面倒なのでこれ以外のコンフィグレーションを全て削除してあります。この方がミスが入りにくい。
このcdc-com_port_dualプロジェクトはMPLAB Harmony Configratorで作成されたようですが、funcRegistrationTable[2]の宣言位置が自動で作成されるプログラムとは異なっています。設定を変更する度にマージの可否を問い合わされるのが面倒なら、最初に変更してください。
上記リストの59行目のように、fullSpeedDeviceDescriptorと置換するか問い合わせされますが、実際のfuncRegistrationTable[2]は、350行目付近に存在しています。このため、ここでは置換せずに、後から59行目に位置に左側のコメントと350目付近にあるfuncRegistrationTable[2]を移動します。同様にfuncRegistrationTable[2]で参照されているcdcInitも375行目付近からこの位置に移動します。
変更後の50行目付近のリストは下記になります。
同様に69行目のマージも後方に宣言が存在していますので不要です。
// *****************************************************************************
// *****************************************************************************
// Section: File Scope or Global Constants
// *****************************************************************************
// *****************************************************************************
//ここから移動分
/*************************************************
* USB CDC Device Function Driver Initialization
* Data Structure
*************************************************/
const USB_DEVICE_CDC_INIT cdcInit =
{
.queueSizeRead = 1, // Read Queue Size
.queueSizeWrite = 1, // Write Queue Size
.queueSizeSerialStateNotification = 1 // Serial State Notification Queue Size
};
/**************************************************
* USB Device Layer Function Driver Registration
* Table
**************************************************/
const USB_DEVICE_FUNCTION_REGISTRATION_TABLE funcRegistrationTable[2] =
{
/* This is the first instance of the CDC Function Driver */
{
.configurationValue = 1, // Configuration descriptor index
.driver = (void*)USB_DEVICE_CDC_FUNCTION_DRIVER, // CDC APIs exposed to the device layer
.funcDriverIndex = 0, // Instance index of CDC function driver
.funcDriverInit = (void *)&cdcInit, // CDC init data
.interfaceNumber = 0, // Start interface number of this instance
.numberOfInterfaces = 2, // Total number of interfaces contained in this instance
.speed = USB_SPEED_FULL|USB_SPEED_HIGH, // USB Speed
},
/* This is the second instance of the CDC Function Driver */
{
.configurationValue = 1, // Configuration descriptor index
.driver = (void*)USB_DEVICE_CDC_FUNCTION_DRIVER, // CDC APIs exposed to the device layer
.funcDriverIndex = 1, // Instance index of CDC function driver
.funcDriverInit = (void *)&cdcInit, // CDC init data
.interfaceNumber = 2, // Start interface number of this instance
.numberOfInterfaces = 2, // Total number of interfaces contained in this instance
.speed = USB_SPEED_FULL|USB_SPEED_HIGH, // USB Speed
},
};
//移動分ここまで
/*******************************************
* USB Device Desciptor for this demo
*******************************************/
const USB_DEVICE_DESCRIPTOR fullSpeedDeviceDescriptor =
{
実際には、使用する実験基板がマイクロチップ社のデモボードではないのでハードウェアの変更も必要になります。
PIC32USB基板に対する変更は、先のプロジェクトと同じく発信器の発信周波数が倍の16MHzなので、コンフィグレーションビットのFPLLIDIVの設定をDIV_2からDIV_4に変更します。評価基板であるBSP
Configrationはそのままチェックを残します。
(H26/10/21追記)
説明に抜けががありました。発信器の周波数が16MHzに変更になったのでコンフィグレーションビットのPOSCMOD設定もXTからHSに変更が必要です。
(追記ここまで)
このプログラムで使用している評価基板のハードウェアはポートDのビット0〜2の3ビットをLED出力として使用しているだけです。
削除してもいいのですが、この程度なら面倒なのでそのままにしておきます。
このcdc-com_port_dualプロジェクトの動作は、二つあるシリアル通信の送受信をテレコにして接続しています。つまり、A側のポートで受信したデータはB側のポートから出力されます。逆にB側で受信したデータはA側に出力します。
実際の動作は上記の変更のみであっさりと動作しました。
これで、最低限のプログラムの設定方法は分かりました。
後はプログラムの動作をある程度は追跡して必要なら修正できる程度に理解する努力が必要になります。