# RTT-RED_V **Repository Path**: MicroPeople/rtt-red_v ## Basic Information - **Project Name**: RTT-RED_V - **Description**: No description available - **Primary Language**: C - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2020-11-11 - **Last Updated**: 2020-12-19 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README ### RED-V简介 ​ RED-V的核心芯片FE310-G002是 SiFive 的 Freedom Everywhere 可定制 SoCs 系列 FE310 的一个升级版本,基于Sifive的E31核,主频最高可达 320MHz 。开发板很小巧,资源并不丰富但足以实现常规功能,例如PWM、SPI、I2C、UART等,其接口兼容Arduino Uno R3。 ​ 目前,据我所知,RED-V RedBoard支持FreeStudio IDE。当然,本质还是基于[freedom-e-sdk](https://github.com/sifive/freedom-e-sdk)。 ### FreeStudio使用教程 > url:https://learn.sparkfun.com/tutorials/red-v-development-guide 在[FreeStudio](https://www.sifive.com/software)中基于[freedom-e-sdk](https://github.com/sifive/freedom-e-sdk)进行开发。FreeStudio不用安装,下载压缩包解压即可使用。 我采用烧录固件的方法是 * 新建工程并改动代码(如果需要) * Ctrl+B生成hex文件 * 将hex文件复制到HiFive驱动器中 * 一般情况下,RedBoard会自动运行加载的固件并重新连接,否则点击RedBoard上RESET按键从而运行程序 ### PWM呼吸灯 > freedom-metal中[pwm头文件](https://github.com/sifive/freedom-metal/blob/cb50f878e122467b626b361871735036895415b5/metal/pwm.h)和[pwm源文件](https://github.com/sifive/freedom-metal/blob/cb50f878e122467b626b361871735036895415b5/src/pwm.c)。 * 调用 `metal_pwm_get_device` 获取PWM1对象,对应IO19,管脚为`~3` * 调用`metal_pwm_enable`使能PWM * 调用`metal_pwm_set_freq`设置PWM频率为20kHz * 调用`metal_pwm_set_duty` 和 `metal_pwm_trigger`设置比较值和触发方式 ```c int main(void) { time_t timeout; unsigned int pwmVal = PWM_MAX; printf("%s %s \n", __DATE__, __TIME__); printf("PWM demo test..\n"); /* Get a PWM device instance */ pwm = metal_pwm_get_device(1); if (pwm == NULL) { printf("PWM not available \n"); return RET_NOK; } /* Enable PWM1 instance */ metal_pwm_enable(pwm); /* Set PWM1 to 20KHz */ metal_pwm_set_freq(pwm, PWM_CHANNEL, 20000); /* Set Duty cycle and phase correct mode */ metal_pwm_set_duty(pwm, PWM_CHANNEL, 90, METAL_PWM_PHASE_CORRECT_DISABLE); /* Start in continuous mode */ metal_pwm_trigger(pwm, PWM_CHANNEL, METAL_PWM_CONTINUOUS); /* Loop forever */ while (1) { printf("PWM RUNNING \n"); while (pwmVal) { pwmVal--; metal_pwm_set_duty(pwm, PWM_CHANNEL, pwmVal, METAL_PWM_PHASE_CORRECT_DISABLE); //由暗变亮 delay_ms(PWM_DELAY); } while (pwmVal< PWM_MAX) { pwmVal++; metal_pwm_set_duty(pwm, PWM_CHANNEL, pwmVal, METAL_PWM_PHASE_CORRECT_DISABLE); //由亮变暗 delay_ms(PWM_DELAY); } } return RET_OK; } ``` ### I2C驱动OLED * 调用`metal_i2c_get_device`获取I2C对象 * `metal_i2c_init`初始化I2C * 调用`metal_i2c_write`发送数据 RED-V的I2C管脚分别为19(SCL),18(SDA)。 ```c int main(void) { printf("%s %s \n", __DATE__, __TIME__); printf("I2C demo test..\n"); i2c_bus = metal_i2c_get_device(0); if (i2c_bus == NULL) { printf("I2C not available \n"); return RET_NOK; } metal_i2c_init(i2c_bus, I2C_BAUDRATE, METAL_I2C_MASTER); OLED_Init(); while (1) { OLED_ShowStr(0,2,"I2C demo test..",1); //display OLED_ShowStr(0,5,"SparkFun Red-V Board",2); delay_ms(3000); } return RET_OK; } ``` ### 移植RT-Thread #### 准备 > note:此移植过程参考了@[luhuadong](https://github.com/luhuadong) 已完成的[移植结果](https://github.com/luhuadong/rt-thread/tree/riscv/bsp/sparkfun-redv)。 **下载rt-thread源码** ​ 首先下载一份rt-thread源码,为加快下载速度,我们从gitee[官方镜像](https://gitee.com/rtthread/rt-thread)下载。 ```bash git clone https://gitee.com/rtthread/rt-thread.git ``` 虽然在bsp目录下并没有找到RED-V的移植包,我们可以发现bsp/hifive1有移植包,hifive1作为RED-V的好兄弟,核心芯片也是SIfive基于RISC-V架构的[FE310-G000](https://sifive.com/chip-designer#fe310),并且可以使用FreedomStudio开发。我们按照hifive1的移植过程尝试移植RED-V。 **下载Env工具** > Env 是 RT-Thread 推出的开发辅助工具,针对基于 RT-Thread 操作系统的项目工程,提供编译构建环境、图形化系统配置及软件包管理功能。 Env工具的下载地址为https://www.rt-thread.org/page/download.html Env工具使用说明https://www.rt-thread.org/document/site/programming-manual/env/env/# #### 开始移植 **1.** 打开Env工具。cd到FreedomStudio安装目录,例如我的安装目录在D:\Program\FreedomStudio-2020-06-3。 ```bash > cd D:\Program\FreedomStudio-2020-06-3 ``` **2.** 设置工具链 ```bash > set RTT_EXEC_PATH=D:\Program\FreedomStudio-2020-06-3\SiFive\riscv64-unknown-elf-gcc-8.3.0-2020.04.1\bin\ > set PATH=%PATH%;D:\Program\FreedomStudio-2020-06-3\SiFive\riscv64-unknown-elf-gcc-8.3.0-2020.04.1\bin\ ``` **3.** 注意,**直接**在命令行中打开FreedomStudio ``` > FreedomStudio.exe ``` **4.** 打开后,在 `File->Import`导入工程, ![1](pic/1.png) **5.** 选择路径path\rt-thread\bsp\hifive1 > note: 在导入前,若有需要请备份hifive1文件夹。 ![2](pic/2.png) **6.** 点击Next,取消勾选Debug,点击FInish ​ 修改rtconfig.py line32 的'riscv-none-embed-' 为'riscv64-unknown-elf-' **7.** 此时会报错 `AttributeError: 'module' object has no attribute 'VENDOR':` ​ 所以在rtconfig加上VENDOR = 'sifive' **8.** 为了生成hex文件,在rtconfig.py文件中加上 *line29左右* TARGET_NAME_HEX = 'rtthread.hex' *line65左右* POST_ACTION += OBJCPY + ' -O ihex $TARGET ' + TARGET_NAME_HEX + '\n' **9.** 再次build工程,如果发现重定义的错误,建议右键工程,选择 `Delete` ,关闭FreedomStudio,关闭Env。 在工程目录`bsp/hifive1`删除选中文件,如图 ![3](pic/3.png) 然后重新执行步骤1~5,点击Build。成功后,将右侧的rtthread.hex拖入RED-V的磁盘中。 ![4](pic/4.png) **10.** 修改flash大小,否则虽然可以完成编译,但无法运行。 在D:\Project\wsFreedomStudio\rt-thread\bsp\hifive1\freedom-e-sdk\bsp\env\freedom-e300-hifive1\flash.lds line7 flash (rxai!w) : ORIGIN = 0x20400000, LENGTH = 512M --> flash (rxai!w) : ORIGIN = 0x20010000, LENGTH = 0x6a120 > 如果你想直接上手RT-Thread,可以直接参考@[luhuadong](https://github.com/luhuadong) 已完成的[移植结果](https://github.com/luhuadong/rt-thread/tree/riscv/bsp/sparkfun-redv)。当然也可以参考[我的](https://gitee.com/shhsidbsa/rtt-red_v)。 ### 心得体会 ​ 非常感谢硬禾学堂举办的FunPack活动。FunPack第二期让我第一次见识到 RISC-V架构 ,虽然初识RISC-V,由于官方提供了现成的SDK,在编写指定功能的代码时,RED-V的开发与STM32的开发方式类似。RISC-V正在高速发展,由于其开源,在生态建设上有越来越多的公司加大投入。虽然RISC-V到能撼动主流架构还需要走很长的路,我相信它在社区的拥抱下能走的更远。 ​ 感谢@[luhuadong](https://github.com/luhuadong) 关于RT-Thread的移植结果,让我自己也尝试移植RT-Thread到RISC-V架构下。移植过程很繁琐,期间遇到过很多奇怪的错误,这些错误大部分只能通过删文件或者重启软件消除。 ​ 最后,期待硬禾越办越好。