CubeMX USB pitfalls thường gặp
Những điểm CubeMX không làm đúng khi generate USB code: HID mouse descriptor thay vì keyboard, NVIC không bật, Sof_enable DISABLE, USBD_static_malloc sai kích thước.
CubeMX generate middleware skeleton, không phải code hoàn chỉnh. Một số điểm phổ biến cần verify sau khi generate.
1. HID descriptor là mouse, không phải keyboard
Dù chọn “HID Keyboard”, template được generate là mouse:
bInterfaceProtocol = 0x02(Boot Mouse, cần0x01)wMaxPacketSize = 4(cần8)- Report descriptor 50 byte cho chuột
Cách phát hiện: USBView sau enumerate, không phải đọc source.
2. TIM6 NVIC không bật
HAL_TIM_Base_Start_IT được gọi nhưng interrupt không bắn. CubeMX không tự
bật NVIC cho TIM6. Phải vào tab NVIC → bật TIM6_DAC_LPTIM1_IRQn.
3. Sof_enable = DISABLE
usbd_conf.c generate Sof_enable = DISABLE. Nếu composite class đăng ký
Composite_SOF, callback không bao giờ bắn. Không có lỗi hay cảnh báo.
4. USBD_static_malloc sai kích thước khi đổi class
/* CubeMX generate - sai khi đã xóa HID class */void *USBD_static_malloc(uint32_t size) { static uint8_t mem[sizeof(USBD_HID_HandleTypeDef)]; /* sai */ return mem;}Khi đổi sang composite class, phải sửa sizeof sang class mới. Không sửa là
buffer tĩnh quá nhỏ, memset ghi đè ra ngoài - undefined behavior.
5. PMA offset 0x000 đè BTABLE
BTABLE chiếm 64 byte đầu PMA (0x000–0x03F). Buffer bắt đầu từ 0x018 hoặc
0x058 sẽ đè lên BTABLE. Lỗi xuất hiện ngẫu nhiên, rất khó debug.
Dùng offset từ 0x040 trở đi cho EP0, 0x080 cho EP1, v.v.
Xem chi tiết: bài 3 USB Descriptor
Bài viết này hữu ích với bạn?
Chia sẻ, góp ý, hoặc ủng hộ nếu bạn thấy nội dung này có giá trị.
Nội dung liên quan
Một số bài viết, ghi chú hoặc project có liên quan đến nội dung bạn vừa đọc.
HID Keyboard Report Format là gì?
Cấu trúc 8 byte của HID keyboard report: modifier byte, reserved byte, 6 keycode slot. Cách gửi report từ STM32 middleware.
HID Usage Tables là gì?
Giải thích Usage Page và Usage trong HID. Bảng tra đầy đủ Keyboard/Keypad Page 0x07 (chữ, số, dấu câu, numpad, phím khoá, F-key).
USB Descriptor Overview là gì?
Cấu trúc phân cấp USB descriptor: Device → Configuration → Interface → Endpoint. wTotalLength, bDescriptorType, cách host đọc từng bước và điểm dễ gây enumeration fail.
Biến note thành bài viết hoàn chỉnh
Notes là nơi ghi nhanh khái niệm.