【項(xiàng)目開(kāi)源】在STM32上跑Arduino的程序
可能不少接觸過(guò)STM32 和Arduino的小伙伴看到標(biāo)題覺(jué)得很神奇,STM32上怎么能跑Arduino 的程序呢?,我第一次Arduino的2000人交流群里發(fā)這個(gè)項(xiàng)目時(shí)候,大家也覺(jué)得很神奇。
可能傳統(tǒng)學(xué)習(xí)路線 ( 51 -> STM32 -> 各種Arm核心MCU )? 的單片機(jī)工程師并不了解什么是Arduino,Arduino是一個(gè)以avr單片機(jī)作為硬件(現(xiàn)在不光支持avr了,還有STM32、ESP8266等等),擁有數(shù)以千計(jì)的開(kāi)源項(xiàng)目的電子設(shè)計(jì)平臺(tái)。比如你玩pid ,你不懂pid 可以直接Arduino IDE的庫(kù)管理中下載別人封裝好的PID庫(kù),比如你想玩?zhèn)€MQTT遠(yuǎn)程控制,Json解析/正則表達(dá)式,NTP服務(wù) ... 不需關(guān)心MQTT的底層原理,Json怎么解析。雖然傳統(tǒng)單片機(jī)上也可以移植cJSON庫(kù)進(jìn)行解析,但是ArduinoJSON可以使用更優(yōu)雅的方式解析json。
cJSON解析
ArduinoJSON
看到了有木有,得益于C++的特性、我們可以使用更優(yōu)雅、高效、安全的方式解析JSON。
Arduino平臺(tái)有很多類(lèi)似于ArduinoJSON這樣優(yōu)秀的開(kāi)源庫(kù)。如果能為我們所用就好了。
于是我將移植了Arduino 核心API到STM32上。這樣Arduino能用的庫(kù)STM32只要下載下來(lái),并將源代碼添加進(jìn)工程,包含頭文件目錄就可以使用了。
為了更好的支持C++目前項(xiàng)目采用AC6編譯器,不包含第三方庫(kù)的話AC5也是可以 0 warning, 0 Errors編譯的。不過(guò)不推薦使用AC5,因?yàn)榈谌綆?kù)基本上都大量使用了C++11 甚至是C++14的特性編寫(xiě)。只要AC6可以完美支持。

系統(tǒng)框架說(shuō)明


大家下載下來(lái)工程后,可以看到有很多文件夾。其中DOC是文檔目錄,里面存放了說(shuō)明文檔。大家可以看看。
Drivers 是驅(qū)動(dòng)包,這個(gè)是由MCU廠商提供的,比如我們用的是STM32F103,這里面存放的就是STM32F103的標(biāo)準(zhǔn)庫(kù)源碼,如果我們用的是F4、H7 這里面放的就是HAL庫(kù)源碼。我們用華大的HC32就用的是華大提供的驅(qū)動(dòng)庫(kù)源碼。MDK文件夾里放的是MDK工程文件,以后還可能多個(gè)IAR文件夾,顧名思義是IAR的工程文件目錄。USER里只有個(gè)main.cpp 是我們用戶(hù)編寫(xiě)的代碼。

Frame文件夾下就是框架源碼了。ArduinoAPI顧名思義是Arduino 的核心API(用法請(qǐng)參照Arduino 官網(wǎng))。LLA_Drivers是底層抽象驅(qū)動(dòng)層,顧名思義是對(duì)Drivers 驅(qū)動(dòng)包的進(jìn)一步抽象(封裝),對(duì)其它MCU的移植也基本上就是移植這里面的文件。

如何添加第三方庫(kù):

添加一個(gè)新的分組,明明為庫(kù)的名稱(chēng)。然后把庫(kù)文件夾下的所有cpp和.c文件全部添加進(jìn)來(lái)。

然后將庫(kù)文件夾下的頭文件路徑包含進(jìn)來(lái)。運(yùn)行編譯,然后解決一下編譯錯(cuò)誤(部分庫(kù)因?yàn)橛昧思拇嫫骷?jí)別的代碼所以肯定編譯不過(guò)的)。
默認(rèn)工程里跑了個(gè)MQTT的demo,需要是STM32F103ZET6 + W5500 以太網(wǎng)芯片(連接在SPI2 //SCK-PB13 MISO-PB14 MOSI-PB15 上),所以Arduino API 的 SPI其實(shí)是STM32的SPI2,如果你需要修改為SPI1的話打開(kāi)ArduinoAPI的SPI.cpp文件拉到最底下更改下注釋就行了
這是我跑的MQTT例程,通常情況下第三方庫(kù)都會(huì)有個(gè)examples文件夾,里面的demo程序直接復(fù)制粘貼進(jìn)main.cpp 就可以運(yùn)行。

LLA層串口斷言:
你填錯(cuò)了函數(shù)參數(shù),會(huì)定位出錯(cuò)位置并且會(huì)有提示。


目前我用來(lái)測(cè)試的板子是 STM32F103戰(zhàn)神V2 開(kāi)發(fā)板。
項(xiàng)目鏈接:https://github.com/MS10755/STM32_ArduinoFrame
開(kāi)源不易,幫我點(diǎn)個(gè)小星星哦~