我靠:体验先楫arduino开发环境竟然出了意外…
这周先楫发布了hpmicro arduino支持包0.1.0-传送门《 HPMicro Arduino支持包v0.1.0发布,适配功能揭晓! 》,适配了hpm5301evklite和hpm5300evk两块板子,同时也支持常用的GPIO,PWM,UART,ADC,I2C,SPI,USB基础外设。
刚好抽屉吃灰的hpm5301evklite可以拿出来清清灰,顺带还找了一个w2812点阵屏和SD卡模块,还有一个墨水屏,在第一时间体验了该支持包。
这不, 本文就以三个库对接进行使用说明,以难度程度进行阐述,分别是arduino自带的libraries的SD卡库(基础库)、以及第三方模块写好的墨水屏epd1in54库(进阶库)、库管理中热门的点阵屏FASTLED库(高级库)。来说明如何快速使用arduino对其高性能MCU进行开发评估。
对接的arduino库git链接会放在留言区。
一、开发准备
arduino IDE安装的比如开发板管理器和自带库默认安装的路径在user路径下的AppData目录,vscode调试需要用到这些源码路径,比如:
先楫对接的arduino适配源码就在packages下,比如:
二、hpmduino开发
(一)基础库使用
在IDE的示例中,arduino提供了不少基础库,基本对接常用的外设都可用,比如SPI的驱动类可以用去网口、SD卡这些应用,基本需要小改下一些配置头文件都可以直接使用。
这里使用SD的CardInfo进行阐述,打开上述的SD-->CardInfo示例,进行编译,输出窗口会提示error报错:
根据这个报错路径我们可以知道在SD库中的报错文件在Sd2PinMap头文件中,这里就是所说的配置文件,提示库中找不到对应的Board支持,这时候就需要自己添加对应的Board使能。
根据上述的使能照葫芦画瓢,进行hpm5300的宏定义批处理判断,加入SPI的引脚宏,加上以下代码:
在ino文件中,把chipSelect值赋值为hpmicro定义的片选信号引脚,这些引脚可在源码库中的board的readme可找到:
改为片选信号引脚之后,编译无报错
编译烧录该例子到开发板,可见正常识别SD卡信息,操作一个SD卡就是这么简单。
(二)进阶库使用
这里的进阶库是指arduino本身没有的库,而IDE的库管理中也没有做支持的一些第三方库,比如一些淘宝模块提供的arduino库,这些一定程度上,使用在新平台也会出现一些编译或者运行错误问题,需要有一定的搜索能力但可以不需要调试即可解决的库。比如本文所说的淘宝微雪的墨水屏epd1in54型号。
这里需要在网上找到类似的其他平台验证成功的资源,从而找到对应的arduino实现源码,若是不依赖任何硬件平台只依赖外设类,基本都能编译成功并且运行OK。
比如网上有大佬提供的这个墨水屏库:
https://github.com/Bodmer/EPD_Libraries/tree/master/epd1in54 。
该库进行下载,运行ino,编译烧录到开发板,显示正常,这种完完全全可以不依赖硬件平台即可实现。
(三)高级库使用
这部分的库,在一些库管理中,arduino进行维护的库,但是也没适配到所有平台,导致这种库在全新的平台的时候使用会很困难,编译不单会报错,而且运行也会报错。这部分需要有C/C++开发基础,并且拥有一定的调试能力,在适配的过程中,库的层层调用,分析和调试能力显得比较重要。本文也大概提供一些开发的流程以及调试,方便后续的开发者适配不同的第三方库。以FASTLED为例:
1、vscode组织工程
vscode支持工作区中加入多个文件夹(如何加入可以网上搜索),这样可以方便不同目录文件的整合。
根据上述的hpmicro arduino和libraries库路径加入到vscode工作区中,在自己的应用目录下可新建个project文件夹放arduino工程。比如本文使用的FASTLED库的例子为--ColorPalette,那么目录结构为:
2、arduino IDE编译
arduino IDE进行编译,并把编译生成的elf等可执行文件进行导出到ino工程目录下。可执行以下操作:
项目->导出已编译的二进制文件
那么在ino工程中就出现了个build文件夹,里面就包含了调试所用的elf文件
3、vscode调试
vscode在插件商店中安装好Cortex-Debug插件,右键点击以下的扩展设置
分别填入所需要的jlink gdb server(如果有) 和openocd、gdb路径。比如
可在arduino下的hpmicro适配文件中的tools的编译链工具路径填入,举例:
"cortex-debug.gdbPath.windows": "your user path\\AppData\\Local\\Arduino15\\packages\\hpmicroduino\\tools\\hpm_env\\1.6.0\\win\\toolchains\\rv32imac\\bin\\riscv32-unknown-elf-gdb.exe",
"cortex-debug.JLinkGDBServerPath.windows": "your user path\\SEGGER\\JLink_V796q\\JLinkGDBServerCL.exe",
"cortex-debug.openocdPath.windows": "your user path\\AppData\\Local\\Arduino15\\packages\\hpmicroduino\\tools\\tools\\openocd\\openocd.exe",
把hpmicro arduino下的openocd_cfg拷贝到自己的应用工程目录下
在自己的工程projcets下新建一个.vscode文件夹,在该文件夹新建一个launch.json,复制以下:
包含了jlink,cmsis_dap,ft2232的调试
这里只做hpm5301evklite,其余的板子可进行照葫芦画瓢即可。
这里的可执行文件路径需要自行根据情况更改
{
"version": "0.2.0",
"configurations": [
{
"cwd": "${workspaceFolder}",
"executable": "${workspaceFolder}/ColorPalette/build/hpmicroduino.hpmicro.HPM5301EVKLITE/ColorPalette.ino.elf",
"name": "Debug with JLink",
"request": "launch",
"type": "cortex-debug",
// "device": "HPM5361xCBx",
"device": "HPM5301xEGx",
// "device": "HPM6750xVMx",
// "device": "HPM6880xBDx",
// "device": "HPM6280xPAx",
"runToEntryPoint": "main",
"showDevDebugOutput": "none",
"interface": "jtag",
"servertype": "jlink",
},
{
"cwd": "${workspaceRoot}",
"executable": "${workspaceFolder}/ColorPalette/build/hpmicroduino.hpmicro.HPM5301EVKLITE/ColorPalette.ino.elf",
"showDevDebugTimestamps": "raw",
"name": "HPM_dapDebug",
"request": "launch",
"type": "cortex-debug",
"servertype": "openocd",
"configFiles": [
"${workspaceFolder}/openocd_cfg/probes/ft2232.cfg",
"${workspaceFolder}/openocd_cfg/soc/hpm5301.cfg",
"${workspaceFolder}/openocd_cfg/boards/hpm5301evklite.cfg",
],
},
{
"cwd": "${workspaceRoot}",
"executable": "${workspaceFolder}/ColorPalette/build/hpmicroduino.hpmicro.HPM5301EVKLITE/ColorPalette.ino.elf",
"showDevDebugTimestamps": "raw",
"name": "HPM_FT223_Debug",
"request": "launch",
"type": "cortex-debug",
"servertype": "openocd",
"configFiles": [
"${workspaceFolder}/openocd_cfg/probes/ft2232.cfg",
"${workspaceFolder}/openocd_cfg/soc/hpm5301.cfg",
"${workspaceFolder}/openocd_cfg/boards/hpm5301evklite.cfg",
],
"searchDir": [],
"runToEntryPoint": "main()",
"showDevDebugOutput": "none",
}
]
}
这样即可进行arduino调试
4、新平台适配
对于有些热门的库,在新平台使用难免会出现编译报错问题,因为需要对接底层的操作。本文使用的是FASTLED库,对于arm,avr,esp这些已经对接好,从platforms适配中,并没有riscv做参考。
还好FASTLED库也做了提示如何进行新平台适配。
从PORTING.md中可以看到,需要对接以下实现,分别是pin, spi, clock。本文只是实现了IO操作。
可以在platforms中新建一个hpm的文件夹,里面的文件命名跟其他单片机类似。
首先从clockless对接,clock提供了一个延时时钟tick来进行延时IO操作以便实现ws2812时序,相比ARM的DWT,HPM作为riscv平台也提供了一个类似的计数器,比如riscv的cycle,mchtmr。本文以mchtmr作为clock,时钟源为24M,所以需要对接的F_CPU为24M.
在定义的clockless的文件中,CYCCNT定义获取mchtmr的计数器API
如此一来就可以在writeBIT操作进行延时操作。
其次再对接下PIN操作,这里需要一定的HPM的外设熟悉程度,针对GPIO的输出操作。比如设置某个PIN的高低电平,某个PORT的所有PIN设置等操作。
接下来就是在配置文件中加入hpm适配的相关头文件支持,还有一些细节的适配操作,本文就不再做阐述,感兴趣的可在提供的代码中参考。
打开FASTLED的一个示例ColorPalette,修改下PIN引脚,以及驱动的型号为W2812,使用的点阵是16*16,也就是256个灯,编译无误后可看到hpm5301操作w2812成功。
视频效果如下:
三、总结
1、通过基础库、进阶库、高级库的阐述,可以知道arduino的强大生态,只需要修改库的部分配置文件即可快速跨平台使用。
2、由于先楫适配的arduino相关外设足够完整,对于一些没有适配的第三方库,也可以做到通过小修改即可无缝切换使用。十分方便了用户快速验证评估使用。
四、画外音
那么回到标题,到底出了什么意外呢?当然结论是:意外的好用哈哈。