说明:小脚丫开发板所使用的开发包的完整代码,可以在本书代码资源 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。
中断是指计算机运行过程中,出现某些意外情况需主机干预时,机器能自动停止正在运行的程序并转入处理新情况的程序,处理完毕后又返回原被暂停的程序继续运行。
ESP32的DAC函数可以实现真正的模拟输出。
ESP32 没有Arduino输出 PWM 的 analogWrite(pin, value) 方法,取而代之的 ESP32 有一个 LEDC 来实现PWM功能。
本书由少年创学院联合创始人兼院长、知名创客程晨撰写,以Arduino作为硬件平台,介绍了使用米思齐(Mixly)软件进行程序开发的方法。
本文档作为UNO R4 WiFi的技术概览,您将找到一系列资源和指南链接,帮助您开始下一个项目。
Arduino OneButton库是一个用于简化按钮操作的库,它可以轻松地处理按钮的单击、双击和长按等操作。适用于Arduino开发板以及ESP32等其他基于Arduino的开发板。
本文从Arduino Uno入手,看看怎样在这个"简单"的8bit单片机搭建一个属于自己的bootloader
ESP32 可以通过 SDMMC 和 SPI 两种方式读取SD/TF卡数据。