Bắt đầu với STM32 HAL và FreeRTOS

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

STM32 FreeRTOS task

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

FreeRTOS đa nhiệm STM32

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