STM32 rất phổ biến ở Việt Nam, tuy nhiên lại có nhiều cách để lập trình cho nó. Mình cũng có thấy nhiều tranh cãi về việc sử dụng thư viện Std hay sử dụng CubeMX ? Cái nào tốt hơn cái nào ? Rồi một số bạn làm với CubeMX xong khi tiếp cận một con chip khác thì lại rất bối rối không biết nó viết gì trong đó. Thôi thì mình cùng tìm hiểu xem các cách có thể lập trình được với STM32 và các thư viện đi kèm, cũng như có cái nhìn tổng quan và đưa ra lựa chọn cho chính xác với nhu cầu của mình nhé.
Tổng quan
Trăm nói không bằng một lần nhìn hình, hình trên mô tả chính xác nhất về các thư viện có thể dùng được cho STM32. Ở đây mình tập trung vào 5 tên màu xanh da trời được ST đề nghị, tất nhiên là hàng của ST thì ST khuyên dùng là chuẩn cơm mẹ nấu rồi :D.
Các bạn có thể tải từng thư viện tương ứng ở link trên về tham khảo
STM32Snippets
STM32Snippets gồm rất nhiều code ví dụ dựa trên các thanh ghi ngoại vi của STM32. Mục đích chính của nó phục vụ cho những người có kiến thức về chip 8 bit, lập trình hợp ngữ, lập trình C khá vững.
Ưu điểm:
- Tối ưu cao
- Có thể truy cập tới mức thanh ghi
- Kích thước code nhỏ
- Sát với tài liệu tham khảo
- Debug ở mức thanh ghi
Nhược điểm:
- Khó chuyển đổi code khi đổi sang dòng chip STM32 khác.
- Phức tạp khi dùng với ngoại vi như USB
- Developer phải hiểu dược kiến thức về các ngoại vi ở mức độ thanh ghi
- Chỉ hỗ trợ 2 dòng chip là L0 và F0.
Standard Peripheral Lib (SPL)
Đây là thư vện gồm rất nhiều thư viện C dành cho ngoại vi của STM32. Phù hợp cho các developer có kiến thức về C tốt.
Ưu điểm:
- Tối ưu mức trung bình, phù hợp với nhiều trường hợp khác nhau
- Không càn tác động trực tiếp lên thanh ghi
- Hỗ trợ 100% ngoại vi
- Dễ debug
- Có thể mở rộng với các middleware phức tạp như USB/TCP-IP/Graphics/Touch Sense
Nhược điểm:
- Chỉ hỗ trợ 1 số dòng STM32 nhất định
- Không có hàm API HAL hỗ trợ chuyển đổi khi thay thế chip STM32 dòng khác
- Thư viện middleware không thống nhất
- Không hỗ trợ các dòng STM32 L0,L4,F7
STM32Cube
STM32Cube hỗ trợ đầy đủ các gói từ driver tới USB, TCP/IP, Grapics, File system, RTOS. Nó có thể giúp chúng ta chuyển đổi giữa các dòng chip STM32 một cách dễ dàng, ngoài ra còn có thẻ truy cập trực tiếp vào thanh ghi ngoại vi của STM32 thông qua các hàm API và việc cấu hình cho các hàm API này cũng tương tự như với cấu hình cho SPL (thư viện Std ấy).
Thư viện Cube này nó có 2 lớp
HAL(Hardware Abstraction Layer) API: cho các developer có kiến thức nền tốt, với những người dùng muốn tìm cách nhanh nhất để đánh giá và lựa chọn một con STM32 phù hợp một cách dễ dàng.
LL(Low-Layer) API: dành cho các developer có kiến thức về lập trình vi điều khiển 8-bit, đặc biệt mong muốn của ST là tập trung vào những người sử dụng thư viện SPL
Với hình trên sẽ có 3 thứ tác động lên lớp User là Middleware stack, HAL API và LL API. Một câu hỏi được đặt ra là có thể sử dụng đồng thời HAL và LL không ? Câu trả lời là không khi sử dụng LL và HAL trên cùng một ngoại vi cùng lúc nhưng nếu dùng tuần tự thì ok.
Ví dụ với một dạng lai thì sẽ là
- Cấu hình ngoại vi một cách đơn giản với API HAL
- Tối ưu thời gian hoạt động với ngoại vi bằng việc gọi API LL
HAL API
Với HAL API thì có các tính năng
- Dễ chuyển đổi từ dòng STM32 này sang dòng khác mà không phải thay đổi code nhiều.
- Hỗ trợ 100% ngoại vi
- Tương thích với cá middleware như USB/TCP-IP/Graphic/Touch Sense/ RTOS
- Có thể dùng STM32CubeMX để sinh code
Nhược điểm
- Sẽ có thách thức lớn khi cần phải tối ưu bộ nhớ.
- Khả năng tương thích với nhiều dòng STM32 sẽ làm tăng thời gian thực thi code, do đó sẽ làm giảm tốc độ chương trình.
LL API
Tính năng của LL API
- Tối ưu cao
- Tác động tới mức thanh ghi
- Code sinh ra nhỏ
- Debug mức thanh ghi
- Các API để cấu hình ngoại vi
- Khởi tạo, dừng khởi tạo, khởi tạo mặc định
- Các hàm giống với SPL
- Tối ưu hơn SPL, phù hợp với nhiều trường hợp khác nhau
- Không phải thao tác trực tiếp tới thanh ghi
- Dễ dàng debug
Nhược điểm
- Vẫn phụ thuộc từng loại STM32 riêng biệt, không thể chuyển trực tiếp từ serie này sang serie khác
- Vẫn còn phức tạp khi dùng các ngoại vi như USB
- Developer vẫn cần phải hiểu hoạt động của ngoại vi ở mức thah ghi
- Chỉ hỗ trợ L4, L0 và F0
So sánh
Nhìn bảng trên ta có thể biết được mức độ và khả năng chuyển đổi, tối ưu, dễ sử dụng và đọc hay không cũng như mức độ tương thích nhiều phần cứng.
Tất nhiên là ST họ cũng phát triển STM32Cube theo ý đồ cụ thể chứ không phải là đưa ra một thư viện mà chẳng ai dùng cả
Cuối cùng sẽ là bức tranh về sự hỗ trợ của từng thư viện cho các dòng chip của ST
Vậy thì mình nên chọn thư viện nào để dùng đây ? Bạn có thể tham khảo qua một số câu hỏi
Tôi sử dụng MCU ít chân thì tôi nên dùng thư viện nào ?
Vấn đề ở đây là giá cả, nếu bạn muốn tận dụng từng bit trong bộ nhớ thì STM32Snippets và STM32Cube LL là sự lựa chọn hoàn hảo
Tôi mới chuyển từ MCU 8-bit sang thì tôi nên dùng cái nào ?
Nếu bạn muốn lập trình trực tiếp trên thanh ghi thì dùng STM32Snippets hoặc STM32Cube LL, nếu bạn giỏi lập trình C và không muốn dính tới thanh ghi thì nên dùng STM32Cube HAL hoặc SPL
Tôi đang dùng SPL, tôi có nên chuyển sang CubeMX không?
Nếu từ trước tới giờ bạn chỉ dùng mỗi 1 dòng chip cho sản phẩm của mình (ví dụ chỉ dùng duy nhất 1 dòng F1) thì nên tiếp tục dùng SPL. Còn nếu bạn muốn chuyển sang dùng các dòng khác như L4 L0 F4 thì nên chuyển sang dùng STM32Cube là vừa.
Tôi muốn lựa chọn giữa việc lập trình 1 lần mà có thể tối ưu và sử dụng được cho nhiều dòng chip khác nhau thì nên làm thế nào ?
Cách thỏa mãn nhu cầu của bạn là kết hợp HAL và LL thôi.
Bạn cần thông tin thêm về chuyển đổi giữa các thư viện nữa thì có thể xem bảng sau
Sử dụng
Ở phần trên mình có gửi link tất cả các thư viện các bạn có thể tải được. Nhóm mình cũng đã có 2 video hướng dẫn
2 serie này cũng hơi cũ, nhưng nếu sau khi xem xong 2 serie bạn cảm thấy chưa đủ, thấy vẫn cần hoặc muốn tìm hiểu thêm thì nên tìm hiểu ở đâu, các hàm HAL tài liệu nào mô tả ? Có ví dụ nào để nghiên cứu thêm không ?
Với gói STM32Snippets của F0 thì khi giải nén có 2 mục Documentation và Project để bạn tham khảo
Tương tự với gói thư viện SPL như của F0 thì cũng có phần Project để bạn có thể tham khảo
Với CubeMX của F4 thì bạn sẽ có 2 phần Documentation và Project, tha hồ mà ngâm cứu
Tất cả những gì bạn cần thì hầu như ST đã cho vào hết trong gói thư viện của mình rồi, có 2 file mô tả về các hàm thì nó bị rải rác ở chỗ khác, bạn có thể tải ở link dưới đây.
Document mô tả hàm của thư viện STL
Document mô tả hàm của thư viện HAL F4
Tạm kết
Coi như mình đã đưa ra được bức tranh thô sơ về các thư viện cho STM32 với đủ các nhu cầu mục đích khác nhau, tất nhiên dựa trên tài liệu của ST chứ không phải mình chém, ở đây họ gọi là Embedded software cho STM32 nhưng mình tạm gọi là thư viện cho thân quen. Hi vọng các bạn có thể tự lựa chọn được cái nào là phù hợp với nhu cầu của mình.