STM 32 F 1 F 4 USBエンジニアリング更新
4051 ワード
現状
けいかく
オープンソース設計とボード製品
コード設計プロセス
以下、Mbed C++およびSTM 32 F 103/F 407について
今日完成したのは主にUSBチャネル上でVT 100 cmdlineを実現し、TeraTerm端末を通じて管理設備を配置したり、専門のcmd/GUI上位機プログラムを通じて自動化配置を実現したりすることができます.最初にCとシリアルポートに基づいてMbed Serialクラスへの移植も容易である.しかし、USBチャネル上でcmdlineを実現するには時間がかかり、繰り返しがあった.主な理由は、USBオブジェクトの初期化の特殊性と、Mbed C++と標準ライブラリまたはHALライブラリに基づく元の設計との違いによるものです.
標準ライブラリまたはHALライブラリベースのテンプレートは、一般的に次のとおりです.
// Private in main.c
CAN_HandleTypeDef hcan;
RTC_HandleTypeDef hrtc;
UART_HandleTypeDef huart1;
int main(void){
HAL_Init();
SystemClock_Config(); // RCC init before any other resources
MX_GPIO_Init();
MX_CAN_Init();
MX_USART1_UART_Init();
MX_RTC_Init();
MX_USB_DEVICE_Init(); // USB init here
while(1){
...
}
}
main.c
USBD_HandleTypeDef hUsbDeviceFS;
void MX_USB_DEVICE_Init(void)
{
USBD_Init(&hUsbDeviceFS, &FS_Desc, DEVICE_FS);
USBD_RegisterClass(&hUsbDeviceFS, &USBD_CDC);
USBD_CDC_RegisterInterface(&hUsbDeviceFS, &USBD_Interface_fops_FS);
USBD_Start(&hUsbDeviceFS);
}
usb_device.c
extern USBD_HandleTypeDef hUsbDeviceFS;
usb_device.h
Mbed C++に基づいているのは特殊です.
DigitalOut myled(DBG_LED); // See main.h for hardware issue
cmdline cmdhandler;
// You can put USBSerial/USBTerminal here, but will not be enumerated in F103
//USBSerial usbSerial(0x1f00, 0x2012, 0x0001, false);
USBTerminal *term;
int main(){
confSysClock(); // RCC init first
Serial uart(PA_9, PA_10, 115200);
//USBSerial usbSerial(0x1f00, 0x2012, 0x0001, false);
USBTerminal usbSerial(0x1f00, 0x2012, 0x0001, false);
term = &usbSerial;
}
main.cpp
USBはクロックに非常に敏感なので、システムクロックの構成が正しい後にUSBオブジェクトを生成する必要があります.
Mbed C++ではmain関数を呼び出す前にクロック構成とオブジェクトインスタンス化を行う.RCCクロック構成はMbed Libraryに隠れており,オブジェクトがMain関数の外にある場合は公有オブジェクトとみなされ,main関数の前にもインスタンス化される.
USBオブジェクトを共有オブジェクトとすると、F 407は正常に動作し、F 103は正常に動作せず、列挙に失敗する.換言すれば、F 407コードでは、main関数の外でUSBSerial/USBTerminalを宣言し、正常に動作することができる.しかしF 103コードでは同じコードでコンパイルはパスしたが列挙に失敗した.
サードパーティの開発者はパッチを適用し、main関数にconfSysClock()を追加しました.興味があれば、RCCレジスタの数値を見ることができます.
クロックはmain関数で呼び出されるため、間接的にUSBオブジェクト(USBSerialおよびそのサブクラスUSBTerminal)はmain関数のオブジェクトであり、他のモジュールおよび関数はアクセスできません.
解決策はmainです.cppにUSBオブジェクトポインタを1つ残し、他の関数や他のモジュールがUSBオブジェクトにアクセスできるようにします.その代償として、USBオブジェクトにアクセスするには、すべての方法で"->"を使用する必要があります.これにより、SerialオブジェクトとUSBオブジェクトに基づくコードが2つ存在することになり、OOPの原則に反する.
このことから,Serialオブジェクトベース,F 103ベースのUSBSerial,F 407ベースのUSBSerialのチャネルには,意外にも2セット(正確には2.5セット)のコードが現れている.この場合、HCI/SIP/TDL/JSONなど、他のプロトコルにも影響を及ぼす可能性があります.
ARMにとって、USBはIoTの一部ではありません.彼らのIoT/Conectivityには主にCellular Modem/WiFi/BLE/LoRaWAN/BLE/TS/MQTTなどが含まれている.
コードを統合するには、開発者が自分で手を出す必要があります.ポインタタイプに統一するか、Mbedの下位層が修正されることを期待するか.しかし、これらのコードはすべてMbed 2に基づいており、Mbed 5はUSBスタックをメンテナンスしていない.開発者独自のBackportが必要です.コードここで:ARM Mbed OS STM 32 F 103のシステムクロック構成コード