Arduino库可以直接在RT-Thread上运行了 附详细解读

1 简介 rtduino为rt-thread的arduino生态兼容层,是rt-thread社区的下属子社区,旨在兼容arduino社区生态(如上千种分门别类的arduino库,以及arduino社区优秀的开源项目),来丰富rt-thread社区软件包生态,并降低rt-thread操作系统以及与rt-thread适配的芯片的学习门槛。可以让用户通过arduino的函数和编程方法,轻松地将rt-thread以及特定的芯片使用起来。用户也可以直接使用arduino社区的库(例如i2c传感器驱动库、算法库等)直接用在rt-thread工程中,极大地补充了rt-thread社区生态。该项目由rt-thread社区核心开发和维护者满鉴霆发起。本软件包可以运行在rt-thread studio ide和keil编译环境下,因为arduino的库都是基于gcc环境开发的,因此强烈推荐使用rt-thread studio ide运行。 1.1 已经支持arduino生态兼容层的rt-thread bsp bsp名称 备注
stm32l475潘多拉 引脚异构布局,但外设丰富
stm32f072 nucleo 标准arduino uno引脚布局
stm32f401 nucleo 标准arduino uno引脚布局
stm32f469 discovery 标准arduino uno引脚布局
stm32f103 bluepill 引脚异构布局
es32f3696 引脚异构布局
注:rtduino也可以无需适配特定bsp,直接运行在任意rt-thread bsp上,请参考第5章-rtduino精简模式。
2 如何使用本兼容层 本软件包需要对特定的bsp进行适配之后才可以使用,适配方法很简单请参考。本节以stm32l475潘多拉开发板和rt-studio开发环境为例,来讲解如何使用本兼容层。 2.1 参考资料 2022年rt-thread全球开发者大会报告视频
2.2 工程的创建和导入 请到rt-thread github官方仓库,下载最新的源码。对于部分用户下载github源码慢的问题,可以百度或者到b站搜索“github加速”等关键字来解决,此处不再赘述。
下载好之后请解压,打开rt-studio ide,选择文件(file) -> 导入(import),并选择rt-thread bsp project into workspace,也就是将bsp工程导入到studio的选项。
路径选择,你刚刚下载解压好的rt-thread源码,以stm32l475潘多拉板为例:rt-threadspstm32stm32l475-atk-pandora。工程名字随便起一个就好,比如stm32:
点击完成(finish),稍等片刻即可完成工程导入。
导入成功之后,双击rt-thread settings,进入到rt-thread工程配置界面,点击<2    system packages  --->3         [*] rtduino: arduino ecological compatibility layer  --->4              [*]   don't use setup-loop structure  ---> 选择此选项后,用户可以直接在 core/arduino_thread.c 中的 arduino_entry 线程函数中直接编程,或者在任意.cpp文件中调用arduino api(不局限于arduino线程,只要是.cpp文件下调用即可)。 5.2 如何不用定义引脚映射表,更方便的使用rtduino? 通过上文,我们可以看到,rtduino软件包并不是直接可以用的,需要rt-thread bsp方面提供一些配套的支持,如引脚映射表(arduino_pinout)等。但是,如果用户不想使用arduino引脚(io)相关的api(如analogread等),只想借助rtduino软件包,来直接兼容运行i2c芯片驱动库、纯软件算法库等和io无关的函数和库,如何快速的使用起来呢?用户可以直接在env或者rt-thread studio的rt-thread settings中选择精简模式 (enable tiny mode)。在选择精简模式后,用户就无需定义引脚映射表,直接就可以使用arduino库中的非io相关的函数和库了。开启精简模式后,会自动开启 5.1 章节所介绍的不使用setup-loop编程模型选项,用户可以在任意.cpp文件下使用arduino api。1rt-thread online packages  --->2    system packages  --->3         [*] rtduino: arduino ecological compatibility layer  --->4              -*-   don't use setup-loop structure5              [*]   enable tiny mode  ---> 5.3 常规模式(参见第4章)vs 精简模式(参见第5章) 下表列举了在两种不同模式下,rtduino对arduino api的兼容情况:
注:spi库目前还在施工中,暂不开放使用。
6 需要注意的事项 6.1 包含arduino.h头文件 调用到arduino相关函数和宏的源文件,请包含arduino.h头文件,否则可能会报错:
6.2 keil ac5 如果使用keil ac5环境,需要勾选gnu extension。ac6不需要。
6.3 启用pwm不能调用pinmode函数,否则pwm会失效,adc、dac同理 1void setup() { 2  //declaring led pin as output 3  //pinmode(led_pin, output); //不能设置为output,否则pwm会失效 4} 5void loop() { 6  //fading the led 7  for(int i=0; i0; i--){12    analogwrite(led_pin, i);13    delay(5);14  }15} 因为底层已经将对应的pwm、adc或dac的io设置为模拟输入或者复用推挽,调用pinmode之后把io模式改成了纯输入输出,原有的pwm、adc或dac功能将无法使用。该问题无要修正,只需要知道调用analogread和analogwrite的时候不需要设置pinmode即可。一旦调用pinmode,该引脚将丧失analogwrite或者analogread功能,后续只能当做普通io使用。
arduino 官方文档也是这么建议的:
1you do not need to call pinmode() to set the pin as an output before calling analogwrite().2the analogwrite function has nothing to do with the analog pins or the analogread function. 用户如果对pwm、adc或dac引脚使用pinmode函数,在终端也会给出警告:
当然,如果用户已经知道这样做的后果,但是故意需要将pwm、adc或dac引脚通过pinmode函数转为普通io也是完全可以的。
6.4 serial.begin 在很多arduino例程中,都喜欢使用如下语句来初始化串口:
1  serial.begin(9600); 这句话将串口默认初始化成波特率为9600. 但是在rt-thread中,串口的初始化实际是有rt-thread驱动框架负责的,并且默认波特率为115200. 因此如果调用serial.begin(9600) 函数后,串口的波特率将会从默认的115200调整为9600。如果你的终端或者串口助手还保持在115200的波特率,那么接收数据将出现乱码。
因此建议:
使用serial.begin()代替serial.begin(9600)。serial.begin()无参数方法是rtduino的扩充方法,其表示跟随使用rt-thread串口配置,不重新配置串口。
7 贡献与维护 7.1 项目仓库地址 https://github.com/rtduino/rtduino
https://gitee.com/rtduino/rtduino

IDT公司推出9WDV3501可同时监控多个处理过程的单芯
物联网新起的塑料处理器,能否当担大任
嵌入式环境下的轻量级GUI系统解决方案设计详解
布局MCU,“国民芯”版图新格局
linux系统中驱动软件架构设计
Arduino库可以直接在RT-Thread上运行了 附详细解读
高性能低功耗I2C接口智能门锁触摸芯片GTX314L
中控智慧科技考勤机IM2500简介
shader之间传递值用的变量类型
如何用好笔记本的锂电池
8位投资者 分享AR行业的风险和机遇,创业机会
买手机主要看什么?买手机必看这5项!小米6最具性价比,远离联发科
嵌入式软件开发要注意这七中错误事项
Toshiba推出小巧轻薄型共漏极MOSFET,具有极低导通电阻,适合快速充电设备
SJA1000控制器在多电机综合保护器中的应用
大模型如何快速构建指令遵循数据集?
一台5G基站到底要多少钱呢?商用阶段单站为50万-60万元
NI携其最新产品亮相首届电子设计创新会议
导热吸波材料的交流探讨应用研究
ch334u数据手册