天天看點

Linux 下 STM32 開發環境搭建

安裝編譯器

如果還沒安裝編譯器的,先安裝:

sudo apt install gcc-arm-none-eabi
sudo apt install gdb-arm-none-eabi
sudo apt install      

安裝 cmake 和 libusb

  • CMake(版本大于 v2.8.7)
  • Libusb 1.0(版本大于 v1.0.9)
sudo apt update
sudo apt install cmake
sudo apt install      

安裝 stlink

下載下傳開源的 STLink 驅動代碼

git      

編譯、安裝

cd stlink/
make
make install      

預設安裝路徑為 ​

​/usr/local/​

​​,可以根據需要指定安裝路徑,例如 ​

​make install DESTDIR=$HOME​

安裝成功後,系統增加了如下幾個工具:

工具 功能

​st-flash​

将二進制檔案固化到 STM32 裝置

​st-info​

查詢已連接配接 STLink 的 STM32 裝置資訊

​st-util​

運作 GDB 服務與 STM32 裝置進行互動

​stlink-gui​

STlink 圖形化工具,如下所示
Linux 下 STM32 開發環境搭建

連接配接測試

剛好我手上有一塊 STM32 NUCLEO-F411R,下面我們将利用它來做個簡單的實驗。

使用 USB 線連接配接開發闆和電腦,執行 ​

​lsusb​

​ 可以看到已經識别到 ST-LINK/v2.1 裝置。

Linux 下 STM32 開發環境搭建

執行 ​

​st-info --probe​

​ 檢視 STLink 裝置資訊。

Linux 下 STM32 開發環境搭建

編譯 bsp 工程

前面我們已經下載下傳好的 rt-thread-4.0.1 源碼,進入 stm32f411-st-nucleo 的 BSP 目錄,直接編譯一下看看。

cd /bsp/stm32/stm32f411-st-nucleo/
source      

編譯不了,原因是交叉編譯工具沒有配置好。打開 rtconfig.py 檔案,找到對應編譯器選項中的 ​

​EXEC_PATH​

​​ 變量,将其修改為本地編譯器所在的目錄,我這裡是 ​

​/usr/bin​

​。

Linux 下 STM32 開發環境搭建

執行 ​

​scons​

​ 建構工程,出現如下錯誤:

......
/home/rudy/workspace_hd/Draft/RTTB/rt-thread-4.0.1/bsp/stm32/libraries/HAL_Drivers/drv_usart.c: In function 'rt_hw_usart_init':
/home/rudy/workspace_hd/Draft/RTTB/rt-thread-4.0.1/bsp/stm32/libraries/HAL_Drivers/drv_usart.c:662:5: error: 'for' loop initial declarations are only allowed in C99 or C11 mode
     for (int i = 0; i < obj_num; i++)
     ^
/home/rudy/workspace_hd/Draft/RTTB/rt-thread-4.0.1/bsp/stm32/libraries/HAL_Drivers/drv_usart.c:662:5: note: use option -std=c99, -std=gnu99, -std=c11 or -std=gnu11 to compile your code
scons: *** [/home/rudy/workspace_hd/Draft/RTTB/rt-thread-4.0.1/bsp/stm32/libraries/HAL_Drivers/drv_usart.o] Error 1      

很明顯,因為代碼中變量定義的風格是 C99 以上标準才支援的,是以需要為編譯器指定 C99 或 C11 模式。打開 rtconfig.py 檔案,在對應編譯器選項中的 ​

​CFLAGS​

​​ 變量末尾添加 ​

​-std=c99​

​ 參數。

Linux 下 STM32 開發環境搭建

重新執行 ​

​scons​

​​ 指令,稍等片刻出現 ​

​scons: done building targets.​

​ 提示,表示編譯成功。可以看到目前目錄下多了 rtthread.elf 和 rtthread.bin 兩個二進制檔案。

下載下傳測試

打開 applications/main.c 檔案,在 main 函數中添加一行列印:

int main(void)
{
    int count = 1;
    /* set LED0 pin mode to output */
    rt_pin_mode(LED0_PIN, PIN_MODE_OUTPUT);

    rt_kprintf("\nI am running RT-Thread in STM32 NUCLEO-F411RE.\n\n");

    while (count++)
    {
        rt_pin_write(LED0_PIN, PIN_HIGH);
        rt_thread_mdelay(500);
        rt_pin_write(LED0_PIN, PIN_LOW);
        rt_thread_mdelay(500);
    }

    return RT_EOK;
}      

重新建構工程

Linux 下 STM32 開發環境搭建

接下來執行 ​

​sudo st-flash write rtthread.bin 0x8000000​

​,将 rtthread.bin 檔案燒寫到闆子的 0x8000000 位址。

Linux 下 STM32 開發環境搭建

看來燒寫成功了!

minicom 連接配接虛拟序列槽

我們還需要連接配接 STLink 虛拟序列槽,看看有沒有列印出我們想要的資訊。首先要确定裝置節點,這裡是 ​

​/dev/ttyACM0​

​,然後執行如下指令進行設定:

sudo      

選擇 “Serial port setup”,設定序列槽裝置為 /dev/ttyACM0,波特率 115200。

Linux 下 STM32 開發環境搭建

選擇 “Save setup as…” 将配置命名為 stlink,該配置檔案儲存在 /etc/minicom/minirc.stlink。

Linux 下 STM32 開發環境搭建

退出,重新輸入 ​

​minicom stlink​

​ 指令,即可打開 ST-LINK 虛拟調試序列槽。

繼續閱讀