欢迎光临散文网 会员登陆 & 注册

【项目开源】在STM32上跑Arduino的程序

2022-06-12 17:22 作者:捉住一只皮皮虾  | 我要投稿

可能不少接触过STM32 和Arduino的小伙伴看到标题觉得很神奇,STM32上怎么能跑Arduino 的程序呢?,我第一次Arduino的2000人交流群里发这个项目时候,大家也觉得很神奇。

可能传统学习路线 ( 51 -> STM32 -> 各种Arm核心MCU )  的单片机工程师并不了解什么是Arduino,Arduino是一个以avr单片机作为硬件(现在不光支持avr了,还有STM32、ESP8266等等),拥有数以千计的开源项目的电子设计平台。比如你玩pid ,你不懂pid 可以直接Arduino IDE的库管理中下载别人封装好的PID库,比如你想玩个MQTT远程控制,Json解析/正则表达式,NTP服务 ... 不需关心MQTT的底层原理,Json怎么解析。虽然传统单片机上也可以移植cJSON库进行解析,但是ArduinoJSON可以使用更优雅的方式解析json。

cJSON解析

ArduinoJSON

看到了有木有,得益于C++的特性、我们可以使用更优雅、高效、安全的方式解析JSON。

Arduino平台有很多类似于ArduinoJSON这样优秀的开源库。如果能为我们所用就好了。

于是我将移植了Arduino 核心API到STM32上。这样Arduino能用的库STM32只要下载下来,并将源代码添加进工程,包含头文件目录就可以使用了。

为了更好的支持C++目前项目采用AC6编译器,不包含第三方库的话AC5也是可以 0 warning, 0 Errors编译的。不过不推荐使用AC5,因为第三方库基本上都大量使用了C++11 甚至是C++14的特性编写。只要AC6可以完美支持。


系统框架说明

大家下载下来工程后,可以看到有很多文件夹。其中DOC是文档目录,里面存放了说明文档。大家可以看看。

Drivers 是驱动包,这个是由MCU厂商提供的,比如我们用的是STM32F103,这里面存放的就是STM32F103的标准库源码,如果我们用的是F4、H7 这里面放的就是HAL库源码。我们用华大的HC32就用的是华大提供的驱动库源码。MDK文件夹里放的是MDK工程文件,以后还可能多个IAR文件夹,顾名思义是IAR的工程文件目录。USER里只有个main.cpp 是我们用户编写的代码。


Frame文件夹下就是框架源码了。ArduinoAPI顾名思义是Arduino 的核心API(用法请参照Arduino 官网)。LLA_Drivers是底层抽象驱动层,顾名思义是对Drivers 驱动包的进一步抽象(封装),对其它MCU的移植也基本上就是移植这里面的文件。


如何添加第三方库:

添加一个新的分组,明明为库的名称。然后把库文件夹下的所有cpp和.c文件全部添加进来。

然后将库文件夹下的头文件路径包含进来。运行编译,然后解决一下编译错误(部分库因为用了寄存器级别的代码所以肯定编译不过的)。

默认工程里跑了个MQTT的demo,需要是STM32F103ZET6 + W5500 以太网芯片(连接在SPI2 //SCK-PB13 MISO-PB14 MOSI-PB15 上),所以Arduino API 的 SPI其实是STM32的SPI2,如果你需要修改为SPI1的话打开ArduinoAPI的SPI.cpp文件拉到最底下更改下注释就行了

这是我跑的MQTT例程,通常情况下第三方库都会有个examples文件夹,里面的demo程序直接复制粘贴进main.cpp 就可以运行。


LLA层串口断言:

你填错了函数参数,会定位出错位置并且会有提示。

目前我用来测试的板子是 STM32F103战神V2 开发板。

项目链接:https://github.com/MS10755/STM32_ArduinoFrame

开源不易,帮我点个小星星哦~

【项目开源】在STM32上跑Arduino的程序的评论 (共 条)

分享到微博请遵守国家法律