Lập trình STM32 USB HID Host giao tiếp với chuột và bàn phím máy tính

STM32 HID Host giao tiep voi chuot va ban phim

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.

USB Host and device

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).

stm32 host hid clock

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

STM32 Host HID

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.

stm32 host hid config usb

Trong Middleware, tab USB_HOST chọn Class HID.

stm32 host hid config usb 2

Đ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ị.

stm32 host hid config usb 4

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

stm32 host hid config usb 3

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).

stm32 host hid code 1

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

stm32 host hid code 3

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

stm32 host hid code mouse

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

STM32 HID Host giao tiep voi chuot va ban phim

stm32 host hid code main

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ả

ket qua 1

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

stm32 host hid code keyboard

Kết quả

ket qua 2

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é!!!

5/5 - (1 bình chọn)

Để lại một bình luận

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *