你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

在STM32上跑Arduino的程序

[复制链接]
STMCU小助手 发布时间:2022-8-27 19:46
可能不少接触过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解析

  1. #include <stdio.h>
  2. #include "cJSON.h"

  3. int main(void)
  4. {
  5.     cJSON* cjson_test = NULL;
  6.     cJSON* cjson_address = NULL;
  7.     cJSON* cjson_skill = NULL;
  8.     char* str = NULL;

  9.     /* 创建一个JSON数据对象(链表头结点) */
  10.     cjson_test = cJSON_CreateObject();

  11.     /* 添加一条字符串类型的JSON数据(添加一个链表节点) */
  12.     cJSON_AddStringToObject(cjson_test, "name", "mculover666");

  13.     /* 添加一条整数类型的JSON数据(添加一个链表节点) */
  14.     cJSON_AddNumberToObject(cjson_test, "age", 22);

  15.     /* 添加一条浮点类型的JSON数据(添加一个链表节点) */
  16.     cJSON_AddNumberToObject(cjson_test, "weight", 55.5);

  17.     /* 添加一个嵌套的JSON数据(添加一个链表节点) */
  18.     cjson_address = cJSON_CreateObject();
  19.     cJSON_AddStringToObject(cjson_address, "country", "China");
  20.     cJSON_AddNumberToObject(cjson_address, "zip-code", 111111);
  21.     cJSON_AddItemToObject(cjson_test, "address", cjson_address);

  22.     /* 添加一个数组类型的JSON数据(添加一个链表节点) */
  23.     cjson_skill = cJSON_CreateArray();
  24.     cJSON_AddItemToArray(cjson_skill, cJSON_CreateString( "C" ));
  25.     cJSON_AddItemToArray(cjson_skill, cJSON_CreateString( "Java" ));
  26.     cJSON_AddItemToArray(cjson_skill, cJSON_CreateString( "Python" ));
  27.     cJSON_AddItemToObject(cjson_test, "skill", cjson_skill);

  28.     /* 添加一个值为 False 的布尔类型的JSON数据(添加一个链表节点) */
  29.     cJSON_AddFalseToObject(cjson_test, "student");

  30.     /* 打印JSON对象(整条链表)的所有数据 */
  31.     str = cJSON_Print(cjson_test);
  32.     printf("%s\n", str);

  33.     return 0;
  34. }
复制代码

ArduinoJSON

  1. DynamicJsonDocument doc(1024);

  2. doc["sensor"] = "gps";
  3. doc["time"]   = 1351824120;
  4. doc["data"][0] = 48.756080;
  5. doc["data"][1] = 2.302038;

  6. serializeJson(doc, Serial);
  7. // This prints:
  8. // {"sensor":"gps","time":1351824120,"data":[48.756080,2.302038]}
复制代码

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

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

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

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


系统框架说明

M5ASP(99K}O(ZUN19K3G443.png

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

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

Y[E0J6J0HAQUJR%@MUHEK7R.png


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


如何添加第三方库:

FASIZE5JF%(E_BHYB0T{]LJ.png

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

}ZA]DM_44WKWVXUNT_%M[[I.png

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

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

  1. //SPIClass SPI(LLA_SPI0);//SCK-PA5 MISO-PA6 MOSI-PA7
  2. //SPIClass SPI_2(LLA_SPI1);//SCK-PB13 MISO-PB14 MOSI-PB15

  3. SPIClass SPI(LLA_SPI1);//SCK-PB13 MISO-PB14 MOSI-PB15
复制代码

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

{CD[7S1EQ(9I($VJAX0B5`B.png


LLA层串口断言:

你填错了函数参数,会定位出错位置并且会有提示。
1{IOBTPL2(D%W]M3VWMEV)4.png

作者:捉住一只皮皮虾


收藏 评论0 发布时间:2022-8-27 19:46

举报

0个回答

所属标签

相似分享

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版