Keil5更新之后,開始支持ARM V6編譯器,新版本的編譯器對C++有了更多的支持,在編譯方面也做了很多的改善,具體的沒有詳細了解,本文只是對STM32 開發下,使用V6版本的編譯器進行STM32的C++開發作一個記錄,方便和大家交流和參考。至於說為什么STM32要C++開發,這個沒有解釋,只是個人覺得C++比C有更多的方便,使得編程更加的容易,C++有更多的生態....
開始上教程:Keil5的安裝和破解以及STM32 pack庫的安裝不在本文范圍之內,需要的話請自己百度,網上以及有了很多的教程。
筆者打開以前的STM32 工程,想自己通過更改編譯器版本實現,結果發現編譯之后會出現很多的錯誤,故還是采取Keil5的建立工程方式來建立新的STM32工程。
項目概覽
第一步:建立Keil5工程-》配置STM32類型。
第二步:STM32工程文件的配置,CMSIS需要勾選CORE,然后在Device下選中STM32 的啟動Startup,最后就是選擇需要外設。(勾選過程全部是綠色為有效,如果出現黃色,可能是有相關的依賴性沒有選中)
第三步:切換到V6編譯器,同時對C/C++進行配置
注意:正常情況下按照上述步驟,不需要進行額外編譯預處理的宏定義,比如定義STM32的芯片密度類型和外設宏等
第四步:程序的編寫:建立main入口,可以行建立main.cpp,或者main.c,注意要檢查文件的類型是不是C++文件類型。然后就可以按照C++方式進行STM32開發,把各種操作包裝到C++類里面,進行更方便的開發。
第五步:注意事項:如果在編譯的過程中,編譯器提示不能識別 class之類關鍵字,則需要檢查相關的類的頭文件的類型是不是C++類型,具體如下:
最后,簡單對C++的Vector 和lambda進行了測試,給出簡單的代碼串口打印輸出:
std::string str="Command ends with '$'\n"; str+="Baude ratio is :115200\n"; str+="Firmware version:1.0\n"; str+="======================\n"; UsartHelper.UsartInit(); UsartHelper.SerialEvent.AttachHandler(this,&System::SerialHandler); UsartHelper.log(str,false); TickerHelper.TickerInit(); TickerHelper.SetIntervalms(1500); TickerHelper.Elapsed.AttachHandler(this,&System::TickerElapsed); //TickerHelper.Start(); std::vector<std::string> vec; vec.push_back("zhangliang"); vec.push_back("lijie"); auto tmpx = vec.at(0); UsartHelper.log(tmpx); UsartHelper.log(vec.at(1)); auto pfun=[](){UsartHelper.log("this is lambda expression");}; pfun();
測試結果串口打印出來如下,可以看到都可以很好執行了。
在最后,祝大家使用C++開發STM32 愉快,有任何的問題可以和我交流,或者大家相互請教,有錯誤或者其他請告知,謝謝!