Lập trình STM32 từ A tới Z

lập trình stm32 từ A tới Z sử dụng HAL và CubeMx

Lập trình STM32 cần những kiến thức gì? Tại sao nên học Lập trình trên dòng chip STM32 nói riêng và các dòng chip lõi ARM nói chung?

Học lập trình STM32 như thế nào là nhanh nhất?

Trong bài viết này, mình sẽ giới thiệu từ khái quát đến cụ thể các bước bạn phải trải qua để có thể làm chủ dòng chip STM32.

Bắt đầu nhé!

Tại sao nên chọn STM32

STM32 là dòng chip 32 bit của hãng STMicroelectronics (ST), sử dụng lõi ARM Cortex-M mạnh mẽ, hiệu năng tốt nhưng vẫn giữ được giá thành rẻ. Vì vậy STM32 phù hợp với đa số các công ty hiện nay.

Các lý do nên chọn STM32 đó là:

  • Tốc độ xử lý cao, hỗ trợ rất nhiều ngoại vi. Ngay cả dòng phân khúc thấp như STM32F030 cũng chạy được tới 48 MHz, có tới 64 kB Flash, 8 kB RAM, nhiều bộ Timer 16 bit, bộ ADC 12 bit nhiều kênh, cùng các bộ USART, SPI, I2C.
  • Giá thành rẻ nhưng hiệu quả đem lại lớn.
  • Học lập trình STM32 khá dễ dàng do cộng đồng hỗ trợ nhiều.
  • Dễ xin việc do các công ty vừa và nhỏ sử dụng STM32 trong rất nhiều ứng dụng.
  • Công cụ lập trình đều miễn phí (CubeMX, CubeIDE) và có đầy đủ tài liệu hỗ trợ.

Nếu đem STM32 ra so sánh với các dòng chip khác thì vẫn có những khuyết điểm. Thế nhưng xét mặt bằng chung, STM32 vẫn là lựa chọn tối ưu khi học lập trình.

Lập trình stm32 trên kit Bluepill

Lưu ý: Rất nhiều kit Blue Pill bán trên thị trường gắn chip clone (CKS32, CS32, APM32…) thay vì STM32F103C8T6 chính hãng. Khi nạp bằng STM32CubeIDE hoặc ST-Link, bạn có thể gặp lỗi kiểu “Unknown device” hoặc “IDCODE không khớp”. Nếu nạp mãi không được, hãy soi kỹ dòng chữ in trên chip trước khi nghi ngờ code của mình.

Lập trình STM32 cần những kiến thức gì?

Kiến thức về ngôn ngữ lập trình

Lập trình STM32 nói riêng hay lập trình Vi Điều Khiển (MCU) nói chung đều sử dụng 2 ngôn ngữ chính là C và C++. Để học được lập trình vi điều khiển, bạn chắc chắn phải nắm rõ ngôn ngữ C, đặc biệt là con trỏ, struct và các phép toán trên bit.

Đây chính là nền tảng, phần cốt yếu. Vì ngôn ngữ lập trình chính là cách biểu diễn yêu cầu của con người theo một quy chuẩn, để máy tính có thể hiểu và làm theo.

Lập trình chính là phiên dịch ngôn ngữ của con người sang ngôn ngữ của máy tính

Tiếp đến là các phương pháp lập trình với ngôn ngữ đó. Có 3 phương pháp lập trình chính:

  • Lập trình tuyến tính: thường được sử dụng cho các chương trình đơn giản, các lệnh chạy lần lượt theo một chiều từ trên xuống.
  • Lập trình hướng cấu trúc (POP) hay còn gọi là lập trình hướng thủ tục: phương pháp này chia bài toán thành nhiều khối (hàm), sử dụng các câu lệnh điều kiện để điều hướng chương trình. Các khối lệnh lớn sẽ được chia thành các khối lệnh con, nhằm đơn giản hóa việc lập trình.
  • Lập trình hướng đối tượng (OOP): là phương pháp được sử dụng nhiều ở tầng ứng dụng, giúp code dễ bảo trì và nâng cấp.

Để hiểu rõ hơn về lập trình hướng đối tượng, bạn có thể đọc thêm: Sự khác nhau giữa lập trình hướng cấu trúc và hướng đối tượng

Kiến thức về kiến trúc vi điều khiển

Kiến trúc vi điều khiển về cơ bản là giống nhau với bất kì dòng vi điều khiển nào bạn sử dụng. Bạn phải hiểu vi điều khiển là gì, nó hoạt động như thế nào thì việc học lập trình trên vi điều khiển sẽ dễ dàng hơn.

Có một khó khăn rất lớn khi bạn học xong ngôn ngữ lập trình C rồi sử dụng nó để lập trình vi điều khiển: khi học ngôn ngữ C trên Turbo C hoặc Dev C, chúng ta học nặng về giải thuật và cú pháp. Thế nhưng khi học vi điều khiển, chúng ta sẽ phải tìm hiểu tới bộ nhớ, kiểu dữ liệu và cấu trúc dữ liệu.

Một chương trình viết trên Dev C có thể biên dịch và chạy được ngay trên máy tính, thế nhưng một chương trình muốn chạy trên vi điều khiển cần nhiều hơn thế: cấu hình xung nhịp, cấu hình chân, nạp code xuống chip… Đây cũng là lý do nhiều bạn không theo được lập trình vi điều khiển.

Học lập trình STM32, chúng ta phải hiểu về kiến trúc của STM32, cấu trúc bộ nhớ và các ngoại vi của vi điều khiển đó.

Cách sử dụng các ngoại vi, chuẩn giao tiếp

Nếu coi vi điều khiển (MCU) là một con người đầy đủ ngũ quan, thì lõi xử lý (CPU) chính là bộ não. Còn mắt, mũi, miệng, tai, tay chân chính là các ngoại vi (Peripheral). Các ngoại vi này phối hợp với CPU để giao tiếp với môi trường bên ngoài.

Để làm chủ được vi điều khiển, chúng ta cần học cách sử dụng các ngoại vi đó. Mỗi vi điều khiển đều có một danh sách ngoại vi khác nhau tùy thuộc vào nhà sản xuất. Chúng ta có thể đọc trong Datasheet và Reference Manual của linh kiện đó.

Để biết cách đọc datasheet, các bạn đọc bài viết: Hướng dẫn đọc Datasheet cho sinh viên điện tử và lập trình

Lập trình STM32 chính là học cách sử dụng các ngoại vi của chip STM32 để tương tác với người dùng hoặc với môi trường.

Phân tích bài toán ứng dụng thành các bài toán lập trình

Để hoàn toàn làm chủ được một vi điều khiển, chúng ta phải biết cách phân tích bài toán thực tế thành các bài toán lập trình. Sau đó phân chia bài toán để cùng nhau hoàn thiện sản phẩm.

Ví dụ với bài toán “máy cho cá ăn tự động”, ta tách ra thành: đọc thời gian thực (RTC), điều khiển động cơ (PWM), hiển thị (LCD), cài đặt giờ (nút nhấn). Mỗi phần nhỏ đều tương ứng với một bài học ngoại vi bên dưới.

Những người có thể phân tích được vấn đề đều phải hiểu rõ cả phần cứng và phần mềm. Một chuyên gia như vậy thường giữ vị trí Software Architect và nhận mức lương khá cao.

Khi học lập trình STM32, chúng ta cần sử dụng những kiến thức đó để tạo ra các sản phẩm thực tế, như vậy sẽ nâng cao khả năng phân tích, giải quyết vấn đề. Và quan trọng nữa là, khi bạn có thành quả thì việc học sẽ trở nên dễ dàng hơn.

Các công cụ cần thiết để học lập trình STM32

Bài 0 phần 1: Cài đặt STM32 CubeMX và package

Bài 0 phần 2: Hướng dẫn cài đặt Keil C và package

Hướng dẫn cài đặt và sử dụng ST Link Utility cài driver mạch nạp

Hướng dẫn Download và sử dụng Hercules Terminal công cụ cổng COM ảo

Hướng dẫn cài đặt STM32CubeIDE và nạp chương trình đầu tiên (sắp ra mắt)

Kiến trúc bộ nhớ STM32 và phần lõi ARM

Những kiến thức về kiến trúc, cấu trúc bộ nhớ STM32 là phần rất quan trọng nếu chúng ta muốn học thật sâu. Chúng giúp ta hiểu hơn về vi điều khiển nói chung và dòng chip STM32 nói riêng.

Tổng quan về vi xử lý lõi ARM Cortex M3, M4, M7

Tổng quan về hệ sinh thái STM32 Cube

Cấu trúc và bản đồ bộ nhớ STM32F103

Các bài hướng dẫn lập trình STM32 điều khiển các ngoại vi sử dụng HAL

Điều khiển các ngoại vi (peripheral) là những bài học bắt buộc để có thể làm chủ một loại vi điều khiển nào đó. Về cơ bản, các ngoại vi đều có cách hoạt động giống nhau giữa các hãng. Khi đã sử dụng thành thạo, chúng ta có thể chuyển sang dòng chip khác dễ dàng.

Bài 1: Tạo project đầu tiên và hiểu rõ mã nguồn được tạo ra từ CubeMX (sắp ra mắt)

Bài 2: Tổng quan về KIT STM32F103C8T6 Blue Pill

Bài 3: Lập trình STM32 GPIO, điều khiển Led bằng nút nhấn

Bài 4: Lập trình ngắt ngoài STM32 EXTI

Bài 5: Lập trình Timer STM32 chớp tắt led dùng ngắt

Bài 6: STM32 Timer chế độ Input Capture và Output Compare

Bài 7: STM32 Timer chế độ PWM nhiều kênh

Bài 8: Lập trình STM32 đọc ADC một kênh

Bài 9: Lập trình STM32 ADC nhiều kênh dùng DMA

Bài 10: Giao thức I2C, lập trình STM32 với Module RTC DS3231

Bài 11: Lập trình STM32 với giao thức UART

Bài 12: Lập trình STM32 với giao thức SPI

Bài 13: Lập trình STM32 RTC, hẹn giờ thời gian thực

Bài 14: Sử dụng STM32 Independent Watchdog

Bài 15: Sử dụng STM32 Window Watchdog

Bài 16: Lập trình STM32 USB CDC truyền dữ liệu qua cổng COM

Bài 17: Lập trình STM32 USB HID chuột máy tính

Bài 18: Lập trình STM32 USB HID Bàn phím máy tính

Bài 19: Lập trình STM32 USB HID Custom

Bài 20: Lập trình STM32 flash đọc, ghi, xóa dữ liệu

Bài 21: Lập trình STM32 Bit Banding điều khiển GPIO

Bài 22: Lập trình STM32 CAN Bus giao tiếp giữa các board STM32 (sắp ra mắt)

Lập trình STM32 giao tiếp với cảm biến và thiết bị

Bài 1: Tạo Delay Us với Timer và cách hoạt động của Systick

Bài 2: STM32 với nút nhấn 3 chế độ click, double click và long click.

Bài 3: STM32 với LED 7 đoạn

Bài 4: STM32 với LCD1602 chế độ 8 Bit và 4 Bit

Bài 5: STM32 với LCD I2C sử dụng module PCF8574

Bài 6: STM32 với DHT11 theo chuẩn giao tiếp 1 Wire

Bài 7: STM32 với DS18B20 đọc nhiệt độ chuẩn 1 wire

Bài 8: STM32 với TFT LCD ST7735 giao thức SPI

Bài 9: STM32 với Keypad

Bài 10: STM32 với OLED SSD1306

Bài 11: STM32 với DFPlayer

Bài 12: STM32 với RFID RC522 (sắp ra mắt)

Bài 13: STM32 với SRF05 (sắp ra mắt)

Bài 14: STM32 với TFT LCD ILI9341 (sắp ra mắt)

Bài 15: STM32 với Servo (sắp ra mắt)

Lập trình STM32 với các ngoại vi cấp cao trên STM32F407

Bài 1: Lập trình STM32 DAC tạo sóng Sin

Bài 2: Lập trình STM32 SDIO giao tiếp với thẻ nhớ

Bài 3: Lập trình STM32 USB HID Host giao tiếp với chuột và bàn phím máy tính

Bài 4: Lập trình STM32 USB MSC biến STM32 thành 1 chiếc USB (sắp ra mắt)

Bài 5: Lập trình STM32 USB MSC Host đọc dữ liệu từ USB

Bài 6: Lập trình STM32 I2S phát âm thanh từ USB với CS43L22 (sắp ra mắt)

Bài 7: Lập trình STM32 FSMC giao tiếp với màn hình TFT giao thức 16 bit (sắp ra mắt)

Lập trình hệ điều hành với STM32 Freertos

Lộ trình đầy đủ các bài RTOS các bạn xem tại: Lập trình FreeRTOS với STM32 từ A tới Z (sắp ra mắt)

Tổng quan về hệ điều hành thời gian thực RTOS

Bài 1: Tạo Task và Scheduling Task với STM32 FreeRTOS

Bài 2: Các trạng thái của Task trong RTOS

Bài 3: Queue trong FreeRTOS – Message Queue và Mail Queue (sắp ra mắt)

Bài 4: Cách sử dụng Semaphore trong lập trình STM32 FreeRTOS (sắp ra mắt)

Bài 5: Cách sử dụng Mutex trong lập trình STM32 FreeRTOS (sắp ra mắt)

Bài 6: Đồng bộ nhiều sự kiện với Event Group (sắp ra mắt)

Bài 7: Task Notification, cách giao tiếp nhanh và nhẹ giữa các Task (sắp ra mắt)

Bài 8: Software Timer trong FreeRTOS (sắp ra mắt)

Kiến thức nâng cao

Hướng dẫn Debug trên Keil C

Cách sử dụng printf để in Log trên STM32

Khóa code với Option Bytes (sắp ra mắt)

Lập trình STM32 Bootloader (sắp ra mắt)

Ring Buffer là gì, nhận dữ liệu UART sử dụng Ring Buffer (sắp ra mắt)

STM32 Low Power Mode (sắp ra mắt)

Hướng dẫn phân tích bài toán lập trình (sắp ra mắt)

Thiết kế phần cứng, thiết kế mạch in STM32

Download tài liệu lập trình STM32

Hướng dẫn download tài liệu lập trình STM32

Link Github các ví dụ trong khi học:
STM32F103 HAL Example: https://github.com/khuenguyencreator/stm32f103-hal-examples

STM32 F407 Example: https://github.com/khuenguyencreator/stm32f407-examples

STM32 Lib cảm biến: https://github.com/khuenguyencreator/stm32-device-drivers

STM32 Lib Example: https://github.com/khuenguyencreator/stm32f103-device-examples

STM32 FreeRTOS Example: https://github.com/khuenguyencreator/stm32f103-rtos-examples

Khóa học lập trình STM32

Đăng kí: Khóa học lập trình STM32 thanh ghi

Đăng kí: Khóa học lập trình STM32 HAL

Kết

Việc lập trình STM32 hay một dòng vi điều khiển nào khác đều cần thời gian để kiến thức ngấm vào từ từ. Dù bạn sử dụng phương pháp học nào thì cũng cần thời gian để tiêu hóa lượng kiến thức đó.

Lưu ý: Đừng chỉ đọc bài rồi bỏ qua. Hãy tự tay tạo project, nạp code và thử thay đổi cấu hình (đổi chân, đổi tần số, đổi baudrate) để thấy chuyện gì xảy ra. Rất nhiều lỗi chỉ lộ ra khi chạy trên phần cứng thật.

Đôi khi học lập trình vi điều khiển không cho kết quả ngay như khi học lập trình các ngôn ngữ khác. Thế nhưng khi kiến thức đã chín muồi, bạn có thể làm được nhiều điều hơn thế, và cơ hội dành cho bạn cũng sẽ rộng mở hơn rất nhiều.

Nếu thấy bài viết này hay, hãy chia sẻ tới những người bạn học hay đồng nghiệp của mình. Và nếu thắc mắc điều gì, hãy để lại bình luận nhé.

Và cùng gia nhập những người nghiện lập trình tại đây nhé: Hội anh em nghiện lập trình

4.8/5 - (32 bình chọn)

49 những suy nghĩ trên “Lập trình STM32 từ A tới Z”

  1. Trung Dũng nói:

    Anh ơi làm sao có thể liên lạc với a được ạ, em đang cần a giúp tí: zalo em (0388883806) rất mong a phản hồi

  2. Nam Ngọc Trịnh nói:

    anh ơi cho em hỏi em đọc encoder bị nhiễu nên em để cái input filter bằng 15, anh giải thích vì sao lại số 15 k anh.

  3. lê tuấn nói:

    mong a có thể ra video hướng dẫn lập trình chương trinh đồng hồ cho led matrix p5full dùng ds3231 và kết hợp wifi esp8266 ạ

Để lại một bình luận

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *