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ì

Bảng các dòng STM32 theo nhân: Cortex-M0, M0+ gồm F0, G0, L0, C0; Cortex-M3 gồm F1, F2, L1; Cortex-M4 có FPU gồm F3, F4, G4, L4, WB; Cortex-M7 gồm F7, H7; Cortex-M33 gồm L5, U5, H5
Một số dòng STM32 tiêu biểu theo nhân ARM Cortex-M.

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

BoChipƯu điểmLưu ý
Blue PillSTM32F103C8, Cortex-M3 72 MHzRất rẻ, nhiều tài liệuCần ST-Link hoặc mạch USB-serial để nạp; nhiều bo dùng chip tương thích
Black PillSTM32F401 hoặc F411, Cortex-M4Mạnh hơn, cổng USB-C, nạp được qua USB (DFU)Vẫn nên có ST-Link để gỡ lỗi
Nucleonhiều loại, chip chính hãngCó ST-Link sẵn trên bo, chân kiểu Arduino UnoGiá cao hơn
Bo Blue Pill đánh số: chip STM32F103C8; cầu nối BOOT0, BOOT1; đầu SWD gồm 3V3, DIO, CLK, GND; LED nối PC13; cổng USB; nút RESET; thạch anh 8 MHz
Bo Blue Pill (vẽ kiểu chung).

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.
Bốn dây từ ST-Link V2 tới đầu SWD của Blue Pill: 3.3V tới 3V3, GND tới GND, SWDIO tới DIO PA13, SWCLK tới CLK PA14
Bốn dây SWD; thứ tự chân trên ST-Link khác nhau tùy bản, đọc nhãn in trên vỏ.

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

Sáu bước: tạo dự án chọn chip STM32F103C8; cấu hình PC13 là GPIO_Output và SYS Debug là Serial Wire; xung nhịp thạch anh 8 MHz, PLL nhân 9 ra 72 MHz; sinh code HAL; viết code giữa USER CODE BEGIN và END; Build và Run qua ST-Link
Từ dự án mới tới LED nháy trong STM32CubeIDE.
  1. File → New → STM32 Project, tìm và chọn STM32F103C8.
  2. 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.
  3. Mục RCC chọn High Speed Clock là thạch anh (Crystal/Ceramic Resonator); trong tab Clock Configuration đặt PLL để HCLK = 72 MHz.
  4. Lưu lại để công cụ sinh code. Mở Core/Src/main.c, tìm vòng while (1) trong hàm main() 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 */
  1. 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);.

  • 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ượngNguyên nhân thường gặpCách xử lý
Không tìm thấy ST-LinkThiếu driver, dây USB kémCài driver ST-Link (đi kèm CubeIDE), đổi cổng, đổi dây
Không kết nối được chipSai dây SWDIO, SWCLK; chip không có nguồnKiểm tra bốn dây, đo 3,3 V trên bo
Báo chip không phải của STBo dùng chip tương thíchDù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ốiQuên đặt SYS Debug = Serial Wire, chân SWD bị đổi chức năngGiữ 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ínhChưa cấu hình thạch anh và PLL, chip chạy bằng dao động trong 8 MHzCấu hình RCC và Clock Configuration
LED sáng ngược với mong muốnLED PC13 sáng ở mức thấpBình thường trên Blue Pill

9. Học tiếp theo thứ tự nào

  1. GPIO: LED, nút nhấn.
  2. Ngắt ngoài (EXTI) cho nút nhấn. Khái niệm giống ngắt GPIO trên ESP32.
  3. Timer và PWM: đèn mờ dần, servo. Xem thêm PWM trên ESP32.
  4. UART: in ra máy tính. Xem UART là gì.
  5. ADC kèm DMA: đọc cảm biến liên tục không tốn CPU.
  6. I2C, SPI với màn hình, cảm biến: I2C là gì, SPI là gì.
  7. FreeRTOS: nhiều tác vụ chạy song song.

10. Xem thêm


Tin tức liên quan

Trò chơi đo phản xạ với ESP32 và màn hình OLED 4 nút: đo thời gian, tính trung bình
Trò chơi đo phản xạ với ESP32 và màn hình OLED 4 nút: đo thời gian, tính trung bình

Làm trò chơi đo phản xạ bằng ESP32 và màn hình OLED kèm 4 nút: kiểm tra nút, đo thời gian bằng millis, chờ ngẫu nhiên, tính trung bình 5 lượt, thí nghiệm cho học sinh.

Hiệu chuẩn đồng hồ so theo ISO 463 và đồng hồ chân gạt ISO 9493: đặc tính sai số và sai số cosin
Hiệu chuẩn đồng hồ so theo ISO 463 và đồng hồ chân gạt ISO 9493: đặc tính sai số và sai số cosin

Hiệu chuẩn đồng hồ so theo ISO 463: sai số trong 1/10 vòng, 1 vòng, toàn dải, trễ, lặp lại; trình tự trên máy hiệu chuẩn, ví dụ kết quả, sai số cosin của đồng hồ chân gạt.

Quy tắc quyết định và tỉ số TUR: khi nào được kết luận đạt, dải bảo vệ và rủi ro chấp nhận sai
Quy tắc quyết định và tỉ số TUR: khi nào được kết luận đạt, dải bảo vệ và rủi ro chấp nhận sai

Quy tắc quyết định theo ISO/IEC 17025 và ILAC-G8: bốn trường hợp kết quả sát giới hạn, chấp nhận đơn giản và dải bảo vệ, rủi ro chấp nhận sai, tỉ số TUR 4:1 và cách chọn quy tắc.

OLED 0.96 hay 1.3 inch, SSD1306 hay SH1106: chọn màn hình nào và dùng thư viện nào cho đúng
OLED 0.96 hay 1.3 inch, SSD1306 hay SH1106: chọn màn hình nào và dùng thư viện nào cho đúng

So sánh OLED 0,96 inch và 1,3 inch, SSD1306 khác SH1106 ở đâu, chương trình kiểm tra màn dùng chip nào, hiện tượng khi chọn nhầm thư viện và cách đổi chương trình từ SSD1306 sang SH1106.

Áp suất tuyệt đối, dư, chênh, chân không: đơn vị, hiệu chuẩn cảm biến tuyệt đối và an toàn áp cao
Áp suất tuyệt đối, dư, chênh, chân không: đơn vị, hiệu chuẩn cảm biến tuyệt đối và an toàn áp cao

Phân biệt áp suất tuyệt đối, dư, chênh và chân không, đổi đơn vị bar, kgf/cm², psi, hiệu chuẩn cảm biến tuyệt đối bằng chuẩn áp dư và khí áp kế, năng lượng khí nén và quy tắc an toàn.

Jack DC 5.5×2.1 và 5.5×2.5: phân biệt, cực tính, chọn jack gắn hộp và dây nguồn DC
Jack DC 5.5×2.1 và 5.5×2.5: phân biệt, cực tính, chọn jack gắn hộp và dây nguồn DC

Jack DC 5.5×2.1 và 5.5×2.5 khác nhau ở lỗ trong: cách phân biệt khi không có nhãn, ký hiệu tâm dương, đo cực tính adapter, lắp jack gắn hộp và nối nguồn vào mạch an toàn.

Cảm biến biến dạng (strain gauge): cấu tạo, nguyên lý, các loại, chế tạo và đo bằng ADS1115, ESP32
Cảm biến biến dạng (strain gauge): cấu tạo, nguyên lý, các loại, chế tạo và đo bằng ADS1115, ESP32

Cảm biến biến dạng hoạt động thế nào: vì sao điện trở đổi khi bị kéo, gauge factor, strain gauge lá kim loại, bán dẫn, dây rung, sợi quang, bù nhiệt, cách chế tạo và đo µε bằng ADS1115, ESP32.

Cổng logic và IC 74HC: bảng sự thật, đại số Boole, thử IC bằng ESP32
Cổng logic và IC 74HC: bảng sự thật, đại số Boole, thử IC bằng ESP32

Cổng logic NOT, AND, OR, NAND, NOR, XOR và bảng sự thật, mức điện áp logic của 74HC, đại số Boole, định luật De Morgan, cổng NAND vạn năng, IC 74HC và thí nghiệm ESP32 tự đoán loại cổng.


Bình luận
Đã thêm vào giỏ hàng