Lập trình cho stm32 trên linux

Hướng dẫn lập trình STM32 trên linux, không dùng IDE, chỉ gõ lệnh. Nghe thấy hơi phiêu phiêu nhưng mà cách này khá hấp dẫn, bỏ qua mọi rào cản, vượt qua mọi giới hạn, chỉ dành riêng cho các bạn thích ngâm cứu tìm hiểu thêm khi lỡ chuyển từ window sang linux.

Tạm thời như mọi người đã biết thì ta thường phải dùng các IDE như Keil C, IAR để lập trình, mấy cái này thường là dễ dùng, dễ biên dịch, ấn nút cái là có file nạp thẳng vào kit luôn, nhưng cái gì dễ thì thường tiết kiệm được nhiều thời gian, nhưng lại tốn tiền, mà license của mấy cái IDE này thường không rẻ chút nào. Thế nên một số anh em thường đổ xô đi tìm bản chùa (bản cr*ck). Nếu 1 ngày các bản chùa không còn nữa thì chúng ta phải sống ra sao ? Có 2 cách một là bạn xài bản dùng thử, hai là bạn chuyển sang xài compiler miễn phí, mình từng nói qua về cách lập trình STM32 với Ubuntu dùng SW4STM, cái này thì đơn giản dễ làm, chỉ việc cài và dùng chung với CubeMX, tuy nhiên ở bài viết này thì mình muốn làm từ đầu tất cả mọi thứ, chỉ gõ lệnh và nạp chương trình xuống, hơi thủ công một chút

Mình có một bài hướng dẫn chạy ARM với linux khác là TIVA C bạn có thể xem tại đây nếu bạn không dùng STM32.

Chuẩn bị

  • Kit STM32F4 (mình dùng cái có sẵn)
  • Gcc-arm-none-eabi bản 5_4-2016q3-20160926

Tạo thư mục, giải nén GCC và add path

$ sudo apt-get install flex bison libgmp3-dev libmpfr-dev libncurses5-dev libmpc-dev autoconf \texinfo build-essential libftdi-dev libsgutils2-dev zlib1g-dev libusb-1.0-0-dev git
$ mkdir ~/stm32f4
$ cd ~/stm32f4
$ cd ~/Downloads
$ tar -xvf gcc-arm-none-eabi-5_4-2016q3-20160926-linux.tar.bz2 -C ~/Embedded
$ export PATH=$PATH:$HOME/Embedded/gcc-arm-none-eabi-5_4-2016q3/bin

Cái này là cái vất vả nhất, nhiệm vụ là cài libusb, compile và cho phép user có thể truy cập tới st-link, mục đích chính là để nạp được chương trình của bạn xuống kit

$ sudo apt-get install libusb-1.0-0-dev git
$ cd ~/stm32f4
$ git clone https://github.com/texane/stlink.git
$ cd stlink
$ git checkout texane/pipe
$ ./autogen.sh
$ ./configure

Phần này sau khi configure xong sẽ sinh ra Makefile, bạn copy thư viện libusb.h vào thư mục st-link và chỉnh sửa lại makefile dòng 235 LIBS = -lusb-1.0
Sau đó chạy lệnh make bên dưới

$ make
$ sudo mkdir -v /opt/stlink
$ sudo cp -v 49-stlinkv*.rules /etc/udev/rules.d/
$ sudo udevadm control --reload-rules

Chạy thử chương trình

Với thư viện STM32 thì hầu như là không có hỗ trợ cài đặt nhiều trên linux cũng như các IDE miễn phí, tuy nhiên có ông  Karl Palsson có tâm đã viết lại khá nhiều project mẫu mà chúng ta có thể tham khảo và tiện đường thì mình cũng lấy của ổng xài luôn 😀

$ cd ~/stm32f4
$ git clone https://github.com/karlp/kkstm32_base.git
$ cd kkstm32_base/example/stm32f4/STM32F4xx_StdPeriph_Driver/build/
$ make
$ cd ../../Projects/IO_Toggle/
$ make
$ st-flash write IO_Toggle.bin 0x08000000

Đây là kết quả sau khi nạp thành công, cứ có dòng “…Flash written and verified! jolly good!” là ok rồi, bạn có thể xem ở bên dưới kit F4 đang chớp LED ầm ầm nhé

Lập trình cho stm32 trên linux

Lưu ý: Với mạch ST-link v2.1 tạm thời chưa thể flash được nhé, phương án tạm khắc phục là dùng OpenOCD
Cập nhật: đã sử dụng được với mạch ST-Link firmware mới nhất, mình sẽ có bài viết mới để hướng dẫn các bạn sau nha

Tạm kết

Thế là đã xong các bước cài đặt, compile và nạp được một chương trình đơn giản là blink LED xuống kit stm32f4, hi vọng sẽ là khởi đầu trọn vẹn cho các bạn muốn thử thách bản thân trên một môi trường mới và các công cụ opensource.

Tham khảo

[0] [1] [2] [3] [4] [5] [6] [7] [8] [9] [10] [11]

Hướng dẫn lập trình STM32F0 trên LINUX

Với các bạn lập trình vi điều khiển STM32F0 thì phần mềm KeilC dường như quá quen thuộc và phổ biến trên nền tảng Window. Người dùng có thể lập trình và nạp trực tiếp thông qua KeilC với thao tác vài cú click chuột. Tuy nhiên KeilC chỉ thích hợp với người dùng Window thôi. Với người dùng Linux thì đây là bài toán hóc búa để có thể lập trình và nạp mạch. Thì bài viết này, mình sẽ hướng dẫn các bạn cách để có thể thực hiện lập trình và nạp mạch với kit cụ thể là STM32F030F4P6 trên Linux nhé.Các bạn có thể tìm mua kit với link này nhé:

https://epcb.vn/products/kit-phat-trien-arm-cortex-m0-stm32f030f4p6-tich-hop-usb-uart-ch330n

Lập trình cho stm32 trên linux

Các công cụ cần sử dụng:

  • Qt creator: công cụ lập trình C, thích hợp với môi trường Linux
  • ST-FLASH: công cụ flash kit cho ARM
  • Arm GCC và OPENOCD: Công cụ debug cho ARM

Các bước cần thực hiện:

1/ Cài đặt Qt creator

Các bạn vào đường dẫn cài offline bên dưới, chọn bản Qt mới nhất cho Linux, thường thời gian tải từ server sẽ khá lâu nên mình khuyên các bạn tải dùng IDM bên Window rồi vào Linux truy cập file. (file setup cho Linux có đuôi .run)

Link tải Qt Creator: http://download.qt.io/archive/qt/

Video hướng dẫn:

Vào thư mục vừa tải file về mở terminal nhập lệnh (với phiên bản mình tải là 5.13.2):

$ chmod +x qt-opensource-linux-x64-5.13.2.run

./qt-opensource-linux-x64-5.13.2.run

Các bạn điền tài khoản và nhấn next tới khi hoàn thành.

2/ Cài đặt Arm GCC và OpenOCD

Nhấn vào 2 link tải bên dưới và chọn Arm GCC mới nhất và bản OpenOCD. Đây là 2 công cụ quan trọng nhất để tiến hành build code và debug.

  • Link tải Arm GCC (chọn bản Linux x86_64):

https://developer.arm.com/tools-and-software/open-source-software/developer-tools/gnu-toolchain/gnu-rm/downloads

  • Link tải OpenOCD:

https://github.com/morbos/openocd-0.10.0

Tạo thư mục tools nhằm chưa các công cụ build, flash cho project. Folder này nên đặt trong cùng thư mục mẹ chứa project của các bạn. Giải nén 2 file vừa tải vào thư mục tools. Như vậy là hoàn thành cài đặt các phần mềm và firmware nạp.

Lập trình cho stm32 trên linux

3/ Tạo Project Qt

Tải mẫu Project Led_Blink theo đuờng dẫn bên dưới và giải nén vào thư mục mẹ chung với thư mục tools nhằm dễ tùy chỉnh project các bạn hơn:

https://drive.google.com/file/d/1z72XCIc6C-SJ3v8jXVLZEVzuuvhyI4L-/view?usp=sharing

Chọn +New -> Import Project -> Import Existing Project -> Choose

Lập trình cho stm32 trên linux

Trỏ đường dẫn tới thư mục application(thư mục có Makefife) từ project mẫu vừa tải và Open -> Next -> Stick chọn hết -> Next

Lập trình cho stm32 trên linux

Mở file Makefile và tìm dòng đường GCC_PATHOPENOCD_PATH (đối với mình là dòng 14 15). Tại đây các bạn trỏ lại đường dẫn đến 2 thư mục GCC và OPENOCD vừa tải vào mục tools.

Lập trình cho stm32 trên linux

Kiểm tra source thư viện STD đã add vào project của bạn đủ chưa trước khi build nhé. Nếu thiếu thư viện, QT sẽ báo lỗi chưa định nghĩa. Nếu thiếu, các bạn thêm vào source C các hàm trong Makefile.mk ở thư viện STD_Lib nhé. Ở đây mình chỉ dùng GPIO nên chỉ thêm gpio.c của STD:

Lập trình cho stm32 trên linux

Phần code chính các bạn sẽ build trong app.c thay vì main.c như bên KeilC, nhấn Build (hình cây búa) để build chương trình. Nếu Output Compile hiển thị excuted normally là build thành công. Lúc này các bạn đã có thể flash vào kit.

4/ Cài đặt ST-Flash và flash kit

Sau khi hoàn thành cài đặt Qt và các IDE cần thiết, ta tiến hành cài đặt firmware flash code cho STM32:

$ sudo apt-get install git make cmake libusb-1.0-0-dev

$ sudo apt-get install gcc build-essential

Tiếp theo, ta thực hiện clone source ST-Link theo code:

$ cd tools

$ git clone https://github.com/stlink-org/stlink

$ cd stlink

$ cmake .

$ make

Các bạn mở terminal ở thư mục chứa Makefile và nhập code như dưới. Nếu xuất hiện usb st-link như hình là máy tính đã nhận usb và sẵn sàng nạp. Lúc này, các bạn có thể kết nối usb với mạch theo chuẩn SWD:

$ lsusb

Lập trình cho stm32 trên linux

Sau bao nhiêu công đoạn cực nhọc, bạn đã tiến tới giai đoạn cuối cùng. Chỉ cần các bạn nhập lệnh bên dưới là kit được flash hoàn tất và bạn có thể tận hưởng thành quả:)

$ make clean

$ make flash

Lập trình cho stm32 trên linux

Nếu Terminal không báo jolly good! thì các bạn kiểm tra lại dây kết nối và flash lại nhé. Hoặc các bạn có thể flash kit theo lệnh dưới đây, file flash qua st-flash là file có đuôi .bin. Trong VD của mình thì nó sẽ nằm trong mục build_arm_cortex_M0_base_application sau khi các bạn excute code thành công:

st-flash [lựa chọn] {read|write|erase} [tên file] <địa chỉ>

VD: $ st-flash write firmware.bin 0x8000000

Ở phần sau của chuỗi bài viết nạp STM32, mình sẽ giới thiệu cách debug chương trình, cách theo dõi từng symbol nhé.

Hy vọng bài viết này sẽ giúp ích cho các bạn. Nếu các bạn có những thắc mắc cần giải đáp, hãy nhắn tin cho mình qua Fanpage: EPCB hoặc qua Email: .

Cảm ơn các bạn đã theo dõi bài viết và chúc các bạn thành công.