Bắt đầu với STM32: chọn Blue Pill, Black Pill hay Nucleo, ST-Link, STM32CubeIDE, nháy LED đầu tiên
Bắt đầu với STM32: các dòng theo nhân Cortex-M, chọn Blue Pill, Black Pill hay Nucleo, nối ST-Link qua SWD, tạo dự án STM32CubeIDE nháy LED PC13 bằng HAL, nạp không cần ST-Link và lỗi hay gặp.
STM32 là họ vi điều khiển 32 bit được dùng rất rộng trong thiết bị công nghiệp, máy in 3D, mạch điều khiển bay, thiết bị y tế, và xuất hiện trong nhiều tin tuyển dụng kỹ sư nhúng. Sau khi đã quen Arduino và ESP32, học STM32 giúp hiểu sâu hơn về thanh ghi, xung nhịp, ngắt, DMA và cách gỡ lỗi chuyên nghiệp. Bài này giới thiệu các dòng STM32, chọn bo để học (Blue Pill, Black Pill, Nucleo), công cụ STM32CubeIDE và ST-Link, chương trình nháy LED đầu tiên, các lỗi hay gặp và lộ trình học tiếp.
1. STM32 là gì

STM32 do hãng STMicroelectronics sản xuất, dùng nhân xử lý ARM Cortex-M. Họ chip rất lớn: từ dòng giá rẻ, tiết kiệm điện (F0, G0, L0) tới dòng hiệu năng cao (H7), dòng có Bluetooth (WB). Cùng một bộ công cụ và thư viện dùng được cho mọi dòng, nên học một dòng là chuyển sang dòng khác khá nhanh. Tên chip cho biết nhiều thông tin: ví dụ STM32F103C8: dòng F1, gói 48 chân (C), 64 KB Flash (8).
2. Vì sao học STM32 sau Arduino, ESP32
- Gần với phần cứng hơn: tự cấu hình xung nhịp, bật tắt từng khối ngoại vi, hiểu thanh ghi và ngắt.
- Gỡ lỗi thật sự: qua ST-Link, dừng chương trình ở từng dòng, xem giá trị biến, thanh ghi khi chip đang chạy, thay vì chỉ in ra Serial.
- Ngoại vi mạnh: timer cho điều khiển động cơ, ADC nhanh kèm DMA, CAN, nhiều UART.
- Dùng trong sản phẩm: nhiều thiết bị công nghiệp, ô tô, y tế dùng STM32 hoặc chip ARM tương tự.
3. Chọn bo để học
| Bo | Chip | Ưu điểm | Lưu ý |
|---|---|---|---|
| Blue Pill | STM32F103C8, Cortex-M3 72 MHz | Rất rẻ, nhiều tài liệu | Cần ST-Link hoặc mạch USB-serial để nạp; nhiều bo dùng chip tương thích |
| Black Pill | STM32F401 hoặc F411, Cortex-M4 | Mạnh hơn, cổng USB-C, nạp được qua USB (DFU) | Vẫn nên có ST-Link để gỡ lỗi |
| Nucleo | nhiều loại, chip chính hãng | Có ST-Link sẵn trên bo, chân kiểu Arduino Uno | Giá cao hơn |

LED trên Blue Pill nối với chân PC13 và sáng khi chân này ở mức thấp. Cầu nối BOOT0 để ở 0 thì chip chạy chương trình trong Flash; đặt 1 rồi nhấn RESET thì chip vào chế độ nạp qua UART1.
4. Công cụ cần có
- STM32CubeIDE (miễn phí, của ST): soạn code, cấu hình chân và xung nhịp bằng giao diện đồ họa (phần CubeMX), biên dịch, nạp và gỡ lỗi.
- ST-Link: mạch nạp và gỡ lỗi qua cổng SWD. Bản ST-Link V2 nhỏ gọn đủ dùng cho học tập; bo Nucleo có sẵn ST-Link.
- STM32CubeProgrammer: nạp file chương trình qua ST-Link, UART hoặc USB.
- Lựa chọn khác: lõi Arduino cho STM32 (viết như Arduino), PlatformIO.
5. Nối ST-Link

Khi cấp nguồn từ ST-Link (chân 3.3V) thì không cần cắm USB của bo. Nếu cắm cả hai, nhiều người bỏ dây 3.3V và chỉ nối GND, SWDIO, SWCLK để tránh hai nguồn đấu vào nhau.
6. Chương trình nháy LED đầu tiên

- File → New → STM32 Project, tìm và chọn STM32F103C8.
- Trong màn hình sơ đồ chân: bấm PC13 chọn GPIO_Output; mục System Core → SYS → Debug chọn Serial Wire.
- Mục RCC chọn High Speed Clock là thạch anh (Crystal/Ceramic Resonator); trong tab Clock Configuration đặt PLL để HCLK = 72 MHz.
- Lưu lại để công cụ sinh code. Mở
Core/Src/main.c, tìm vòngwhile (1)trong hàmmain()và thêm hai dòng:
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_13); // đảo trạng thái LED PC13
HAL_Delay(500); // chờ 500 ms
}
/* USER CODE END 3 */
- Bấm Run: công cụ biên dịch, nạp qua ST-Link, LED nháy mỗi nửa giây. Bấm Debug để chạy từng dòng, đặt điểm dừng.
Code phải nằm giữa các cặp chú thích USER CODE BEGIN và USER CODE END: mỗi lần đổi cấu hình và sinh lại code, phần nằm ngoài sẽ bị xóa. HAL_GPIO_TogglePin() thuộc thư viện HAL của ST; bên dưới, nó chỉ đổi một bit trong thanh ghi dữ liệu ra của cổng C, tương đương GPIOC->ODR ^= (1U << 13);.
7. Nạp khi không có ST-Link
- Blue Pill qua UART1: nối mạch USB-serial 3,3 V vào PA9 (TX của chip) và PA10 (RX), đặt BOOT0 = 1, nhấn RESET, rồi nạp bằng STM32CubeProgrammer chế độ UART. Nạp xong đặt BOOT0 = 0.
- Black Pill qua USB: giữ nút BOOT0, nhấn và thả NRST, thả BOOT0; máy tính thấy thiết bị DFU, nạp bằng STM32CubeProgrammer chế độ USB.
Hai cách này nạp được nhưng không gỡ lỗi từng dòng được; muốn học bài bản vẫn nên có ST-Link.
8. Lỗi hay gặp
| Hiện tượng | Nguyên nhân thường gặp | Cách xử lý |
|---|---|---|
| Không tìm thấy ST-Link | Thiếu driver, dây USB kém | Cài driver ST-Link (đi kèm CubeIDE), đổi cổng, đổi dây |
| Không kết nối được chip | Sai dây SWDIO, SWCLK; chip không có nguồn | Kiểm tra bốn dây, đo 3,3 V trên bo |
| Báo chip không phải của ST | Bo dùng chip tương thích | Dùng công cụ khác (OpenOCD, PlatformIO) hoặc chọn bo chính hãng |
| Lần nạp đầu được, lần sau không kết nối | Quên đặt SYS Debug = Serial Wire, chân SWD bị đổi chức năng | Giữ RESET khi bắt đầu nạp (connect under reset), hoặc nạp qua BOOT0 = 1; rồi bật lại Serial Wire |
| Chương trình chạy chậm hơn dự tính | Chưa cấu hình thạch anh và PLL, chip chạy bằng dao động trong 8 MHz | Cấu hình RCC và Clock Configuration |
| LED sáng ngược với mong muốn | LED PC13 sáng ở mức thấp | Bình thường trên Blue Pill |
9. Học tiếp theo thứ tự nào
- GPIO: LED, nút nhấn.
- Ngắt ngoài (EXTI) cho nút nhấn. Khái niệm giống ngắt GPIO trên ESP32.
- Timer và PWM: đèn mờ dần, servo. Xem thêm PWM trên ESP32.
- UART: in ra máy tính. Xem UART là gì.
- ADC kèm DMA: đọc cảm biến liên tục không tốn CPU.
- I2C, SPI với màn hình, cảm biến: I2C là gì, SPI là gì.
- FreeRTOS: nhiều tác vụ chạy song song.
10. Xem thêm
- Phụ kiện: dây cắm cái–cái để nối ST-Link, dây USB có lõi dữ liệu.
- Các bài cùng loạt lộ trình: chọn Arduino, ESP32, STM32 hay Raspberry Pi; C cho vi điều khiển (phép toán bit, con trỏ thanh ghi, volatile).
Xem thêm