Bắt đầu với STM32 HAL và FreeRTOS trong lập trình hệ thống nhúng
STM32 là dòng vi điều khiển rất phổ biến trong lĩnh vực hệ thống nhúng nhờ hiệu năng mạnh, nhiều ngoại vi và khả năng phát triển linh hoạt. Khi kết hợp thư viện HAL (Hardware Abstraction Layer) với FreeRTOS, lập trình viên có thể xây dựng các ứng dụng đa nhiệm chuyên nghiệp, dễ mở rộng và phù hợp với các bài toán điều khiển thời gian thực.
1. STM32 HAL là gì?
HAL là thư viện do STMicroelectronics cung cấp nhằm đơn giản hóa quá trình cấu hình phần cứng và lập trình ngoại vi.
Ưu điểm của HAL
- Dễ lập trình, cú pháp trực quan
- Không cần thao tác trực tiếp từng thanh ghi
- Tương thích tốt với STM32CubeMX
- Hỗ trợ đầy đủ GPIO, ADC, UART, SPI, I2C, Timer
Một số hàm HAL thường dùng
- HAL_GPIO_WritePin()
- HAL_UART_Transmit()
- HAL_ADC_Start()
- HAL_TIM_PWM_Start()
2. FreeRTOS là gì?
FreeRTOS là hệ điều hành thời gian thực mã nguồn mở, cho phép chia chương trình thành nhiều task chạy song song.
Vai trò của FreeRTOS trong STM32
- Quản lý đa nhiệm
- Phân chia tài nguyên CPU hiệu quả
- Tăng khả năng mở rộng chương trình
- Phù hợp cho các ứng dụng điều khiển phức tạp

3. Khi nào nên dùng FreeRTOS?
Các ứng dụng phù hợp
- Đọc cảm biến nhiều kênh đồng thời
- Giao tiếp UART song song với LCD
- Điều khiển motor kết hợp truyền thông
- Hệ thống IoT đa giao tiếp
Nếu không dùng RTOS
- Code dễ bị delay blocking
- Khó mở rộng khi thêm chức năng
- Khó quản lý nhiều tiến trình đồng thời
4. Cách cấu hình STM32 HAL + FreeRTOS trong STM32CubeMX
Bước 1: Chọn vi điều khiển
- Ví dụ STM32F103C8T6
- STM32F407VET6
- STM32F401VET6
Bước 2: Cấu hình clock
- HSE hoặc HSI
- Thiết lập SYSCLK phù hợp
Bước 3: Enable FreeRTOS
- Middleware → FreeRTOS
- CMSIS V1 hoặc CMSIS V2
Bước 4: Tạo task đầu tiên
- DefaultTask
- Thiết lập priority
- Thiết lập stack size
5. Cấu trúc chương trình FreeRTOS cơ bản
Tạo task
- osThreadDef()
- osThreadCreate()
Ví dụ các task thường dùng
- Task đọc ADC
- Task UART truyền dữ liệu
- Task cập nhật LCD
- Task điều khiển LED
Delay trong FreeRTOS
- osDelay()
- vTaskDelay()

6. So sánh HAL Delay và FreeRTOS Delay
HAL_Delay()
- Blocking CPU
- Task khác không chạy song song
osDelay()
- Nhường CPU cho task khác
- Đúng bản chất hệ điều hành thời gian thực
7. Một ví dụ ứng dụng thực tế
Một hệ thống STM32 có thể chia thành:
- Task 1: đọc cảm biến nhiệt độ LM35
- Task 2: hiển thị LCD1602
- Task 3: truyền UART ra terminal
- Task 4: điều khiển relay theo ngưỡng
8. Các lỗi thường gặp khi mới dùng FreeRTOS
- ⚠️ Stack task quá nhỏ
- ⚠️ Ưu tiên task chưa hợp lý
- ⚠️ Dùng HAL_Delay trong task
- ⚠️ Truy cập biến chung không bảo vệ
9. Khuyến nghị khi học STM32 HAL + FreeRTOS
- ✅ Bắt đầu từ 2 task đơn giản
- ✅ Hiểu rõ scheduler hoạt động
- ✅ Làm quen queue, semaphore, mutex
- ✅ Thực hành với UART và Timer trước
Kết luận
STM32 HAL kết hợp FreeRTOS là bước tiến rất quan trọng để chuyển từ lập trình nhúng cơ bản sang hệ thống nhúng chuyên nghiệp.
Khi nắm chắc HAL và RTOS, người học có thể phát triển:
- Hệ thống điều khiển thời gian thực
- Thiết bị IoT thông minh
- Robot tự động
- Thiết bị công nghiệp nhúng hiện đại