经过对K210的GPIO学习，我们已经大致了解了API的形式与配置思路，那么接下来，我们就来学一下On-Chip外设吧。UART学习-配置一个简单的UART回显IO与UART的配置官方standalone开发手册(以下简称手册)配置UART的IO#define UART1_RX_PIN 24 #define UART1_TX_PIN 21 //声明两个宏定义，标记我们需要使用的IO void uart1_io_init(void) { fpioa_set_function(UART1_RX_PIN, FUNC_UART1_RX); fpioa_set_function(UART1_TX_PIN, FUNC_UART1_TX); //通过FPIOA配置UART1的RX、TX映射的IO的功能。参考手册的第7章，这里声明了一个独立的函数是为了方便在主函数里面管理与配置IO，直接把两条API放到主函数也是OK的。 }配置UART的基本设置uart1_io_init(); //调用前面声明的函数，配置IO位UART1的功能 uart_init(UART_DEVICE_1); //参考手册的第11章，初始化UART1设备 uart_configure(UART_DEVICE_1, 115200, UART_BITWIDTH_8BIT, UART_STOP_1, UART_PARITY_NONE); //参考手册的第11章，配置UART1的基本配置，波特率115200、数据为8位、停止位1位以及无校验位UART的发送与接受UART的发送可以利用实现定义好的一个字符型的变量来测试发送功能。char *hel = {"hello world!\n"}; //先定义一个字符类型指针变量，并赋值 uart_send_data(UART_DEVICE_1, hel, strlen(hel)); //参考手册的第11章，串口发送的APIUART的接收（回显）char buf = 0; //定义一个字符类型的缓冲区 while(1) { while(uart_receive_data(UART_NUM, &buf, 1)) { uart_send_data(UART_NUM, &buf, 1); } } //参考手册第11章，利用uart接收数据函数的返回值作为判断转发的条件，每接收到一位数据就转发一次。
在上一篇博客里面学习了GPIO的操作，这次我们就一起来学习一下高速GPIO与中断。Kendryte 210 高速GPIO与中断高速GPIO与中断芯片有 32 个高速 GPIO。与普通 GPIO 相似，管脚反转能力更强。官方standalone开发手册(以下简称手册)高速GPIO的配置与GPIO相类似的配置方法，只是函数名称有些许变化，例如从gpio_drive_mode变为了gpiohs_drive_mode，同时高速GPIO支持外部中断触发，这也是非常重要的一点。配置一个LED控制IO(驱动模式为输出，默认状态为输出低电平)参考手册第6章和第7章#define PIN_LED 24 #define GPIO_LED 1 fpioa_set_function(PIN_LED, FUNC_GPIOHS1); //配置IO24为高速GPIO1 gpiohs_drive_mode(GPIO_LED, GPIO_DM_OUTPU); //配置驱动模式为输出模式 gpiohs_set_pin(GPIO_LED, GPIO_PV_LOW); //配置IO输出为低电平配置一个KEY控制IO(驱动模式为上拉输入模式)参考手册第6章和第7章#define PIN_KEY 25 #define GPIO_KEY 2 fpioa_set_function(PIN_KEY, FUNC_GPIOHS2); //配置IO25为高速GPIO2 gpiohs_drive_mode(GPIO_KEY, GPIO_DM_INPU_PULL_UP); //配置驱动模式为上拉输入模式外部中断状态与服务函数的配置配置KEY控制IO的中断使能与触发参考手册的第4章、第6章和第21章plic_init(); //初始化外部中断 sysctl_enable_irq(); //使能系统中断，使用中断前必须先使能 gpiohs_set_pin_edge(GPIO_KEY, GPIO_PE_BOTH); //设置IO触发中断模式，GPIO_PE_BOTH为双沿触发 gpiohs_set_irq(GPIO_KEY, 1, irq_led); //设置中断优先级为1，中断服务函数为`irq_led`中断服务函数参考手册的第6章int irq_flag; //声明一个整形的中断标志位 void irq_led(void gp) { irq_flag = gpiohs_get_pin(GPIO_KEY); //进入中断后，读取KEY的值并赋给中断标志位 printf("The IRQ Pin is %d\n", irq_flag); //打印中断标志位 if (!irq_flag) gpiohs_set_pin(GPIO_LED, GPIO_PV_HIGH); else gpiohs_set_pin(GPIO_LED, GPIO_PV_LOW); //根据中断标志位的值，设置LED的状态 }到这里基本的高速GPIO与中断相关配置就OK了，接下来编译烧录就可以了cmake .. -DPROJ=gpio -G "MinGW Makefiles" mingw32-make kflash -p COMPORT $buildDir/gpio.bin
点灯基本可以说是硬件版 Hello World，同样也是学习一个芯片通常意义上的第一步，那么今天就来学习一下K210的GPIO操作，顺便点一个灯。K210 GPIO与FPIOA简述K210芯片一共有8个GPIO(通用输入输出)，GPIO是通过FPIOA(现场可编程IO阵列)来分配至任意IO上面，FPIOA可以将包括GPIO在内的255个功能自由分配到48个自由IO上。并且这些IO都在芯片引脚的外围，方便layout与信号完整性。GPIO的功能描述可配置管脚的上下拉与输入/输出模式FPIOA的功能描述支持 IO 的可编程功能选择支持 IO 输出的 8 种驱动能力选择支持 IO 的内部上拉电阻选择支持 IO 的内部下拉电阻选择支持 IO 输入的内部施密特触发器设置支持 IO 输出的斜率控制支持内部输入逻辑的电平设置点灯现在回到了问题的核心，我们想要点亮一个LED灯，那么通常应该怎么做呢？为了确认LED可以被正确操作，通常情况下都采用blink的方式，也就是LED亮ns然后LED灭ns，这样循环往复，那么也就是说，我们应该在LED的控制IO上循环输出高和低电平。那么目标经过剖析，我们要做的就很简单了，也就是配置IO，然后控制IO输出配置GPIO因为上面提到了，48个IO都是自由的，功能都是通过FPIOA来分配的，那么我们第一步就是把GPIO分配某一个IO上面，通过查阅官方standalone开发手册(以下简称手册)，可以得知，我们想配置GPIO，就需要先把GPIO功能通过FPIOA分配给某一个指定的引脚。如果配置FPIOA，我们应该先引用头文件如下：#include "fpioa.h"头文件引用结束之后，根据手册内的API示例的7.3.1可以知道，配置GPIO功能应该如下代码所示。下面一句代码的含义是，将IO24(任意选择一个已经连接LED的IO即可)配置为GPIO0功能。fpioa_set_function (24, GPIO0);现在我们已经得到了一个具有GPIO功能的IO(虽然有一点绕，但是这种方式感觉非常的自由)，接下来就是配置GPIO功能了。代码如下，我一句一句介绍。gpio_init (); #手册5.3.1 初始化GPIO，这句应该不必多数，在使用之前是一定要初始化的 gpio_set_drive_mode (0, GPIO_DM_OUTPUT); #手册5.3.2&5.4.1 这一句就是将GPIO0(IO24)配置输出驱动模式，函数的第二个输入项是一个gpio_drive_mode_t类型的参数，手册也有介绍，下面类似的参数，不多介绍 gpio_pin_value_t value = GPIO_PV_HIGH; #手册5.4.2 定义一个gpio_pin_value_t类型的变量，并且初始值为高，这个变量是布尔型，高或者低两种，对应着1和0。 gpio_set_pin (0, value); #手册5.3.3 这句就是指定GPIO0的输出高。到这里呢，关于GPIO与IO的基本配置就完成了，此时IO24为输出模式，输出为高，如果有接LED(高位驱动)，那么应该已经亮起来了。配置Blink上一步，我们已经把LED的IO配置完成，并且输出了一个值，接下来就是为LED配置Blink了，为了彻底证明LED已经给我控制了。Blink的形式前面已经提到了，亮一段时间，灭一段时间，同时前面LED已经有一个初始值了，那么我们要做的其实已经非常简单了，代码如下：sleep (1); #延时1s，这个延时就是LED亮灭变化的间隔 gpio_set_pin (0, value = !value); #这句其实也非常好理解，Blink就是LED状态切换，同时IO的输出值参数是一个布尔型参数，那么我们可以在经过一定的延时之后给它的值取非，这样循环往复就实现了高或者低的切换。到这里，点亮一个blink LED的代码就写完了，我们接下来就是生成makefile，然后编译烧录就可以了。cmake .. -DPROJ=gpio -G "MinGW Makefiles" mingw32-make kflash -p COMPORT $buildDir/gpio.bin
上一篇介绍了K210的编译环境配置，同时也编译了一个hello_world工程，这篇我们就来介绍一下K210的烧写工具，把我们上次的编译出来的文件烧入板子看一下结果如何。Windows系统下的Kflash之kflash.pyKflash.py是一个基于python的烧录工具，所以它更具有通用性(只要有python环境就可以)我们可以在官方Github上找到这个repo：kendryte/kflash.py在repo的ReadMe里面其实就可以看到很多信息，包括如何使用与安装等等相关资料。kflash.py Readme部分内容 Usage # kflash --help usage: kflash [-h] [-p PORT] [-f FLASH] [-b BAUDRATE] [-l BOOTLOADER] [-k KEY] [-v] [-t] [-n] [-s] [-B BOARD] [-S SLOW] firmware positional arguments: firmware firmware bin path optional arguments: -h, --help show this help message and exit -p PORT, --port PORT COM Port -f FLASH, --flash FLASH SPI Flash type, 0 for SPI3, 1 for SPI0 -b BAUDRATE, --baudrate BAUDRATE UART baudrate for uploading firmware -l BOOTLOADER, --bootloader BOOTLOADER bootloader bin path -k KEY, --key KEY AES key in hex, if you need encrypt your firmware. -v, --verbose increase output verbosity -t, --terminal Start a terminal after finish (Python miniterm) -n, --noansi Do not use ANSI colors, recommended in Windows CMD -s, --sram Download firmware to SRAM and boot -B BOARD, --Board BOARD Select dev board, e.g. kd233, dan, bit, goD, goE or trainer -S SLOW, --Slow SLOW Slow download mode环境版本要求：python>=3 or python=2.7 pyserial>=3.4 pyelftools>=0.25那么我们就选择python3吧，毕竟python2年事已高，hah。python get-pip.py python -m pip install pyserial python -m pip install pyelftools相关环境安装好之后就可以开始安装kflash了。C:\Users\hulk $ python -m pip install kflash Collecting kflash Downloading https://files.pythonhosted.org/packages/a0/42/c79ed7a9bd176be0632e7b767a48c9e337bbe843bf324aefb16dc13733f1/kflash-0.8.2-py3-none-any.whl (75kB) |█████████████ | 30kB 109kB/s eta 0:00 |███████████████ ██ | 40kB 65kB/s eta 0 |█████████████████████▌ | 51kB 79kB/s |██████████████████████████ | 61kB 95k |███████████████ ███████████████ | 71kB |████████████████████████████████| 8 1kB 93kB/s Collecting enum34>=1.1.6 Downloading https://files.pythonhosted.org/packages/af/42/cb9355df32c69b553e72a2e28daee25d1611d2c0d9c272aa1d34204205b2/enum34-1.1.6-py3-none-any.whl Requirement already satisfied: pyserial>=3.4 in c:\users\hulk\appdata\local\programs\python\python37\lib\site-packages (from kflash) (3.4) Requirement already satisfied: pyelftools>=0.25 in c:\users\hulk\appdata\local\programs\python\python37\lib\site-packages (from kflash) (0.25) Installing collected packages: enum34, kflash Successfully installed enum34-1.1.6 kflash-0.8.2安装完成之后，我们简单的来验证一下：C:\Users\hulk $ kflash usage: kflash [-h] [-p PORT] [-f FLASH] [-b BAUDRATE] [-l BOOTLOADER] [-k KEY] [-v] [-t] [-n] [-s] [-B BOARD] [-S SLOW] firmware kflash: error: the following arguments are required: firmware那么可以说已经安装完成了，下面就开始研究下它的选项该怎么使用，使用kflash.py来烧录K210了。怎么操作呢？我是按照下面这个思路来确定的：我只需要烧录firmware.bin(因为目前阶段还没有特殊需求只是烧录固件)我电脑有不止一个串口设备，需要确定端口号看一下官方的Sample UsageC:\Users\hulk $ kflash -p COM50 E:\Kendryte210\kendryte-standalone-sdk-0.5.6\build\hello_world.bin [INFO] COM Port Selected Manually: COM50 [INFO] Default baudrate is 115200 , later it may be changed to the value you set. [INFO] Trying to Enter the ISP Mode... ._ [INFO] Automatically detected goE/kd233 [INFO] Greeting Message Detected, Start Downloading ISP Downloading ISP: |============================================================================| 100.0% 10kiB/s [INFO] Booting From 0x80000000 [INFO] Wait For 0.1 second for ISP to Boot [INFO] Boot to Flashmode Successfully [INFO] Selected Flash: On-Board [INFO] Initialization flash Successfully Programming BIN: |============================================================================| 100.0% 10kiB/s [INFO] Rebooting...成功！NICE！Ubuntu系统下的Kflash(kflash.py)环境介绍：Ubuntu 18.04LTS python 3.6.8安装pip：sudo apt update sudo apt install python3-pip安装pyserial和pyelftools：pip3 install pyserial pip3 install pyelftools安装kflash：pip3 install kflash查看下是否成功安装:kflash -h返回结果：kflash -h usage: kflash [-h] [-p PORT] [-f FLASH] [-b BAUDRATE] [-l BOOTLOADER] [-k KEY] [-v] [-t] [-n] [-s] [-B BOARD] [-S SLOW] firmware positional arguments: firmware firmware bin path optional arguments: -h, --help show this help message and exit -p PORT, --port PORT COM Port -f FLASH, --flash FLASH SPI Flash type, 0 for SPI3, 1 for SPI0 -b BAUDRATE, --baudrate BAUDRATE UART baudrate for uploading firmware -l BOOTLOADER, --bootloader BOOTLOADER bootloader bin path -k KEY, --key KEY AES key in hex, if you need encrypt your firmware. -v, --verbose increase output verbosity -t, --terminal Start a terminal after finish (Python miniterm) -n, --noansi Do not use ANSI colors, recommended in Windows CMD -s, --sram Download firmware to SRAM and boot -B BOARD, --Board BOARD Select dev board, e.g. kd233, dan, bit, goD, goE or trainer -S SLOW, --Slow SLOW Slow download mode测试烧录：kflash -p /dev/ttyUSB0 /home/hulk/kendryte210/kendryte-standalone-sdk-0.5.6/build/hello_world.bin如果这一步报错的话，那可能是串口权限的问题，执行下面的语句：sudo usermod -a -G dialout $(whoami)到此烧录的方法基本介绍结束了。
Kendryte K210是RISC-V Dual Core 64bit, with FPU、QVGA@60fps/VGA@30fps的AIoT方向的芯片。同时也因为采用开源的指令集，使得它可能具有无限的潜力。我们这次依旧没有使用公版，依旧是自家的板子，但是目前还没后续消息，也不能说太多，就忽略掉相关硬件信息吧，请见谅。一、Ubuntu开发环境搭建：1. 获取资料获取资料当然是应该去官方的开发者资源中心，在里面可以看到资料还是比较详细的，同时也包括了工具链和SDK等等，同时开发文档有简中和繁中两种选择，这不得不说很舒服。言归正传，我们需要下载什么呢？当然是toolchain、SDK和OpenOCD(On-Chip Debugger)了。当然使用带有桌面的linux实体机或者虚拟机相对简单很多，如果命令行界面的话，最简单的操作步骤就是wget URL-link就可以了。wget https://s3.cn-north-1.amazonaws.com.cn/dl.kendryte.com/documents/kendryte-openocd-0.1.3-ubuntu64.tar.gz wget https://s3.cn-north-1.amazonaws.com.cn/dl.kendryte.com/documents/kendryte-toolchain-ubuntu-amd64-8.2.0-20190213.tar.gz wget https://s3.cn-north-1.amazonaws.com.cn/dl.kendryte.com/documents/kendryte-freertos-sdk-0.7.0.zip wget https://s3.cn-north-1.amazonaws.com.cn/dl.kendryte.com/documents/kendryte-standalone-sdk-0.5.6.zip2. 安装toolchain进入到下载文件保存的目录，将toolchain解压并放在指定目录。hulk@hulk-test:~/kendryte210$ sudo tar -xvf kendryte-toolchain-ubuntu-amd64-8.2.0-20190213.tar.gz -C /opt/我这里面的下载目录就是~/kendryte210，然后使用tar配合-xvf和-C来解压并放在/opt目录下面，这个路径是自己选择的。hulk@hulk-test:~/kendryte210$ cd /opt/kendryte-toolchain/bin/ hulk@hulk-test:/opt/kendryte-toolchain/bin$ pwd /opt/kendryte-toolchain/bin我们这一步的目的是获取它的目录，然后要把它添加到系统的PATH里面，这样才能方便的使用sudo vi /etc/profile打开文件后，在文末添加一行PATH="$PATH:/opt/kendryte-toolchain/bin"然后保存退出并重载一下profile文件即可。source /etc/profile接下来就是验证一下到底有没有装好呢？利用自动补全功能即可，在命令行输入riscv64然后按积下TAB键，就可以看到一堆自动补全待选的内容，如果没有review上面的步骤。3. 安装OpenOCD继续回到我们之前的下载路径，然后解压OpenOCD，并进入。hulk@hulk-test:~/kendryte210$ tar -xvf kendryte-openocd-0.1.3-ubuntu64.tar.gz hulk@hulk-test:~/kendryte210$ cd ./kendryte-openocd/对于这个不熟悉的东西，我们可以先看下它的Readme.txt，它里面就提到了我们如何快速开始。============== Quickstart ============== 1. Install libusb-1.0 first if you do not have: sudo apt install libusb-dev -y 2. Run the following command in the `kendryte-openocd` directory(or `check_version.sh`): ./bin/openocd -v and you will see two lines of words if it can work: Kendryte Open On-Chip Debugger For RISC-V v0.1.3 (20180912) Licensed under GNU GPL v2 我们就直接照着做就可以了。4. 开始编译解压SDKhulk@hulk-test:~/kendryte210$ unzip kendryte-standalone-sdk-0.5.6.zip hulk@hulk-test:~/kendryte210$ cd kendryte-standalone-sdk-0.5.6/ hulk@hulk-test:~/kendryte210/kendryte-standalone-sdk-0.5.6$ ls CHANGELOG.md cmake CMakeLists.txt kendryte-package.json lds lib LICENSE README.md src准备工作做完，就可以开始准备编译了。首先，我们应该先建立一个用于编译的文件夹。mkdir build cd build生成makefile，因为我们之前已经配置了相关环境hulk@hulk-test:~/kendryte210/kendryte-standalone-sdk-0.5.6/build$ cmake .. -DPROJ=hello_world PROJ = hello_world -- Check for RISCV toolchain ... -- Using /opt/kendryte-toolchain/bin RISCV toolchain -- The C compiler identification is GNU 8.2.0 -- The CXX compiler identification is GNU 8.2.0 -- The ASM compiler identification is GNU -- Found assembler: /opt/kendryte-toolchain/bin/riscv64-unknown-elf-gcc -- Detecting C compiler ABI info -- Detecting C compiler ABI info - done -- Detecting C compile features -- Detecting C compile features - done -- Detecting CXX compiler ABI info -- Detecting CXX compiler ABI info - done -- Detecting CXX compile features -- Detecting CXX compile features - done SOURCE_FILES=/home/hulk/kendryte210/kendryte-standalone-sdk-0.5.6/src/hello_world/main.c Project: hello_world LIST_FILE=/home/hulk/kendryte210/kendryte-standalone-sdk-0.5.6/cmake/executable.cmake TOOLCHAIN=/opt/kendryte-toolchain/bin KENDRYTE_IDE= BUILDING_SDK=yes CMAKE_BUILD_TYPE=Debug CMAKE_C_COMPILER=/opt/kendryte-toolchain/bin/riscv64-unknown-elf-gcc CMAKE_CXX_COMPILER=/opt/kendryte-toolchain/bin/riscv64-unknown-elf-g++ CMAKE_LINKER=/opt/kendryte-toolchain/bin/riscv64-unknown-elf-ld CMAKE_OBJCOPY=/opt/kendryte-toolchain/bin/riscv64-unknown-elf-objcopy CMAKE_OBJDUMP=/opt/kendryte-toolchain/bin/riscv64-unknown-elf-objdump CMAKE_MAKE_PROGRAM=/usr/bin/make CMAKE_C_FLAGS= -mcmodel=medany -mabi=lp64f -march=rv64imafc -fno-common -ffunction-sections -fdata-sections -fstrict-volatile-bitfields -fno-zero-initialized-in-bss -ffast-math -fno-math-errno -fsingle-precision-constant -Os -ggdb -std=gnu11 -Wno-pointer-to-int-cast -Wall -Werror=all -Wno-error=unused-function -Wno-error=unused-but-set-variable -Wno-error=unused-variable -Wno-error=deprecated-declarations -Wextra -Werror=frame-larger-than=32768 -Wno-unused-parameter -Wno-sign-compare -Wno-error=missing-braces -Wno-error=return-type -Wno-error=pointer-sign -Wno-missing-braces -Wno-strict-aliasing -Wno-implicit-fallthrough -Wno-missing-field-initializers -Wno-int-to-pointer-cast -Wno-error=comment -Wno-error=logical-not-parentheses -Wno-error=duplicate-decl-specifier -Wno-error=parentheses -Wno-old-style-declaration CMAKE_CXX_FLAGS= -mcmodel=medany -mabi=lp64f -march=rv64imafc -fno-common -ffunction-sections -fdata-sections -fstrict-volatile-bitfields -fno-zero-initialized-in-bss -ffast-math -fno-math-errno -fsingle-precision-constant -Os -ggdb -std=gnu++17 -Wall -Werror=all -Wno-error=unused-function -Wno-error=unused-but-set-variable -Wno-error=unused-variable -Wno-error=deprecated-declarations -Wextra -Werror=frame-larger-than=32768 -Wno-unused-parameter -Wno-sign-compare -Wno-error=missing-braces -Wno-error=return-type -Wno-error=pointer-sign -Wno-missing-braces -Wno-strict-aliasing -Wno-implicit-fallthrough -Wno-missing-field-initializers -Wno-int-to-pointer-cast -Wno-error=comment -Wno-error=logical-not-parentheses -Wno-error=duplicate-decl-specifier -Wno-error=parentheses LDFLAGS= -nostartfiles -static -Wl,--gc-sections -Wl,-static -Wl,--start-group -Wl,--whole-archive -Wl,--no-whole-archive -Wl,--end-group -Wl,-EL -Wl,--no-relax -T /home/hulk/kendryte210/kendryte-standalone-sdk-0.5.6/lds/kendryte.ld CMAKE_BINARY_DIR=/home/hulk/kendryte210/kendryte-standalone-sdk-0.5.6/build Makefile created. -- Configuring done -- Generating done -- Build files have been written to: /home/hulk/kendryte210/kendryte-standalone-sdk-0.5.6/build 看到Makefile created.，就表示OK了。最后就可以开始编译了，可以看到如下类似的编译画面：hulk@hulk-test:~/kendryte210/kendryte-standalone-sdk-0.5.6/build$ make Scanning dependencies of target kendryte [ 2%] Building C object lib/CMakeFiles/kendryte.dir/bsp/entry.c.obj [ 5%] Building C object lib/CMakeFiles/kendryte.dir/bsp/entry_user.c.obj [ 8%] Building C object lib/CMakeFiles/kendryte.dir/bsp/interrupt.c.obj [ 11%] Building C object lib/CMakeFiles/kendryte.dir/bsp/locks.c.obj [ 14%] Building C object lib/CMakeFiles/kendryte.dir/bsp/printf.c.obj [ 17%] Building C object lib/CMakeFiles/kendryte.dir/bsp/sleep.c.obj [ 20%] Building C object lib/CMakeFiles/kendryte.dir/bsp/syscalls.c.obj [ 23%] Building C object lib/CMakeFiles/kendryte.dir/drivers/aes.c.obj [ 26%] Building C object lib/CMakeFiles/kendryte.dir/drivers/apu.c.obj [ 29%] Building C object lib/CMakeFiles/kendryte.dir/drivers/clint.c.obj [ 32%] Building C object lib/CMakeFiles/kendryte.dir/drivers/dmac.c.obj [ 35%] Building C object lib/CMakeFiles/kendryte.dir/drivers/dvp.c.obj [ 38%] Building C object lib/CMakeFiles/kendryte.dir/drivers/fft.c.obj [ 41%] Building C object lib/CMakeFiles/kendryte.dir/drivers/fpioa.c.obj [ 44%] Building C object lib/CMakeFiles/kendryte.dir/drivers/gpio.c.obj [ 47%] Building C object lib/CMakeFiles/kendryte.dir/drivers/gpiohs.c.obj [ 50%] Building C object lib/CMakeFiles/kendryte.dir/drivers/i2c.c.obj [ 52%] Building C object lib/CMakeFiles/kendryte.dir/drivers/i2s.c.obj [ 55%] Building C object lib/CMakeFiles/kendryte.dir/drivers/kpu.c.obj [ 58%] Building C object lib/CMakeFiles/kendryte.dir/drivers/plic.c.obj [ 61%] Building C object lib/CMakeFiles/kendryte.dir/drivers/pwm.c.obj [ 64%] Building C object lib/CMakeFiles/kendryte.dir/drivers/rtc.c.obj [ 67%] Building C object lib/CMakeFiles/kendryte.dir/drivers/sha256.c.obj [ 70%] Building C object lib/CMakeFiles/kendryte.dir/drivers/spi.c.obj [ 73%] Building C object lib/CMakeFiles/kendryte.dir/drivers/sysctl.c.obj [ 76%] Building C object lib/CMakeFiles/kendryte.dir/drivers/timer.c.obj [ 79%] Building C object lib/CMakeFiles/kendryte.dir/drivers/uart.c.obj [ 82%] Building C object lib/CMakeFiles/kendryte.dir/drivers/uarths.c.obj [ 85%] Building C object lib/CMakeFiles/kendryte.dir/drivers/utils.c.obj [ 88%] Building C object lib/CMakeFiles/kendryte.dir/drivers/wdt.c.obj [ 91%] Building C object lib/CMakeFiles/kendryte.dir/bsp/crt.S.obj [ 94%] Linking C static library libkendryte.a [ 94%] Built target kendryte Scanning dependencies of target hello_world [ 97%] Building C object CMakeFiles/hello_world.dir/src/hello_world/main.c.obj [100%] Linking C executable hello_world Generating .bin file ... [100%] Built target hello_world二、Windows开发环境搭建：1. 获取资料获取资料当然是应该去官方的开发者资源中心，在里面可以看到资料还是比较详细的，同时也包括了工具链和SDK等等，同时开发文档有简中和繁中两种选择，这不得不说很舒服。言归正传，我们需要下载什么呢？当然是toolchain、SDK和OpenOCD(On-Chip Debugger)了。我们直接点击我们点击我们需要下载的包后面的下载按钮即可。Kendryte K210 FreeRTOS SDK Kendryte K210 Standalone SDK Kendryte OpenOCD for win32 RISC-V 64bit toolchain for Kendryte K210_win322. 安装toolchain进入到下载文件保存的目录，将toolchain解压并放在指定目录。我把toolchain放在了E盘里面单独的一个文件夹E:\Kendryte210\kendryte-toolchain，并且进入bin文件夹，然后复制当前的目录路径，然后打开Windows的环境变量设置，将这个路径添加进去。这里面一定要根据你的实际存放目录来确定，并且后面一定不能删除，切记。3. 开始编译首先在Windows下面编译，要先安装Cmake，我们可以到Cmake官网去下载。然后一步一步安装就好了。解压SDK，可以把SDK和刚才的toolchain放在一个目录下面E:\Kendryte210\kendryte-standalone-sdk-0.5.6，然后进去这个目录，我们可以按住shift+右键，打开powershell，也可以向我一样安装一个cmder，因为这个比powershell要看着舒服一些，具体用法可以百度，也可以等我后面介绍。接下来就是创建编译需要用到的makefileE:\Kendryte210\kendryte-standalone-sdk-0.5.6 $ mkdir build E:\Kendryte210\kendryte-standalone-sdk-0.5.6 $ cd build E:\Kendryte210\kendryte-standalone-sdk-0.5.6\build $ cmake .. -DPROJ=hello_world -G "MinGW Makefiles" PROJ = hello_world -- Check for RISCV toolchain ... -- Using E:/Kendryte210/kendryte-toolchain/bin RISCV toolchain -- The C compiler identification is GNU 8.2.0 -- The CXX compiler identification is GNU 8.2.0 -- The ASM compiler identification is GNU -- Found assembler: E:/Kendryte210/kendryte-toolchain/bin/riscv64-unknown-elf-gcc.exe -- Detecting C compiler ABI info -- Detecting C compiler ABI info - done -- Detecting C compile features -- Detecting C compile features - done -- Detecting CXX compiler ABI info -- Detecting CXX compiler ABI info - done -- Detecting CXX compile features -- Detecting CXX compile features - done SOURCE_FILES=E:/Kendryte210/kendryte-standalone-sdk-0.5.6/src/hello_world/main.c Project: hello_world LIST_FILE=E:/Kendryte210/kendryte-standalone-sdk-0.5.6/cmake/executable.cmake TOOLCHAIN=E:/Kendryte210/kendryte-toolchain/bin KENDRYTE_IDE= BUILDING_SDK=yes CMAKE_BUILD_TYPE=Debug CMAKE_C_COMPILER=E:/Kendryte210/kendryte-toolchain/bin/riscv64-unknown-elf-gcc.exe CMAKE_CXX_COMPILER=E:/Kendryte210/kendryte-toolchain/bin/riscv64-unknown-elf-g++.exe CMAKE_LINKER=E:/Kendryte210/kendryte-toolchain/bin/riscv64-unknown-elf-ld.exe CMAKE_OBJCOPY=E:/Kendryte210/kendryte-toolchain/bin/riscv64-unknown-elf-objcopy.exe CMAKE_OBJDUMP=E:/Kendryte210/kendryte-toolchain/bin/riscv64-unknown-elf-objdump.exe CMAKE_MAKE_PROGRAM=E:/Kendryte210/kendryte-toolchain/bin/mingw32-make.exe CMAKE_C_FLAGS= -mcmodel=medany -mabi=lp64f -march=rv64imafc -fno-common -ffunction-sections -fdata-sections -fstrict-volatile-bitfields -fno-zero-initialized-in-bss -ffast-math -fno-math-errno -fsingle-precision-constant -Os -ggdb -std=gnu11 -Wno-pointer-to-int-cast -Wall -Werror=all -Wno-error=unused-function -Wno-error=unused-but-set-variable -Wno-error=unused-variable -Wno-error=deprecated-declarations -Wextra -Werror=frame-larger-than=32768 -Wno-unused-parameter -Wno-sign-compare -Wno-error=missing-braces -Wno-error=return-type -Wno-error=pointer-sign -Wno-missing-braces -Wno-strict-aliasing -Wno-implicit-fallthrough -Wno-missing-field-initializers -Wno-int-to-pointer-cast -Wno-error=comment -Wno-error=logical-not-parentheses -Wno-error=duplicate-decl-specifier -Wno-error=parentheses -Wno-old-style-declaration CMAKE_CXX_FLAGS= -mcmodel=medany -mabi=lp64f -march=rv64imafc -fno-common -ffunction-sections -fdata-sections -fstrict-volatile-bitfields -fno-zero-initialized-in-bss -ffast-math -fno-math-errno -fsingle-precision-constant -Os -ggdb -std=gnu++17 -Wall -Werror=all -Wno-error=unused-function -Wno-error=unused-but-set-variable -Wno-error=unused-variable -Wno-error=deprecated-declarations -Wextra -Werror=frame-larger-than=32768 -Wno-unused-parameter -Wno-sign-compare -Wno-error=missing-braces -Wno-error=return-type -Wno-error=pointer-sign -Wno-missing-braces -Wno-strict-aliasing -Wno-implicit-fallthrough -Wno-missing-field-initializers -Wno-int-to-pointer-cast -Wno-error=comment -Wno-error=logical-not-parentheses -Wno-error=duplicate-decl-specifier -Wno-error=parentheses LDFLAGS= -nostartfiles -static -Wl,--gc-sections -Wl,-static -Wl,--start-group -Wl,--whole-archive -Wl,--no-whole-archive -Wl,--end-group -Wl,-EL -Wl,--no-relax -T E:/Kendryte210/kendryte-standalone-sdk-0.5.6/lds/kendryte.ld CMAKE_BINARY_DIR=E:/Kendryte210/kendryte-standalone-sdk-0.5.6/build Makefile created. -- Configuring done -- Generating done -- Build files have been written to: E:/Kendryte210/kendryte-standalone-sdk-0.5.6/build看到Makefile created.就表示成功创建了makefile文件。同时可以在文件夹里面看到build目录下面生成了很多文件。现在就可以开始编译代码了。在刚才的comder里面，我们输入mingw32-make，就可以开始编译了。E:\Kendryte210\kendryte-standalone-sdk-0.5.6\build $ mingw32-make Scanning dependencies of target kendryte [ 2%] Building C object lib/CMakeFiles/kendryte.dir/bsp/crt.S.obj [ 5%] Building C object lib/CMakeFiles/kendryte.dir/bsp/entry.c.obj [ 8%] Building C object lib/CMakeFiles/kendryte.dir/bsp/entry_user.c.obj [ 11%] Building C object lib/CMakeFiles/kendryte.dir/bsp/interrupt.c.obj [ 14%] Building C object lib/CMakeFiles/kendryte.dir/bsp/locks.c.obj [ 17%] Building C object lib/CMakeFiles/kendryte.dir/bsp/printf.c.obj [ 20%] Building C object lib/CMakeFiles/kendryte.dir/bsp/sleep.c.obj [ 23%] Building C object lib/CMakeFiles/kendryte.dir/bsp/syscalls.c.obj [ 26%] Building C object lib/CMakeFiles/kendryte.dir/drivers/aes.c.obj [ 29%] Building C object lib/CMakeFiles/kendryte.dir/drivers/apu.c.obj [ 32%] Building C object lib/CMakeFiles/kendryte.dir/drivers/clint.c.obj [ 35%] Building C object lib/CMakeFiles/kendryte.dir/drivers/dmac.c.obj [ 38%] Building C object lib/CMakeFiles/kendryte.dir/drivers/dvp.c.obj [ 41%] Building C object lib/CMakeFiles/kendryte.dir/drivers/fft.c.obj [ 44%] Building C object lib/CMakeFiles/kendryte.dir/drivers/fpioa.c.obj [ 47%] Building C object lib/CMakeFiles/kendryte.dir/drivers/gpio.c.obj [ 50%] Building C object lib/CMakeFiles/kendryte.dir/drivers/gpiohs.c.obj [ 52%] Building C object lib/CMakeFiles/kendryte.dir/drivers/i2c.c.obj [ 55%] Building C object lib/CMakeFiles/kendryte.dir/drivers/i2s.c.obj [ 58%] Building C object lib/CMakeFiles/kendryte.dir/drivers/kpu.c.obj [ 61%] Building C object lib/CMakeFiles/kendryte.dir/drivers/plic.c.obj [ 64%] Building C object lib/CMakeFiles/kendryte.dir/drivers/pwm.c.obj [ 67%] Building C object lib/CMakeFiles/kendryte.dir/drivers/rtc.c.obj [ 70%] Building C object lib/CMakeFiles/kendryte.dir/drivers/sha256.c.obj [ 73%] Building C object lib/CMakeFiles/kendryte.dir/drivers/spi.c.obj [ 76%] Building C object lib/CMakeFiles/kendryte.dir/drivers/sysctl.c.obj [ 79%] Building C object lib/CMakeFiles/kendryte.dir/drivers/timer.c.obj [ 82%] Building C object lib/CMakeFiles/kendryte.dir/drivers/uart.c.obj [ 85%] Building C object lib/CMakeFiles/kendryte.dir/drivers/uarths.c.obj [ 88%] Building C object lib/CMakeFiles/kendryte.dir/drivers/utils.c.obj [ 91%] Building C object lib/CMakeFiles/kendryte.dir/drivers/wdt.c.obj [ 94%] Linking C static library libkendryte.a [ 94%] Built target kendryte Scanning dependencies of target hello_world [ 97%] Building C object CMakeFiles/hello_world.dir/src/hello_world/main.c.obj [100%] Linking C executable hello_world Generating .bin file ... [100%] Built target hello_world到这里Ubuntu与Windows两大常用系统下面的环境就搭建好了，怎么选择完全可以看个人了。在使用桌面版Ubuntu时，完全可以时VS Code来完成写代码，同时在Ubuntu编译(迷信编译)。后面的文章将会位大家介绍下Kflash的简单用法。