Mở đầu series về USB Device trên STM32

Hành trình tổng hợp lại kiến thức USB từ lý thuyết cho đến thực hành với project thực tế trên STM32G0.

6 phút đọc
Đọc bằng Tiếng Việt English
STM32 / Firmware cover

Mở đầu

Khi học USB Device trên STM32, cách nhanh nhất thường là kiếm một ví dụ có sẵn trên mạng rồi copy-paste vào project của mình. Cách này giúp tạo được project ban đầu rất nhanh nhưng cũng dễ khiến trở thành một nút thắt cho người mới. Việc tiếp cận ngược như này dẫn tới một vấn đề là khi Windows không nhận device, bạn sẽ không biết phải soi từ đâu, hoặc sẽ “bó tay” khi phải triển khai một tính năng mới mà không có ví dụ mẫu. Vấn đề nằm ở chỗ phía sau đoạn code mẫu đó là cả một lớp kiến thức dày đặc như: enumeration, descriptor, loại transfer, endpoint…

Series này sẽ bắt đầu từ nền tảng giao thức USB, hiểu mô hình host-device, giải thích bốn loại transfer kèm với công dụng của từng loại, trình bày descriptor là gì và từng field ảnh hưởng thế nào đến hành vi thật của thiết bị.

Sau khi nắm rõ phần gốc thì mới bước vào quá trình xây dựng một USB device firmware hoàn chỉnh cho bàn phím máy tính: từ input thật của keypad, qua HID report, descriptor, CDC log, vendor request, bulk dump cho đến Python GUI tool để giao tiếp hay tùy chỉnh cài đặt của firmware.

Series này phù hợp với ai

Series này dành cho những ai từng chạm vào USB trên STM32 theo kiểu copy-paste ví dụ mẫu nhưng vẫn chưa thật sự hiểu bên dưới đang diễn ra điều gì. Nếu bạn đang gặp lỗi khi phát triển USB firmware trên STM32 mà chưa biết phải soi từ đâu, hoặc muốn đủ tự tin để tự thiết kế một composite device từ A-Z thì nội dung trong series này chắc chắn sẽ phù hợp và hữu ích cho bạn.

Toàn bộ ví dụ trong series được triển khai trên STM32G0B1RE, tập trung vào USB Device Full Speed và các class phổ biến nhất như: CDC, HID và composite device. Trong quá trình phát triển cũng sẽ có đề cập đến một số công cụ phần mềm hỗ trợ phát triển USB Device miễn phí để bạn có thể tham khảo và sử dụng.

Series không đề cập đến USB Audio, Video hay Mass Storage, không đề cập chế độ Host hay OTG và không đi sâu vào lớp tín hiệu điện. Nếu bạn cần những nội dung đó thì kiến thức nền từ series này vẫn hữu ích nhưng phần triển khai sẽ khác đáng kể.

Ngoài ra, những nội dung như điện trở pull-up, phát hiện VBUS, layout PCB có thể sẽ được nhắc đến khi cần nhưng không phải trọng tâm.

Thứ tự đọc đề xuất

Lộ trình của series được tóm tắt trong bảng dưới đây:

BàiNội dung
2 - USB Transfer TypesMô hình host-centric và 4 loại transfer
3 - USB DescriptorCách host nhận diện thiết bị
4 - Key Input PipelineTừ GPIO đến sự kiện phím - cách tạo input sạch trước khi đến phần USB
5 - HID Keyboard BaselineThiết bị bàn phím thật từ phím nhấn cho đến đầu ra trên Host
6 - CDC Debug ChannelBổ sung thêm 1 interface mới để xem log qua USB mà không cần debugger
7 - Vendor Request và BulkLệnh tùy chỉnh và đọc dữ liệu khối lượng lớn qua USB
8 - Composite Debug ToolCông cụ giao tiếp với firmware từ phía host

Cụ thể hơn thì:

  • Bài 2 là lý thuyết nền tảng nói về cách USB hoạt động, giúp hiểu “tại sao” thay vì chỉ thấy “làm thế nào”.
  • Bài 3 nói về cách host nhận diện thiết bị, đây là nền tảng cần thiết khi triển khai USB Device ở tầng giao thức.
  • Bài 4 nói về xử lý phần cứng bàn phím, tách biệt hoàn toàn khỏi USB. Có thể đọc lướt qua nếu chỉ quan tâm USB tuy nhiên vài đoạn đầu bài 5 có nhắc lại các thuật ngữ hay cấu trúc xử lý đến từ bài này.
  • Bài 5-8 nên đọc theo đúng thứ tự vì mỗi bài xây trực tiếp trên kết quả của bài trước. Đây cũng là quá trình phát triển một USB device firmware hoàn chỉnh từ thiết kế đến code, test.

Project đi kèm

Nhằm phục vụ việc học tập tôi triển khai một số project thực hành đi kèm với series. Các project này ghi lại quá trình thực hiện kèm số đo thực tế, giúp bạn đối chiếu khi tự triển khai và hiểu rõ hơn về cách USB hoạt động trên STM32G0. Dưới đây là danh sách các project trong series:

Cả ba project này đều được tổng hợp trong một Github repo để bạn tiện theo dõi và tham khảo: stm32g0-usb-device-lab. Mỗi bước phát triển là một commit riêng có tag, log và bằng chứng riêng để bạn có thể quay lại xem đúng trạng thái firmware tại thời điểm đó hay tự build rồi đối chiếu kết quả.

Về nội dung series

Nội dung được tổng hợp từ tài liệu chuẩn USB, tài liệu ST Middleware, và kinh nghiệm thực tế khi triển khai USB Device trên STM32G0B1RE cho hệ thống POS. Mọi thông số kỹ thuật trong series đều có bằng chứng thật kèm theo, không có con số ước chừng hay kết quả suy diễn từ lý thuyết.

Về phần code trong series được triển khai với mục đích học tâp, không phải là một firmware hoàn chỉnh cho sản phẩm thương mại. Một số tính năng hay logic có thể chưa được tối ưu hay xử lý triệt để như trên thực tế nhưng vẫn đảm bảo đủ để minh họa cho các khái niệm và vấn đề được trình bày trong mỗi bài.

Tôi sẽ cố gắng trình bày theo hướng đi sát vấn đề thật thay vì chỉ diễn giải tài liệu chuẩn nhưng có thể vẫn có chỗ chưa đủ hay thiếu sót. Nếu bạn đọc xong mà có thắc mắc, phát hiện điểm sai hoặc muốn góp ý, hãy gửi mail cho tôi qua:

✉️ contact@duonghao.dev.

Tôi sẽ đọc và cố gắng phản hồi sớm nhất có thể.

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 ý