Site icon TAPIT

Tính năng USB HID trên STM32F103C8T6 (chuột máy tính)

Bài viết này trình bày về tính năng USB Human Interface Device (USB HID) trên MCU STM32F103C8T6 với việc giả lập MCU thành chuột máy tính với 4 nút nhấn (nút click phải, nút click trái, nút di chuyển xuống, nút di chuyển qua phải). Trước khi bắt đầu project, chúng ta hãy cùng tìm hiểu USB là gì rồi mới đến cách thực hiện chức năng USB HID trên STM32F103C8T6.

[HỌC ONLINE: LẬP TRÌNH VI ĐIỀU KHIỂN STM32, VI XỬ LÝ ARM CORTEX – M]

Giới thiệu

USB (Universal Serial Bus) là chuẩn truyền thông nối tiếp để đảm bảo các kết nối tiêu chuẩn cho các thiết bị Plug and Play (cắm và chạy) như: bàn phím, chuột, các đầu đọc thẻ nhớ, máy in… 

Để dễ dàng phân biệt các thiết bị cắm vào máy tính người ta chia thành các lớp USB như sau:

Phân lớp thiết bị Miêu tả Thiết bị ví dụ
0x00 (không dùng)
0x01 USB audio device Soundcard (card âm thanh)
0x02 USB communications device Modem, fax
0x03 USB human interface device Keyboard, mouse
0x07 USB printer device Máy in
0x08 USB mass storage device (USB Thiết bị lưu trữ ) Memory card, flash drive
0x09 USB hub device Hubs
0x0B USB smart card reader device ( USB Thiết bị đọc thẻ thông minh) Card reader (bộ đọc thẻ nhớ)
0x0E USB video device ( USB Thiết bị Video) Webcam, scanner
0xE0 USB wireless device ( USB Thiết bị wireless) Bluetooth

Xem chi tiết tại đây

Mô tả chức năng USB trong STM32F103C8T6

– Hỗ trợ chuẩn USB 2.0

– Tốc độ kết nối qua USB ở chế độ Full Speed (FS) là 12Mbps, còn ở chế độ Low Speed (LS) là 1.5Mbps.

– Sơ đồ khối ngoại vi USB của STM32

USB endpoints

– Endpoint là thuật ngữ liên quan đến phần cứng trong thiết bị USB, thực chất endpoint là một bộ đệm để có thể truyền/nhận dữ liệu.

– Mỗi endpoint đi kèm với khối mô tả chứa các thông tin: địa chỉ của endpoint trong bộ nhớ, kích thước endpoint và số byte truyền đi.

– Khi 1 tín hiệu cho endpoint được phát hiện thì dữ liệu sẽ được truyền đi và nạp vào thanh ghi 16 bit (Endpoint registers), đồng thời việc truy cập bộ nhớ vào Packet buffer được thực hiện. Tại cuối transaction, một ngắt sẽ được sinh ra giúp MCU phát hiện endpoint nào thực hiện transaction và biết lỗi nếu xảy ra (lỗi format, thiếu ACK, …).

– Khối Interrupt Mapper có một chức năng đáng quan tâm đó là USB wakeup interrupt. Chức năng này dùng để đánh thức thiết bị khi đang ở trong chế độ low-power mode.

Tính năng USB human interface device class của USB

HID (Human Interface Device): là một phân lớp trong tiêu chuẩn USB. Một thiết bị HID có thể được lập trình để định nghĩa lại chức năng của nó. Thiết bị HID trong bài viết này là một chuột máy tính.

Lớp USB human interface device giúp việc thao tác trên các thiết bị trở nên dễ dàng. Các thiết bị định nghĩa các gói dữ liệu của nó (bao gồm các thông tin thiết bị hỗ trợ bao nhiêu gói dữ liệu, kích thước mỗi gói và mục đích của mỗi byte trong dữ liệu), sau đó gửi đến Host.

CubeMX setup

Bước 1:

– Ở mục USB_DEVICE chọn Human Interface Device Class

– Ở mục RCC chọn Crystal/Ceramic Resonator để chọn bộ thạch anh ngoại

– Mục SYS, chọn Serial Wire để nạp code và debug

– Mục USB, chọn Device (FS)

– Chọn các chân PA0, PA1, PA2, PA3 làm input

Bước 2: Thiết lập clock cho MCU

Bước 3: Cấu hình project và sinh code

– Chọn Project Manager -> Project -> đặt tên cho Project.

– Ở Toolchain /IDE chọn MDK-ARM V5

Bước 4: Generate code

Keil C uVision
Trước khi bắt đầu vào code, các bạn build chương trình rồi load vào kit. Sau khi load xong, kiểm tra xem thử máy tính đã nhận được cổng ảo hay chưa bằng cách:
– Kích chuột phải vào This PC chọn Manage -> Device Manager -> Mice and other pointing devices -> HID-compliant mouse. Vì chương trình mặc định là sử dụng USB HID Mouse nên nếu máy tính nhận được port của MCU thì sẽ xuất hiện HID-compliant mouse.

Chương trình thực hiện:

– Đầu tiên ta include thư viện “usbd_hid.h”

– Sau đó define các biến cần dùng

– Khai báo mảng click_report[] gồm 5 phần tử để gửi tọa độ của mouse pointer hoặc trạng thái click chuột:

– Mở file usb_device.c và tìm đến USBD_HandleTypeDef hUsbDeviceFS, copy và extern dòng đó vào file main. c

– Khai báo hàm getPointerData() ở /* USER CODE BEGIN PFP */

Tại USER CODE BEGIN 3:

Link video demo:

Xem thêm: Tổng hợp các bài hướng dẫn Lập trình vi điều khiển STM32 tại đây.

Nhóm TAPIT ARM R&D