Clion實現(xiàn)Stm32標準庫開發(fā)
在網(wǎng)上搜索Clion開發(fā)Stm32,大部分教程都是關(guān)于hal庫的,標準庫的移植教程比較少,而我對標準庫情有獨鐘,打出感情來了,只用Clion的hal庫開發(fā)總感覺少了點什么。對于Clion標準庫移植我只能說,我可以不用,但是我不能沒有。
首先先對比一下標準庫和hal庫的區(qū)別。
標準庫和hal庫性能對比
標準庫:偏向底層,操作繁瑣,運行效率較hal庫高,占用空間小,官方不更新了
hal庫:更加抽象,操作簡單,運行效率較標準庫低,占用空間大,持續(xù)更新
不過對于stm32來說,如此高性能的芯片運行hal庫基本不受性能影響,拿stm32f103c8t6來說,20KB的SRAM空間和64KB的Flash空間以及72mhz高主頻,用hal庫做一些中小型任務(wù)完全無壓力。這是網(wǎng)上的一張Stm32標準庫,hal庫,ll庫和寄存器運行效率對比圖:

下面進入正題,本文包括兩個部分,Clion中開發(fā)Stm32的環(huán)境搭建和標準庫移植。
環(huán)境搭建:
網(wǎng)上教程比較多,我就不寫那么細節(jié)了,我這邊放一篇帶佬寫的文章給大家參考:
https://www.bilibili.com/read/cv6308000/
首先先把環(huán)境搭建的材料發(fā)一發(fā),鏈接如下:
Clion2020破解版:
鏈接:https://pan.baidu.com/s/1HKE8WZEB5zeC8yuGSdraIg?
提取碼:ALYA?
環(huán)境搭建材料:
gcc-arm-none-eabi 交叉編譯器
MinGW CLion配置工具鏈的環(huán)境
STM32CubeMX STM32自動化配置和代碼生成工具
鏈接:https://pan.baidu.com/s/1POex4nDKzCnWCc2ZA1g8zg?
提取碼:ALYA?
關(guān)于安裝,十分簡單,下一步操作按到底即可。其中g(shù)cc-arm和MinGW安裝完畢后需要配置一下環(huán)境變量,配置完畢后重啟電腦,然后打開CMD輸入arm-none-eabi-gcc -v和gcc -v驗證是否安裝成功,有返回信息就安裝成功了。
Win10配置環(huán)境變量:打開此電腦->系統(tǒng)屬性->高級系統(tǒng)設(shè)置->環(huán)境變量





新建,分別輸入你的安裝路徑即可
注意:Stm32CubeMX需要安裝JDK,直接去官網(wǎng)下載安裝就行了
至此,所有材料安裝完畢。
Clion配置:
打開File->Settings->Build,Execution,Devlopment->ToolChains,輸入Mingw的路徑,Clion會自動識別,識別慢的話直接輸入即可。

創(chuàng)建Stm32CubeMX工程
File->New Project->Stm32CubeMX,點擊創(chuàng)建,創(chuàng)建完成后點擊Open with Stm32CubeMX對芯片進行配置。

然后通過CubeMX對芯片進行配置:
先選擇芯片型號,默認給的Stm32F0芯片,點擊更改成你自己的芯片型號,CubeMX會根據(jù)對應(yīng)的芯片生成對應(yīng)的啟動文件,到時候工程就使用它生成的啟動文件。





1.輸入Project Name,注意一定要和你Clion的工程名一模一樣,路徑也需要一模一樣,這樣CubeMX生成的工程就會直接覆蓋Clion工程。
2.選擇Toolchain/IDE為SW4STM32
3.根據(jù)需求選擇堆棧大小,默認給的特別小,堆512B,棧1024B,要知道Stm32f103c8的SRAM有20KB=20480B,完全足夠使用。
最后點擊頂上的GENERATE CODE按鈕項目就創(chuàng)建完畢了。直接把CubeMX關(guān)了就行。

由于此處不使用調(diào)試工具,直接把這窗口關(guān)了,有需求者可以看我上面發(fā)的帶佬寫的博客進行配置。
打開main.c可以看到成功生成了hal庫的代碼,所有準備工作完成。

標準庫移植:
由于我們不使用Hal庫,所以先把他生成的Core和Drivers文件刪除,然后從Keil標準庫模板工程中導入這些文件,我使用的是正點原子F103模板工程。


KeilF103模板工程
我們需要導入上面四個文件夾中的.c和.h文件,導入后的效果如下:

把導入的文件夾里無用的東西全部刪除


再把.c文件和.h文件進行歸類

注意:上面項目目錄中沒有導入STM32F10x_FWLib是因為里面東西太多了不好截圖,我是最后導入的,最終效果如下:


標準庫文件導入完畢后,最后一步就是編譯,通過修改Cmake文件編譯我們剛才導入的c文件和h文件。只需修改第40行和42行即可。

把第40行修改成我們工程中的C文件位置:分別是CORE,SYSTEM,USER和STM32F10x_FWLib
把第42行修改成我們工程中的H文件位置:分別是CORE/Inc,SYSTEM/Inc,USER/Inc和STM32F10x_FWLib/Inc
最后點擊Reload changes等待構(gòu)建結(jié)束

編譯工程:
在編譯前,我們需要打開stm32f10x.h,在里面加入兩句話
這兩個宏定義在Keil里是在此處定義的,所以移植到Clion我們要手動加上


重點
再打開core_cm3.c修改第736行和753行,如果不改編譯直接報錯Assembler messages:Error

736行改成:?
753行改成:

最后打開sys.c,把里面的代碼改成:

終于所有代碼全部修改完畢,可以編譯了!
這里總結(jié)下,修改了哪些地方:
1.stm32f10x.h中加入了兩句宏定義
2.core_cm3.c中第736行和753行修改了兩句內(nèi)聯(lián)匯編
3.sys.c中修改了內(nèi)聯(lián)匯編
編譯:
上面配置完畢后直接點擊綠色三角編譯工程,在編譯之前我們main.c文件里一堆報錯,編譯之后就能正常使用了。


編譯完畢后,再看main.c文件,沒有任何報錯了,并可以直接調(diào)用標準庫函數(shù)

很舒服,終于編譯成功,不過還有個printf()函數(shù),直接使用的話是無法輸出到串口的,可以自己封裝一個串口打印函數(shù),十分簡單。
可以清晰地看到,printf()是無法打印到串口的

至此,關(guān)于F103標準庫的移植已經(jīng)結(jié)束,對于f4系列的移植比f103簡單很多,僅需要在stm32f4xx里添加宏定義即可。
按照你芯片的需求定義,參照此處

至于為什么要用Clion開發(fā),首先是因為顏值和功能強勁,官方支持stm32cubemx工程和調(diào)試工具,其次Clion在許多平臺上都能使用,Mac,Linux和Windows都可以使用。
至于為什么要用Clion移植標準庫,hal庫開發(fā)這么簡單,非要用標準庫呢?原因上面我已經(jīng)說了,這功能我可以不用,但是我不能沒有。
相信很多人都懶得按照我上面的步驟一步步操作,畢竟我自己看了都嫌煩,所以我直接把工程模板發(fā)出來,目前只有F1和F4系列(我給的是F411的,其他型號直接按需求改stm32f4xx.h宏定義就行,F1不用管)的,其他系列標準庫移植同理。
工程模板鏈接:
鏈接:https://pan.baidu.com/s/1gGvMgvZ2yIfCpolGt2HNWA?
提取碼:ALYA?
下載完成后直接用Clion的File->Open...打開,導入后他會報錯,說路徑不對,點擊Tools->Cmake->Reset Cache and Reload Project,完成后就可以正常編譯了

