Saya telah mengerjakan sebuah proyek selama dua minggu terakhir sekarang dan men-debug masalah yang satu ini telah menghabiskan seluruh minggu ini. Ingin tahu apakah ada yang bisa membantu, saya akan mencoba untuk menjadi sejelas dan sejelas mungkin.
Saya mencoba untuk mengimplementasikan Port USB Virtual Comm pada MicroController berdasarkan STM32F302K8 (Cortex M4). Saya telah menggunakan STM32CubMX untuk menghasilkan kode yang diperlukan untuk mengatur Perangkat Kecepatan Penuh USB yang mengimplementasikan kelas CDC. Perangkat saya muncul di Windows (Device Manager) dan Linux. Saya dapat menerapkan fungsi gema sederhana berdasarkan kode contoh tetapi ketika sekarang saya mencoba menggunakan fungsi USBD_CDC_SetTxBuffer untuk mengirim data ke PC, ini memicu Hard Fault Handler. Saya mempersempit ini menjadi kenyataan bahwa bidang UsbDeviceFS.pClass (yang diperlukan oleh USBD_CDC_SetTxBuffer) tidak pernah diinisialisasi karena USBD_CDC_Init () tidak pernah dipanggil dalam inisialisasi Perangkat USB.
Saya telah menerapkan perbaikan ke beberapa bug (termasuk mengubah ukuran tumpukan, memperbaiki bendera transmisi di USBD_CDC_TransmitPacket , dan mengubah ukuran CDC_DATA_HS_MAX_PACKET_SIZE menjadi 256 dari 512) dalam kode contoh seperti yang didokumentasikan pada forum ST tetapi masih mendapatkan kesalahan yang sama.
Kode pengaturan perangkat saya adalah
* USB Device Core handle declaration */
USBD_HandleTypeDef hUsbDeviceFS;
/* init function */
void MX_USB_DEVICE_Init(void)
{
/* Init Device Library,Add Supported Class and Start the library*/
USBD_Init(&hUsbDeviceFS, &FS_Desc, DEVICE_FS);
USBD_RegisterClass(&hUsbDeviceFS, &USBD_CDC);
USBD_CDC_RegisterInterface(&hUsbDeviceFS, &USBD_Interface_fops_FS);
USBD_Start(&hUsbDeviceFS);
}
Jawaban:
Untuk menjawab pertanyaan saya sendiri, masalahnya adalah bahwa kode saya tidak menunggu USB untuk menyelesaikan inisialisasi dan segera mulai mengirim data. Memasukkan tunggu aktif di boolean atau menambahkan penundaan (seperti yang ditunjukkan oleh @ramez) memecahkan masalah.
PEMBARUAN Bug ini telah diperbaiki pada versi driver CDC USB berikutnya dari ST. Sekarang ada HAL_Delay dalam penyiapan. Peringatan adalah bahwa jika karena alasan apa pun Sys_Tick tidak berfungsi / dinonaktifkan / belum diinisialisasi, kode Anda akan hang.
sumber
Saya menggunakan CubeMX untuk menghasilkan kode untuk penemuan STM32F4. Saya menggunakannya sebagai port COM virtual seperti Anda. Saya tidak menggunakan fungsi USBD_CDC_SetTxBuffer () secara langsung. Dalam file usbd_cdc_if.c ada fungsi bernama CDC_Transmit_FS () . Ada bug dalam kode yang dihasilkan, fungsi mengambil buffer sebagai parameter dan tidak melakukan apa-apa dengannya. Kode fungsi yang dikoreksi adalah sebagai berikut:
Sebenarnya saya harus menambahkan memcpy ke kode. Setelah koreksi ini saya bisa mengirim data dari mikrokotroller ke PC dengan fungsi pengiriman ini. Sebagai contoh:
Inisialisasi dalam MX_USB_DEVICE_Init () sama dengan saya.
sumber
Pertama, periksa apakah hUsbDevice_0 adalah null (elemen yang hilang dalam solusi Anda):
Ini akan mencegah menggantung UC Anda dan tidak perlu sibuk menunggu dalam penundaan.
Anda dapat menempatkannya di suatu tempat di CDC_Transmit_FS:
sumber
Saya memiliki masalah yang sama tetapi ternyata satu-satunya hal yang perlu saya lakukan adalah menancapkan kembali koneksi USB ke komputer. Sebagian besar waktu Anda mem-flash kode dan mengatur ulang mikrokontroler tetapi pada sisi PC enumerasi tidak diperbarui. USBD_CDC_Init dipanggil ketika tuan rumah mulai menyelidiki perangkat Anda dan itulah sebabnya pClassData adalah NULL.
sumber