说明:小脚丫开发板所使用的开发包的完整代码,可以在本书代码资源 Arduino_RISCV_IDE-master.zip 中找到。更准确地说,这个代码资源是PulseRain Reindeer软核处理器的开发支持包,而小脚丫开发板只是所有支持PulseRain Reindeer的开发板中的一款。
作为一个完整的开发包,其需要为用户提供下面三类工具。
(1)编译器。
在PulseRain Reindeer的开发包中,选用了RISC-V GCC的裸金属版本,以适应MCU的开发。
(2)代码载入工具,用于将编译产生的二进制代码载入到开发板上。在Arduino IDE集成开发环境里,这个过程被称为代码载入。
PulseRain Reindeer包含了用硬件(RTL)实现的载入工具,所以在运行Arduino IDE的主机端,只要准备一个Python脚本,用来和这个硬件实现的载入工具通信即可。而在其他的处理器中,这部分功能是由软件实现的,也就是说,开发者除了要准备主机端的软件工具外,还需要准备一个用软件实现的Bootloader, 在处理器上电后运行,来与主机端通信。
(3)代码大小测量工具。
在向硬件载入代码之前, Arduino IDE需要知道代码的大小,PulseRain Reindeer的开发包中提供了一个名叫hex_total_size的工具,该工具实际上是一个Python脚本,用来计算编译产生的hex文件所对应的二进制代码的大小。
除了上文提到的这些工具外,开发包还需要包含下面两个文本文件,用来指导Arduino IDE对这些工具的使用。
(1)board.txt.
这个文件主要包含了与开发板相关的参数,例如串行口载入的波特率、开发板所包含的内存大小等。代码8-3展示了与小脚丫开发板相关的 board.txt 部分。
(2)platform.txt。
这个文件主要包含了各个工具的命令行使用方式,例如对cpp文件编译所需要的命令行参数(代码8-4)、hex 文件的生成方法(代码8-5)、代码载入工具的使用(代码8-6)等。
有关PulseRain Reindeer开发包所使用的board.txt与platform.txt的完整代码,可以在本书代码资源Arduino_RISCV_IDE-master.zip的 PulseRain_RISCV/Reindeer目录下找到。
在准备开发包时,前面提到的board.txt与 platfom.txt要和开发包的源代码放在同一个压缩文件里面(.tar.gz文件),这个文件的目录结构如图8-10所示
在Arduino Language中定义的 API, 都需要由这些源代码来实现。在图8-10 中有两个子目录: cores 和 variants,一个处理器通常会有多个不同的型号、这种目录结构的设计便是考虑到了这种情况。所有处理器型号共享的代码可以放在 cores 目录中,而针对某个处理器型号的代码(例如外围设备的地址定义)可以放在variants目录中。
提示:具体到某个开发板来说,其所携带的处理器型号可以在boardtxt中指定。例如在代码8-3中可以看到,小脚丫开发板所对应的 variant 是 generic(通用型)
上文提到的这些工具和源文件(包括 board.txt 与 platform.txt), 最终都需要由一个JSON文件来汇总,以标记源文件和工具的对应关系,以及所支持的开发板列表,以方便Arduino IDE集成开发环境来引用。随着开发包和工具的不断升级,这个JSON还需要记录旧版本的相关信息。
为了方便开发, PulseRainTechnology 公司为此提供了一个 Shell 脚本,以自动生成这个JSON 文件,并自动生成所需要的压缩文件。这个 Shell 脚本可以在本书代码资源Arduino_RISCV_IDE-master.zip 中找到。
其可以在Cygwin下被运行,代码8-7便是用这个 Shell 脚本所生成的一个JSON文件样本。
{
"packages":[
{
"name":"PulseRain RISCV",
"maintainer":"PulseRain Technology,LLC"
"email":"info@pulserain.com",
"help":{
"online":"http://riscv.us"
},
"websiteURL":"http://riscv.us",
"platforms":[
{
"name":"PulseRain Reindeer",
"architecture":"Reindeer",
"version":"1.3.0",
"category":"Contributed",
"url":"https://github.com/PulseRain/Arduino_RISCV_IDE/raw/master/package/Reindeer_1.3.0.tar.gz",
"archiveFileName":"Reindeer_1.3.0.tar.gz",
"checksum":"SHA-256:81dea9ca7584b1711c87705a06d805e8149f6e43b0210589e98af5489be051c9",
"size":"17761",
"help":{
"online":"http://riscv.us"
},
"boards":[
{"name":"Gnarly Grey UPDuinoV2 Board (Lattice UP5K)"},
{"name":"STEP CYC10 Board (Intel 10CL016YU256C8G)"},
{"name":"Efinix Trion T20 BGA256 Development Kit"}
],
"toolsDependencies":[
{
"packager":"PulseRain RISCV",
"version":"2.1.0",
"name":"Reindeer upload"
},
{
"packager":"PulseRain RISCV",
"version":"1.0.0",
"name":"Reindeer compiler"
},
{
"packager":"PulseRain RISCV"
"version":"1.0.0",
"name":"hex_total_size"
}
]
}
],
"tools":[
{
"version":"2.1.0",
"name":"Reindeer upload",
"systems":[
{
"host":"i686-mingw32",
"url":"https://github.com/PulseRain/Arduino_RISCV_IDE/raw/master/package/Reindeer_upload_2.1.0.tar.gz",
"archiveFileName":"Reindeer_upload_2.1.0.tar.gz",
"checksum":"SHA-256:4eafa097f0c6818db3f3355ab324268c0876b72f35a78a6881bfe71cf55ef316",
"size":"6035446"
}
]
},
{
"version":"1.0.0",
"name":"Reindeer compiler",
"systems":[
{
"host":"i686-mingw32",
"url":"https://github.com/PulseRain/Arduino_RISCV_IDE/raw/master/package/Reindeer_compiler_1.0.0.tar.gz",
"archiveFileName":"Reindeer_compiler_1.0.0.tar.gz",
"checksum":"SHA-256:216c9e08a54b0df3895dad95b199505f16lea56422eb246e56892a6f0043f3b4",
"size":"1003705941"
}
]
},
{
"version":"1.0.0"
"name":"hex total size"
"systems": [
{
"host":"i686-mingw32"
"url":"https://github.com/PulseRain/Arduino_RISCV_IDE/raw/master/package/hex_total_size_1.0.0.tar.qz",
"archiveFileName":"hex_total_size_1.0.0.tar.gz",
"checksum":"SHA-256;275fd6f969b470e06181e86e0725d47ec262C01c5a917C527f004d50a9926fd",
"size":"7007795"
}
]
}
]
}
]
}
从代码8-7可以看出,完整的开发包除了JSON 文件外,还需要包括下面4个压缩文件(.tar.gz 文件):
(1)源代码(包括 board.txt与 platform.txt), 例如代码8-7中的Reindeer_1.3.0.tar.gz。
(2)代码载入工具,如代码8-7中的Reindeer_upload_2.1.0.tar.gz。
(3)编译器,如代码8-7中的Reindeer_compiler_1.0.0.tar.gz。
(4)代码大小的测量工具,如代码8-7中的hex_total_size_1.0.0.tar.gz。
PWM,英文名Pulse Width Modulation,是脉冲宽度调制缩写,它是通过调节占空比的变化来调节信号、能量等的变化。
ESP32系列(包括ESP32-S3)搭载Xtensa双核处理器,默认情况下Arduino框架仅使用单核运行用户代码,通过多核编程,可以充分利用硬件资源来提升系统响应和性能。
在本文中,先解释 MSB(最高有效位)和 LSB(最低有效位)的概念,以及 MSBFIRST 和 LSBFIRST。然后展示了 MSBFIRST 和 LSBFIRST 的使用如何影响移位寄存器的输出。
TB6612是一款双路H桥型的直流电机驱动芯片,可以驱动两个直流电机并且控制其转速与方向,输入电压在3V~12V,因此在集成化、小型化的电机控制系统中,它可以作为理想的电机驱动器件。
Arduino-ESP32项目提供的Preferences库是一个专为ESP32设计的非易失性存储解决方案,它替代了传统的Arduino EEPROM库,提供了更强大、更可靠的数据存储功能。
在Arduino中,通过串行端口接收数字通常涉及使用Serial.read()、Serial.readString()、Serial.parseInt()等方法。
要生成随机数,可以使用Arduino随机数函数random()。
本文收集整理在Arduino环境下字符串的相关用法,供参考。
ESP32在Arduino中的GPIO模式。
ESP32EA-MOC 开发板介绍和Arduino环境配置。