Hướng dẫn lập trình STM32 dùng STM32 CubeMX kết hợp với Visual Studio Code, GNU Make A-Z từ Configuration – Code generator, Editor, Complier, Build đến Debug qua dự án mẫu

Mục lục:

  1. Giới thiệu
  2. STM32 CubeMX
  3. Cài đặt GNU Make
  4. Lập trình HAL trên Visual Studio Code
  5. Debug sử dụng Extentions
  6. Debug sử dụng pyOCD

1- Giới thiệu

Dạo qua một vòng trên các website mình thấy có khá nhiều bài viết hướng dẫn lập trình STM32 dùng CubeMX để cấu hình chip STM32 và sinh code, sau đó dùng các IDE như là KeilC để soạn thảo và biên dịch, rất kỹ càng và chi tiết. Tuy nhiên nếu như bạn nào đang quen dùng hệ sinh thái của Visual Studio Code – VSC (đã dùng cái này lập trình cho C/C++, 8051, PIC, ESP8266, ESP32 v.v..) thông qua các Extension như là PlatformIO IDE, Espressif IDF, Code Runner, C/C++ v.v.. Hay là quá thích với các tính năng của VSC như là tính giao diện người dùng cao, tích hợp nhiều nền tảng lập trình All-in-One, lập trình cho nhiều dòng chip khác nhau mà không cần cài nhiều phần mềm v.v.. Ví dụ riêng với dòng STM32 các bạn có thể dùng VSC để lập trình trên các platform như là Arduino, Mbed và ngay cả là HAL. Với Mbed thì mình đã có loạt bài viết hướng dẫn ở đây. Còn trong bài viết này mình sẽ hướng dẫn các bạn dùng CubeMX để cấu hình và sinh code, sau đó soạn thảo chương trình trong Visual Studio Code rồi biên dịch bằng GNU Make và debug với Extentions tích hợp hoặc với pyOCD. Soạn thảo HAL code trên VSC cũng giống như trên KeilC (cái này đã có rất nhiều trên web) do vậy bài viết này chỉ hướng tới cách dùng CubeMX kết hợp với VSC để biên dịch và debug thôi các bạn nhé! Bài toán lập trình mẫu là chúng ta sẽ dùng ngắt TIMER2 để nhấp nháy LED sau mỗi 500ms, sử dụng bộ dao động nội. Vì bài viết khá là dài nên mình sẽ bỏ qua các định nghĩa và các lời giải thích chi tiết, chỉ tập trung đến các bước. Đây được coi như là một cuốn sổ tay lưu lại các bước phù hợp cho những ai xem lại sau một khoản thời gian không dùng tới.

2- STM32 CubeMX

Các bạn tải và CubeMX tại đây (nhớ là đăng ký tài khoản và link tải sẽ gửi về qua E-mail):

https://www.st.com/en/development-tools/stm32cubemx.html

Sau khi tải xong các bạn mở lên và tạo Prj với lựa chọn theo tên chip hoặc theo tên bo KIT, ở đây chúng ta lựa chọn tên chip (của mình đang dùng STM32F104RCT6) do vậy mình sẽ chọn như sau nha:

Khởi tạo xong, các bạn vào như hình để lựa chọn cấu hình nạp và debug, ở đây mình dùng Serial Wire với mạch nạp ST-Link:

Tiếp theo mình chọn chân kết nối với đèn LED là PD2, kích chuột trái tại chân PD2 chọn là GPIO_Output và đặt tên gợi nhớ là LED1_PD2 tại mục Configuration.

Tiếp theo là cấu hình bộ Timer2 với nguồn Clock nội 8MHz chia tới APB1 là 8MHz (APB1 phục vụ Timer2), ở đây mình mong muốn sau mỗi 500ms (0-499) sẽ ngắt 1 lần, và lặp lại như vậy. Tại ngắt Timer mình sẽ để lệnh đảo trạng thái LED.

Tiếp theo mình bật ngắt toàn cục cho Timer2:

Cấu hình cho Clock không có gì cần chỉnh:

Cuối cùng trong giai đoạn này là đặt tên dự án và quan trọng nhất đó là chọn Toolchain/IDE là Makefile để có thể biên dịch và Debug từ Visual Studio Code đã cài cùng với GNU Make và pyOCD. Sau đó bấm Generate Code. Thư mục chứa code được tạo ra sau này sẽ được mở lên với VSC. Nếu như chưa thấy Makefile thì có thể bạn cần cài GNU Make trước.

3- Cài đặt GNU Make

Trước tiên bạn cần cài GCC-arm-none-eabi theo đường dẫn bên dưới:

Download https://developer.arm.com/-/media/Files/downloads/gnu-rm/10-2020q4/gcc-arm-none-eabi-10-2020-q4-major-win32.exec

Hoặc tại:

https://mynewt.apache.org/latest/get_started/native_install/cross_tools.html

Tải về, giải nén và thả vào ổ đĩa C: các bạn nhé! Đường dẫn này sau này chúng ta sẽ thả vào file Makefile trong thư mục Proj của dự án đã tạo ở trên bởi CubeMX.

Bay giờ chúng ta sẽ cài GNU-Make tại đường dẫn:

Download Make: http://gnuwin32.sourceforge.net/packages/make

Tải về và cài xong, copy đường dẫn để thiết lập biến môi trường (Enviroment Variable) như sau:

Để kiểm tra cài thành công chưa, chúng ta mở CMD và bấm lệnh make -v

4- Lập trình HAL trên Visual Studio Code

Mở VSC lên và trỏ vào thư mục của dự án, mở Makefile lên và tạo thêm dòng lệnh này (đây là khai báo đường dẫn đã cài GCC-arm-none-eabi ở trên.

Sau đó thử biên dịch bằng cách mở Terminal (Terminal->New Terminal) gõ lệnh make

Chú ý là trước khi bấm lệnh make mà thấy có báo lỗi ở main.c thì cứ kệ nó nhé, cứ biên dịch xem thử, làm xong lệnh make sẽ tự biến mất. Nếu mà có báo lỗi là thiếu file stddef.h thì thêm đường dẫn này (chú ý đổi lại dấu thư mục \ thành /) vào file c-pp_properties.json. Để mở file json này các bạn có thể bấm ctr+shift+p (thẻ show and run commands).

Và thêm ở vị trí này như hình:

Hoặc khi bấm make mà thấy báo là Nothing to be done for ‘all’ nghĩa là không có thay đổi nào cần để build lại –> không cần gõ make để build lại đâu.

Các bạn tìm đến file stm32f1xx_it.c có hàm thực thi ngắt Timer2, đó là hàm TIM2_IRQHandler.

Ctr và kích chuột trái tại dòng HAL_TIM_IRQHandler(&htim2); sẽ nhảy đến file chứa hàm này:

Các bạn tìm đến dòng HAL_TIM_PeriodElapsedCallback(htim);

Ctrl + chuột trái để đi đến nội dung cần copy:

Sau đó dán vào khu vực tiền xử lý trên hàm main() trong main.c và có thêm đoạn chương trình để đảo trạng thái LED khi có sự kiến ngắt timer2.

Và cuối cùng là các bạn tiến hành build lại chương trình với lệnh make như mô tả ở đoạn trên.

File *.bin sẽ có tại thư mục như sau, và đây là file mà các bạn có thể lấy để nạp vào chip với mạch nạp ST-Link:

5- Debug sử dụng Extension

Ưu điểm của Debug sử dụng Extension là nhanh chóng, dễ dàng.

Bạn có thể sử dụng Extension sau:

Bạn cần chỉnh lại một chút trong file launch.json:

Thẻ debug sẽ xuất hiện như thế này sau khi đã chỉnh lại cấu hình:

Hoặc bạn cũng có thể sử dụng Extension sau:

Sau khi cài xong sẽ xuất hiện biểu tượng của nó ở thẻ bên trái của VSC như hình:

Các bạn kích vào và sẽ thấy ban đầu khi chưa có cài đặt gì thì sẽ xuất hiện mặc định như sau, bạn cần cài đặt tại thẻ “Install Build tools”.

Cài xong sẽ xuất hiện các tools như là Build, Flash, Debug:

Bạn có thể debug bằng cách bấm vào thẻ Debug STM32 ở trên, và sau đó tiến hành các thao tác debug như bình thường.

6- Debug sử dụng pyOCD

Tương tự như debug bằng Extension, chúng ta cũng có thể dùng một cách debug khác các với pyOCD, với cách này các bạn cần cài python, với win10 thì có thể cài trực tiếp trong app cũng được nhé các bạn.

Tiếp đến các bạn cần tải file sau và lưu dưới định dạng *.py tại Desktop. Đường dẫn để tải về là https://bootstrap.pypa.io/pip/2.7/get-pip.py

Sau đó các bạn mở CMD lên, di chuyển thư mục hiện hành về Desktop và chạy lệnh như bên dưới:

Các lệnh đó là: python get-pip.py và python -m pip install -U pip

Có thể kiểm tra version sau khi cài xong bằng lệnh: pip –version

Tiếp theo, bạn cần cài Git để có thể tải và cài pyOCD. Cài Git các bạn cần tải về máy bản cài theo đường dẫn: https://git-scm.com/download/win

Để kiểm tra phiên bản Git các bạn có thể dùng lệnh git –version

Bây giờ chúng ta có thể cài đặt pyOCD bằng lệnh sau:

python -mpip install –pre -U git+https://github.com/pyocd/pyOCD.git@develop

Sau đó di chuyển thư mục hiện hành về pyOCD bằng lệnh: cd pyOCD

Tiến hành cài đặt biến môi trường bằng lệnh python -m venv venv

Chúng ta có thể kiểm tra pyOCD bằng lệnh pyOCD như hình:

Thiết lập biến môi trường theo đường dẫn sau: C:\Users\ACER\pyOCD\venv\Scripts (tên máy của mình là ACER). Sau đó các bạn có thể kiểm tra pyocd ngay trong VSC với lệnh như sau:

Vậy là bây giờ chúng ta có thể debug được proj tương tự như với Extention.

Chúc các bạn thành công và trải nghiệm thích thú lập trình HAL cho STM32 trên Visual Studio Code với CubeMX, GNU Make, pyOCD nhé! Dự án mẫu được sử dụng các bạn có thể tải về ở đây.

Leave a comment

This site uses Akismet to reduce spam. Learn how your comment data is processed.