Nội Dung Bài Viết
Trong lập trình STM32F103 thanh ghi, việc tạo delay time trong lập trình STM32F103 chính xác là yêu cầu nền tảng trong hầu hết các ứng dụng nhúng, từ nhấp nháy LED, xử lý nút nhấn, cho đến điều khiển cảm biến và giao tiếp ngoại vi. Nếu sử dụng các vòng lặp delay thủ công, thời gian trễ thường không ổn định và phụ thuộc mạnh vào xung nhịp hệ thống.
SysTick Timer – bộ định thời tích hợp sẵn trong lõi ARM Cortex-M3 của STM32F103 – cung cấp cơ chế tạo ngắt định kỳ với độ chính xác cao, thường được cấu hình ở mức 1ms để xây dựng các hàm delay và đo thời gian hiệu quả. Trong bài viết này, bạn sẽ tìm hiểu chi tiết Delay time trong lập trình STM32F103 bằng SysTick Timer, bao gồm phân biệt blocking delay và non-blocking delay, phân tích ưu nhược điểm, và các ví dụ thực tế khi lập trình STM32F103 bare-metal sử dụng thanh ghi.
Các phương pháp tạo Delay time trong STM32F103

Trong lập trình STM32F103, có hai phương pháp chính để tạo độ trễ dựa trên SysTick timer:
- Blocking Delay (Độ trễ chặn)
- Non-blocking Delay (Độ trễ không chặn)
Mỗi phương pháp có nguyên lý hoạt động, ưu điểm và nhược điểm riêng, phù hợp với từng loại ứng dụng nhúng khác nhau.
Blocking Delay trong STM32F103
Khái niệm Blocking Delay

Blocking delay là phương pháp tạo độ trễ mà trong suốt thời gian delay, CPU bị “chặn”, không thể thực hiện bất kỳ tác vụ nào khác. Phương pháp này thường được triển khai bằng vòng lặp bận (busy-wait), dựa trên biến đếm thời gian từ SysTick timer.
Hàm Delay_ms sử dụng SysTick
Cách hoạt động Blocking Delay
- Khi gọi
Delay_ms(ms), CPU sẽ chờ cho đến khi đủ số ms yêu cầu. - Biến
msTicksđược tăng trong ngắt SysTick (1ms/tick). - Vòng while liên tục kiểm tra thời gian trôi qua cho đến khi đủ.
Ưu điểm của Blocking Delay
- Dễ triển khai, mã nguồn đơn giản.
- Phù hợp cho các chương trình nhỏ, demo, hoặc ứng dụng không yêu cầu đa nhiệm.
Nhược điểm của Blocking Delay
- Lãng phí tài nguyên CPU do CPU bị chặn hoàn toàn.
- Không thể:
- Đọc nút nhấn
- Xử lý UART
- Cập nhật cảm biến
- Không phù hợp cho các hệ thống cần phản hồi nhanh hoặc đa nhiệm.
Ví dụ Blocking Delay điều khiển LED
👉 Trong ví dụ này, mỗi lần gọi Delay_ms(15000):
- CPU bị chặn trong 15 giây
- Mọi tác vụ khác đều bị dừng
Link Github: Download chương trình delay 1ms using systick timer by blocking delay
Non-blocking Delay trong STM32F103
Khái niệm Non-blocking Delay

Non-blocking delay là phương pháp tạo độ trễ không chặn CPU. Thay vì chờ, chương trình liên tục kiểm tra thời gian trôi qua và chỉ thực hiện hành động khi đủ thời gian.
Phương pháp này rất quan trọng trong các hệ thống:
- Có nhiều tác vụ chạy song song
- Cần phản hồi nhanh
- Không dùng RTOS
Nguyên lý hoạt động Non-blocking Delay
- Sử dụng biến toàn cục msTicks (tăng mỗi 1ms bởi SysTick)
- Lưu mốc thời gian bắt đầu
- So sánh:
msTicks - timeStart >= delay_time - Khi đủ thời gian → thực hiện hành động
Ưu điểm của Non-blocking Delay
- CPU vẫn tiếp tục xử lý các tác vụ khác
- Phù hợp cho:
- Đọc nút nhấn
- Giao tiếp UART
- FSM (Finite State Machine)
- Tiết kiệm tài nguyên CPU, hiệu quả cao
Nhược điểm của Non-blocking Delay
- Mã nguồn phức tạp hơn
- Cần quản lý biến thời gian và trạng thái
- Phải cấu hình SysTick timer chính xác
Ví dụ Non-blocking Delay bật/tắt LED mỗi 15s
timeStart_togglelưu thời điểm bắt đầu- Mỗi vòng lặp
while(1):- Kiểm tra thời gian trôi qua
- Không chặn CPU
- LED vẫn bật/tắt chính xác mỗi 15 giây, trong khi hệ thống vẫn hoạt động bình thường
Link Github: Download chương trình delay 1ms using systick timer by non-blocking delay
So sánh Blocking Delay và Non-blocking Delay
| Tiêu chí | Blocking Delay | Non-blocking Delay |
|---|---|---|
| CPU | Bị chặn | Không bị chặn |
| Độ phức tạp | Thấp | Cao hơn |
| Đa nhiệm | ❌ Không | ✅ Có |
| Ứng dụng | Demo, test | Ứng dụng thực tế |
| Kết hợp FSM | ❌ | ✅ |
Kết luận
- Blocking delay phù hợp cho các chương trình đơn giản, test nhanh.
- Non-blocking delay là giải pháp chuẩn trong lập trình STM32F103 thanh ghi, đặc biệt khi:
- Không dùng RTOS
- Cần xử lý nhiều tác vụ đồng thời
- SysTick timer đóng vai trò trung tâm trong việc đo thời gian và tạo delay chính xác.
👉 Việc hiểu rõ và sử dụng đúng blocking / non-blocking delay là nền tảng để phát triển:
- FSM
- Scheduler
- Debounce nút nhấn
- Ứng dụng embedded chuyên nghiệp
