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.

Cập nhật 2 phút đọc
USB cover

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ần 0x01)
  • wMaxPacketSize = 4 (cần 8)
  • 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 (0x0000x03F). 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ị.

Góp ý

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.

Biến note thành bài viết hoàn chỉnh

Notes là nơi ghi nhanh khái niệm.