1. 程式人生 > >ubuntu中安裝配置STM32開發環境

ubuntu中安裝配置STM32開發環境

筆者做嵌入式開發的,主要用到linux系統來做開發,有時候遇到既要開發arm linux,又要掛載MCU的情況(主要是STM32這款),這兩個晶片跨平臺,指令不相容。以前開發STM32是在windows下的IDE,使用keil或者IAR來開發,自從搞arm linux以來,很少開windows系統,兩個系統切來切去著實麻煩。這篇文章主要針對長期使用Linux系統的使用者,有什麼不對的地方,歡迎指正。

接下教教大家怎麼在linux下部署STM32開發環境

首先安裝一個stm32cubemx,該軟體可以在st官網下載,要註冊賬號,還要搞郵件的亂七八糟的步驟就不說了,自行解決

下載下來的檔案中就用到下面兩個檔案

SetupSTM32CubeMX-4.23.0.exe

SetupSTM32CubeMX-4.23.0.linux

順便提一下,cubemx是用java編寫的,安裝需要較新的java環境,這個問題讀者自行解決

命令列下執行SetupSTM32CubeMX-4.23.0.linux,也可以滑鼠雙擊,但是命令列更有逼格一些,推薦使用

安裝完之後/home下面有個STM32CubeMX資料夾,開啟資料夾,雙擊圖中可執行檔案


選擇晶片型號,就選一個stm32f103c8的晶片好了,不嫌累可以在右下方的型號表裡面翻,也可以從左上角的搜尋框直接查詢。

確認型號後點start project開啟一個工程


開啟新世界的大門後是這樣一個介面,推薦把PD0,PD1,PC14,PC15設定為RCC管腳,接外部晶振,並在左邊RCC選項下開啟。接著點上亂七八糟的管腳配置,筆者比較喜歡勾選上freertos作業系統


時鐘配置為外部時鐘,倍頻到72Mhz


NVIC DMA等看情況配置,都不傻,瞎配著多踩幾下坑就會了,就不囉嗦了


點選這個齒輪生成工程,並選擇生成makefile版本的工程,工具鏈暫時先按預設處理吧,後面再講講工具鏈怎麼搞


你以為這就搞好了嗎,嘿嘿,STM32cubeMX還有點bug,生成工程的時候有幾條是重複的,如果不管會導致編譯出錯的,比如圖中選中的部分,75行和108行是一樣的,要手動把Makefile重複的部分刪掉一個


--------------------------------------------------

接下來配置一下交叉工具鏈,STM32的交叉工具鏈是arm-none-eabi-

下載工具鏈,筆者比較喜歡下載原始碼自己編譯,但是這裡一不小心下載成bin檔案了,沒關係,可以執行就好。需要折騰的選擇src版本自行編譯。


找到工具鏈位置,export 一下。或者開啟STM32cubeMX,點選load project,開啟之前生成工程的.ioc檔案,在生成工程時指定工具鏈位置


或者簡單粗暴一點,在makefile裡面直接指定路徑


之後make 一下,生成hex和bin,沒問題~~~~~~oh yeah


----------------------------------------------------------

接下來安裝stlink驅動。

準備工作,先裝上libusb

sudo apt-get install libusb-dev

sudo apt-get install libusb-1.0-0-dev

獲取原始碼

git clone https://github.com/texane/stlink

編譯安裝完成後,./st-flash erase 擦一擦晶片試試

makefile裡面加上一段

#---------------------------- write to mcu -----------------------------#flash:     st-flash write build/$(TARGET).bin 0x8000000


使用命令make flash就能下載程式到MCU裡面去了

需要jlink來除錯的,到http://www.segger.com/jlink-software.html下載linux版本安裝包,具體用法我就告訴你,這道題太難了,我不會做,不會做,讀者自行解決,有好的教程也可以分享給我。

後面還有模擬之類的亂七八糟的,就呵呵了,不會配也很少用。

在這裡可以教大家一個debug技巧,重定向一下printf函式,這裡需要敲一下黑板,在keil下,printf的底層是fputc函式實現的,但gnu下面是_write函式,注意不要搞錯了。


//gnu下用此函式重定向printfint _write (int fd, char *pBuffer, int size) {   int i;    for (i = 0; i < size; i++)     {         while((USART1->SR&0X40)==0);//等待上一次串列埠資料傳送完成         USART1->DR = (uint8_t) pBuffer[i];  //寫DR,串列埠1將傳送資料     }     return size; } //end

最後喜歡寫暫存器程式碼的,可以參考我的開原始碼,我就不喜歡ST的庫,函式名老是變來變去的,今年寫的程式碼明年不能編譯,蛋蛋受不了