Trong bài này chúng ta sẽ cùng học STM32 USB HID Host, biến STM32 giống như 1 chiếc máy tính để giao tiếp với chuột và bàn phím, đọc dữ liệu rồi hiển thị ra màn hình.
Bài 3 phần STM32F407 trong Serie Học STM32 từ A tới Z
USB HID Host là gì?
Bài trước chúng ta đã tìm hiểu về USB HID Device, đã hiểu được giao thức USB HID là gì, và cách biến STM32 thành 1 con chuột hoặc 1 chiếc bàn phím máy tính.
Có 2 khái niệm cần lưu ý trong giao thức USB đó là:
- USB Host: là phía đưa ra lệnh và trực tiếp điều khiển các thiết bị, đồng thời cấp nguồn cho chúng. Trong bài trước, đó chính là chiếc máy tính của chúng ta
- USB Device: là các thiết bị sử dụng giao thức USB để giao tiếp với Host, nhận lệnh từ Host. Đó có thể là chuột, bàn phím, tay cầm chơi game,…
Vậy USB HID Host chính là biến STM32 của chúng ta giống như 1 chiếc máy tính, điều khiển và nhận dữ liệu từ các thiết bị HID Device khác, sau đó xử lý và hiển thị dữ liệu ra ngoài. Giống như đổi vai trong lớp học: trước đây STM32 là học sinh trả lời câu hỏi, giờ STM32 lên làm giáo viên, gọi từng bạn (thiết bị) lên trả bài.

Lập trình STM32 USB HID Host giao tiếp với chuột máy tính
Cấu hình trên CubeMX
Vẫn như các bài trước, các bạn cấu hình SYS với Debug Serial Wire.
Phần Clock chọn HSE Crystal, và đặt clock 48MHz cho USB (bắt buộc).

Chúng ta sẽ sử dụng USART3 để xem dữ liệu mà thiết bị gửi về.

Sau đó trong Connectivity chọn USB_OTG_FS chế độ Host_Only, tích vào Activate_VBUS để STM32 dùng chân VBUS (PA9) phát hiện nguồn trên cổng USB.

Trong Middleware, tab USB_HOST chọn Class HID.

Đa số các thiết bị USB không có nguồn riêng mà phải lấy nguồn 5V từ Host. Trên KIT STM32F4 Discovery, nguồn 5V cho cổng micro USB đi qua 1 IC công tắc nguồn, và chân PC0 có nhiệm vụ bật IC này để cấp nguồn VBUS cho thiết bị.

Trong Platform Settings, mục Drive_VBUS_FS chọn PC0.

Lưu ý: Cổng USB trên KIT Discovery là cổng micro USB, nên để cắm chuột hoặc bàn phím (đầu USB-A) vào, các bạn cần 1 cáp chuyển OTG (micro USB đực sang USB-A cái). Ngoài ra chân PC0 bật nguồn VBUS ở mức 0 (active low), nếu tự viết code điều khiển chân này thì đừng đảo ngược logic, kẻo thiết bị không được cấp nguồn và không bao giờ được nhận diện.
Lập trình STM32 USB HID Host trên Keil C
Đầu tiên chúng ta include file usbh_hid.h và stdio.h (để dùng hàm sprintf).

Tạo một buffer để in dữ liệu ra USART3.

Tìm hàm callback USBH_HID_EventCallback (được thư viện gọi mỗi khi thiết bị HID gửi dữ liệu về), sau đó lập trình như sau:
- Nếu thiết bị cắm vào là HID_MOUSE
- Đọc dữ liệu ra biến mouse_value
- In dữ liệu vào mảng buffer
- Truyền qua cổng UART

Trong while gọi hàm xử lý USB Host MX_USB_HOST_Process().


Lưu ý: Toàn bộ quá trình nhận diện thiết bị (enumeration) và đọc dữ liệu của USB Host chạy bên trong MX_USB_HOST_Process(), nên hàm này phải được gọi liên tục trong while. Nếu trong while có HAL_Delay dài hoặc đoạn code chờ lâu, chuột/bàn phím sẽ được nhận rất chậm, thậm chí không được nhận.
Kết quả

Lập trình STM32 USB HID Host giao tiếp với bàn phím máy tính
Tương tự với HID_KEYBOARD:
- Nhận dữ liệu và lưu vào biến keyboard_value
- Chuyển đổi mã phím thành kí tự dạng char (hàm
USBH_HID_GetASCIICode) - In dữ liệu nhận được vào buffer
- Truyền qua USART3

Kết quả

Kết
STM32 USB HID Host với thư viện HAL khá dễ sử dụng, do hãng đã cung cấp tất cả các hàm thực thi phía Host. Chúng ta chỉ cần xử lý trong hàm callback mỗi khi thiết bị USB gửi dữ liệu về, và lập trình dựa trên đó mà thôi.
Hi vọng bài viết này có ích cho bạn, đừng quên gia nhập Hội Anh Em Nghiện Lập trình để giao lưu và học hỏi nhé!!!

