[update] 添加 RA 系列 BSP 开发教程: (#5598)
- 添加 RA 系列 BSP 开发教程 - 添加 ra6m4-iot PPP 上网 - 整理 驱动文件
|
@ -0,0 +1,22 @@
|
||||||
|
|
||||||
|
# RA BSP 说明
|
||||||
|
|
||||||
|
RA 系列 BSP 目前支持情况如下表所示:
|
||||||
|
|
||||||
|
| **BSP 文件夹名称** | **开发板名称** |
|
||||||
|
|:------------------------- |:-------------------------- |
|
||||||
|
| **RA6 系列** | |
|
||||||
|
| [ra6m4-cpk](ra6m4-cpk) | Renesas 官方 CPK-RA6M4 开发板 |
|
||||||
|
| [ra6m4-iot](ra6m4-iot) | Renesas 官方 IOT-RA6M4 开发板 |
|
||||||
|
|
||||||
|
可以通过阅读相应 BSP 下的 README 来快速上手,如果想要使用 BSP 更多功能可参考 docs 文件夹下提供的说明文档,如下表所示:
|
||||||
|
|
||||||
|
| **BSP 使用教程** | **简介** |
|
||||||
|
|:-------------------- |:------------------------------------------------- |
|
||||||
|
| [外设驱动使用教程](docs/RA系列BSP外设驱动使用教程.md) | 讲解 BSP 上更多外设驱动的使用方法 |
|
||||||
|
| [外设驱动介绍与应用](docs/RA系列驱动介绍.md) | 讲解 RA 系列 BSP 驱动的支持情况,以及如何利用驱动框架开发应用程序 |
|
||||||
|
| [使用 FSP 配置外设驱动](docs/RA系列使用FSP配置外设驱动.md) | 介绍如何使用 FSP 工具添加和配置外设 |
|
||||||
|
| **BSP 制作与提交** | **简介** |
|
||||||
|
| [BSP 制作教程](docs/RA系列BSP制作教程.md) | 讲解 RA 系列 BSP 的制作方法,以及在制作 BSP 和提交 BSP 时应当遵守的规范 |
|
||||||
|
| [外设驱动添加指南](docs/RA系列外设驱动添加指南.md) | 讲解 BSP 添加更多设备驱动的方法 |
|
||||||
|
|
|
@ -0,0 +1,383 @@
|
||||||
|
# RA 系列 BSP 制作教程
|
||||||
|
|
||||||
|
本文主要介绍 RENESAS RA 系列开发板的 BSP 制作教程,此教程能够帮助开发者更加方便快捷的制作新的 RA 系列 BSP,更好的理解 RA 系列 BSP 的框架结构。
|
||||||
|
|
||||||
|
在 RA 系列的每个 BSP 目录中包含 RA 模板工程、board、RT-Thread 的工程配置及构建脚本等,而对接到 RT-Thread 系统的通用驱动文件则存放在`renesas\libraries\HAL_Drivers`中。这两个部分共同组成一个完整的 BSP 工程。
|
||||||
|
|
||||||
|
在 RA 系列的 BSP 中引入了瑞萨电子的**[灵活配置软件包](https://www2.renesas.cn/jp/zh/software-tool/flexible-software-package-fsp)**(下文简称 FSP)配置工具,为使用 RA 系列 ARM 微控制器的嵌入式系统设计提供简单易用且可扩展的高质量软件。FSP 包括高性能、低内存占用的业界一流的 HAL 驱动程序,具有图形化配置界面和智能代码生成器。
|
||||||
|
|
||||||
|
RA 系列 BSP 框架的主要特性如下:
|
||||||
|
|
||||||
|
- 使用 FSP 生成的 RA 模板工程,降低新 BSP 的添加难度;
|
||||||
|
- 通用的驱动文件,开发者可以方便地使用所有驱动;
|
||||||
|
- 使用 FSP 配置工具对芯片外设进行图形化配置;
|
||||||
|
|
||||||
|
## 1. BSP 框架介绍
|
||||||
|
|
||||||
|
BSP 框架结构如下图所示:
|
||||||
|
|
||||||
|
![BSP 框架图](./figures/frame.png)
|
||||||
|
|
||||||
|
每一个 BSP 主要由两部分组成,分别是通用驱动库、特定开发板 BSP,下面的表格以 ra6m4-cpk 为例介绍这几个部分:
|
||||||
|
|
||||||
|
|项目|文件夹|说明|
|
||||||
|
| - | - | :-- |
|
||||||
|
| 通用库 | renesas\libraries\HAL_Drivers | 用于存放对接 RT-Thread 驱动框架的通用外设驱动 |
|
||||||
|
| 特定开发板 BSP | renesas\ra6m4-cpk | CPK-RA6M4 开发板的 BSP 工程 |
|
||||||
|
|
||||||
|
## 2. 知识准备
|
||||||
|
|
||||||
|
制作一个 BSP 的过程就是构建一个新系统的过程,因此想要制作出好用的 BSP,要对 RT-Thread 系统的构建过程有一定了解,需要的知识准备如下所示:
|
||||||
|
|
||||||
|
- 掌握 RA 系列 BSP 的使用方法
|
||||||
|
|
||||||
|
了解 BSP 的使用方法,可以阅读 [BSP 说明文档](../README.md) 中使用教程表格内的文档。了解外设驱动的添加方法可以参考《外设驱动添加指南》。
|
||||||
|
|
||||||
|
- 了解 [Scons](https://www.rt-thread.org/document/site/#/development-tools/scons/scons) 工程构建方法
|
||||||
|
|
||||||
|
RT-Thread 使用 Scons 作为系统的构建工具,因此了解 Scons 的常用命令对制作新 BSP 是基本要求。
|
||||||
|
|
||||||
|
- 了解[设备驱动框架](https://www.rt-thread.org/document/site/#/rt-thread-version/rt-thread-standard/programming-manual/device/device)
|
||||||
|
|
||||||
|
在 RT-Thread 系统中,应用程序通过设备驱动框架来操作硬件,因此了解设备驱动框架,对添加 BSP 驱动是很重要的。
|
||||||
|
|
||||||
|
- 了解 [Kconfig](https://www.rt-thread.org/document/site/#/development-tools/kconfig/kconfig) 语法
|
||||||
|
|
||||||
|
RT-Thread 系统通过 menuconfig 的方式进行配置,而 menuconfig 中的选项是由 Kconfig 文件决定的,因此想要对 RT-Thread 系统进行配置,需要对 kconfig 语法有一定了解。
|
||||||
|
|
||||||
|
- 熟悉 [FSP](https://www2.renesas.cn/jp/zh/software-tool/flexible-software-package-fsp) 配置工具的使用
|
||||||
|
|
||||||
|
FSP 提供了图形化配置工具和智能代码生成器,在制作和使用 BSP 的过程中经常会用到 FSP 配置工具。
|
||||||
|
|
||||||
|
## 3. BSP 制作方法
|
||||||
|
|
||||||
|
本节以制作 CPK-RA6M4 开发板的 BSP 为例,讲解如何为一个新的开发板添加 BSP,最终制作完成的 BSP 将支持 MDK 和 scons 两种方式构建。
|
||||||
|
|
||||||
|
BSP 的制作过程分为如下步骤:
|
||||||
|
|
||||||
|
1. 创建 BSP 目录
|
||||||
|
2. 创建 RA 模板工程
|
||||||
|
3. 配置模板工程
|
||||||
|
4. 修改 Kconfig 文件
|
||||||
|
5. 修改工程构建和配置文件
|
||||||
|
6. 重新生成工程
|
||||||
|
7. 添加 GCC 格式链接脚本
|
||||||
|
8. 修改 rtconfig.py 中的编译参数
|
||||||
|
|
||||||
|
在接下来的章节中将会详细介绍这些步骤,帮助开发者创建所需要的 BSP。
|
||||||
|
|
||||||
|
### 3.1 创建 BSP 目录
|
||||||
|
|
||||||
|
- 创建 BSP 目录不需要直接创建空文件夹,只要复制 BSP 模板 `\renesas\libraries\bsp-template` 文件夹到 `\renesas` 目录并将名称修改为待添加的开发板名即可。命令可参考 **CPK-RA6M4** 的 BSP 命名为 **ra6m4-cpk**,因为 ra6m4-cpk 已经存在,所以本教程使用 **ra6m4-test** 作为新创建的 BSP 名称。
|
||||||
|
|
||||||
|
![image-20220217155725977](figures/bsp_crate.png)
|
||||||
|
|
||||||
|
![image-20220217160140135](figures/bsp_crate1.png)
|
||||||
|
|
||||||
|
![image-20220217161302858](figures/bsp_crate2.png)
|
||||||
|
|
||||||
|
### 3.2 创建 RA 模板工程
|
||||||
|
|
||||||
|
第一步是使用 FSP 来创建一个 RA 模板工程。
|
||||||
|
|
||||||
|
- 在 FSP 安装目录下找到 /eclipse/rasc.exe 双击打开,开启后会自动进入创建工程界面。
|
||||||
|
|
||||||
|
![fsp_crate](figures/fsp_crate.png)
|
||||||
|
|
||||||
|
![fsp_crate1](figures/fsp_crate1.png)
|
||||||
|
|
||||||
|
![fsp_crate2](figures/fsp_crate2.png)
|
||||||
|
|
||||||
|
![fsp_crate3](figures/fsp_crate3.png)
|
||||||
|
|
||||||
|
![fsp_crate4](figures/fsp_crate4.png)
|
||||||
|
|
||||||
|
![fsp_crate5](figures/fsp_crate5.png)
|
||||||
|
|
||||||
|
![image-20220211182959790](figures/fsp_crate6.png)
|
||||||
|
|
||||||
|
创建完成后会得到一个 RA 模板工程和 BSP 最基本的配置文件和驱动文件,如上图所示。
|
||||||
|
|
||||||
|
### 3.3 配置模板工程
|
||||||
|
|
||||||
|
RA 模板工程创建完成后,需要做些修改并添加基础外设 GPIO、UART。
|
||||||
|
|
||||||
|
- 打开模板工程 `template.uvprojx`
|
||||||
|
|
||||||
|
![image-20220214174740157](figures/template_open.png)
|
||||||
|
|
||||||
|
- 修改 MDK 工程配置
|
||||||
|
> **Debug 配置:** 先截图记录下修改前的 Debug 页配置,修改 Device 后 Debug 页的部分配置会发生修改,改完 Device 后手动修改到默认配置。
|
||||||
|
|
||||||
|
![img](figures/template_config4.png)
|
||||||
|
|
||||||
|
> **Device 配置:**修改 Device 选项,根据开发板使用的具体芯片型号选择 device。
|
||||||
|
|
||||||
|
![img](figures/template_config.png)
|
||||||
|
|
||||||
|
> **Output 配置:** 修改 `Name of Exexutable`为 rtthread,勾选 `Create HEX File`,因为最终烧录的是 HEX 文件。
|
||||||
|
|
||||||
|
![image-20220218144358105](figures/template_config1.png)
|
||||||
|
|
||||||
|
> **User 配置:**在用到 TrustZone 时,有额外调用的划分 Secure & Non-Secure 用到的一些指令,如果开发时用的都是 Flat mode 的话,这部分可以忽略。如果需要可以添加命令【cmd /c "start "Renesas" /w cmd /c ""$Slauncher\rasc_launcher.bat" "3.5.0" --gensecurebundle --compiler ARMv6 "$Pconfiguration.xml" "$L%L" 2> "%%TEMP%%\rasc_stderr.out"""】
|
||||||
|
|
||||||
|
![img](figures/template_config2.png)
|
||||||
|
|
||||||
|
> **C/C++ 配置:**修改编译参数选项关闭部分警告,删除“-Wextra“、”-Wconversion“、”-Wshadow ” 。
|
||||||
|
>
|
||||||
|
> 以 ra6m4-cpk 为例修改后为:-Wno-license-management -Wuninitialized -Wall -Wmissing-declarations -Wpointer-arith -Waggregate-return -Wfloat-equal
|
||||||
|
|
||||||
|
![img](figures/template_config3.png)
|
||||||
|
|
||||||
|
> **Utilities 配置:**如图勾选`Use External Tool for Flash Programming`。配置完成点击 `OK` 保存配置。
|
||||||
|
|
||||||
|
![img](figures/template_config5.png)
|
||||||
|
|
||||||
|
- 从 MDK 打开 FSP
|
||||||
|
|
||||||
|
> **如何在 MDK 中打开 FSP:**
|
||||||
|
>
|
||||||
|
> 1. 打开 MDK,选择 “Tools -> Customize Tools Menu…”
|
||||||
|
> 2. 点击 “new” 图标,添加一条自定义命令: RA Smart Configurator
|
||||||
|
> 3. Command 输入工具的安装路径, 点击“…”找到安装路径下的“rasc.exe”文件并选中 (setup_fsp_xxxxx 安装目录下)
|
||||||
|
> 4. Initial Folder 输入参数: $P
|
||||||
|
> 5. Arguments 输入参数: --device $D --compiler ARMv6 configuration.xml
|
||||||
|
> 6. 点击 OK 保存命令“Tools -> RA smart Configurator”
|
||||||
|
![img](figures/fsp_config.png)
|
||||||
|
> 7. 点击添加的命令打开配置工具:**RA Smart Config**
|
||||||
|
![img](figures/fsp_config1.png)
|
||||||
|
|
||||||
|
- 添加 UART 端口
|
||||||
|
> 选择 Stacks 配置页,点击 New Stack 找到 UART。
|
||||||
|
![image](figures/fsp_uart.png)
|
||||||
|
> 确认开发板可用于 msh 的 UART 通道。配置 UART 参数,因为需要适配 RT-Thread 驱动中使用的命名所以需要修改,设置 **name** 、**channel** 、**callback** 为一致的标号。格式:channel = **X**,name = g_uart**X**、callback = user_uart**X**_callback
|
||||||
|
![image](figures/fsp_uart1.png)
|
||||||
|
|
||||||
|
### 3.4 修改 Kconfig 选项
|
||||||
|
|
||||||
|
在本小节中修改 `board/Kconfig` 文件的内容有如下两点:
|
||||||
|
|
||||||
|
- 芯片型号和系列
|
||||||
|
- BSP 上的外设支持选项
|
||||||
|
|
||||||
|
芯片系列的定义在`renesas\libraries\Kconfig` 中,修改前先确认是否存在添加的芯片系列定义,如果是一个未添加的系列,需要先添加该芯片系列的定义。芯片型号和系列的命名格式如下表所示。
|
||||||
|
|
||||||
|
| 宏定义 | 意义 | 格式 |
|
||||||
|
| ------------------ | -------- | ------------------ |
|
||||||
|
| SOC_R7FA6M4AF | 芯片型号 | SOC_R7FAxxxxx |
|
||||||
|
| SOC_SERIES_R7FA6M4 | 芯片系列 | SOC_SERIES_R7FAxxx |
|
||||||
|
|
||||||
|
关于 BSP 上的外设支持选项,一个初次提交的 BSP 仅仅需要支持 GPIO 驱动和串口驱动即可,因此在配置选项中只需保留这两个驱动配置项,如下图所示:
|
||||||
|
|
||||||
|
![修改 Kconfig](./figures/Kconfig.png)
|
||||||
|
|
||||||
|
### 3.5 修改工程构建和配置文件
|
||||||
|
接下来需要修改用于构建工程相关的文件。
|
||||||
|
|
||||||
|
- 修改启动文件 startup.c
|
||||||
|
|
||||||
|
> 源文件路径:**ra6m4-cpk\ra\fsp\src\bsp\cmsis\Device\RENESAS\Source\startup.c**
|
||||||
|
|
||||||
|
```c
|
||||||
|
#ifdef __ARMCC_VERSION
|
||||||
|
main();
|
||||||
|
#elif defined(__GNUC__)
|
||||||
|
extern int entry(void);
|
||||||
|
entry();
|
||||||
|
#endif
|
||||||
|
```
|
||||||
|
|
||||||
|
![img](figures/startup_c.png)
|
||||||
|
|
||||||
|
- 修改 SRAM 大小配置
|
||||||
|
|
||||||
|
![image-20220303113833249](figures/board_config.png)
|
||||||
|
|
||||||
|
- 修改 GPIO 中断配置
|
||||||
|
|
||||||
|
根据 BSP 使用芯片支持的 IRQ 中断情况修改配置文件。可以使用 FSP 配置工具对照查看 IO 引脚号对应的 IRQ 通道。
|
||||||
|
|
||||||
|
![image-20220217174433724](figures/bsp_gpio.png)
|
||||||
|
|
||||||
|
- 修改初始应用层代码
|
||||||
|
|
||||||
|
在 RA 系列的 BSP 中,应用层代码存放在 `src/hal_entry.c` 中。使用 FSP 生成的默认应用代码需要全部替换为如下代码,如果开发板没有板载 LED 可以将 `while(1)` 中的代码删除。
|
||||||
|
|
||||||
|
```c
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2006-2021, RT-Thread Development Team
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: Apache-2.0
|
||||||
|
*
|
||||||
|
* Change Logs:
|
||||||
|
* Date Author Notes
|
||||||
|
* 2021-10-10 Sherman first version
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <rtthread.h>
|
||||||
|
#include "hal_data.h"
|
||||||
|
#include <rtdevice.h>
|
||||||
|
|
||||||
|
#define LED_PIN BSP_IO_PORT_01_PIN_06 /* Onboard LED pins */
|
||||||
|
|
||||||
|
void hal_entry(void)
|
||||||
|
{
|
||||||
|
rt_kprintf("\nHello RT-Thread!\n");
|
||||||
|
|
||||||
|
while (1)
|
||||||
|
{
|
||||||
|
rt_pin_write(LED_PIN, PIN_HIGH);
|
||||||
|
rt_thread_mdelay(500);
|
||||||
|
rt_pin_write(LED_PIN, PIN_LOW);
|
||||||
|
rt_thread_mdelay(500);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
### 3.6 重新生成工程
|
||||||
|
|
||||||
|
重新生成工程需要使用 Env 工具。
|
||||||
|
|
||||||
|
- 重新生成 rtconfig.h 文件
|
||||||
|
|
||||||
|
在 Env 界面输入命令 menuconfig 对工程进行配置,并生成新的 rtconfig.h 文件。如下图所示:
|
||||||
|
|
||||||
|
![输入menuconfig进入配置界面](./figures/menuconfig_1.png)
|
||||||
|
|
||||||
|
打开 GPIO 和 console 使用的 UART 端口。
|
||||||
|
|
||||||
|
![选择要打开的外设](./figures/menuconfig_2.png)
|
||||||
|
|
||||||
|
修改 console 输出使用的设备名称。
|
||||||
|
|
||||||
|
![image-20220303103240414](figures/menuconfig2.png)
|
||||||
|
|
||||||
|
- 生成 MDK 应用工程
|
||||||
|
下面以重新生成 MDK 工程为例,介绍如何重新生成 BSP 工程。
|
||||||
|
|
||||||
|
使用 env 工具输入命令 `scons --target=mdk5` 重新生成工程,如下图所示:
|
||||||
|
|
||||||
|
![重新生成 BSP 工程](./figures/menuconfig_3.png)
|
||||||
|
|
||||||
|
重新生成工程成功:
|
||||||
|
|
||||||
|
![重新生成 BSP 工程](./figures/menuconfig_4.png)
|
||||||
|
|
||||||
|
到这一步,基于 MDK 开发的 BSP 就可以使用了。如果要使用 GCC 工具链编译还需加入 GCC 格式的链接脚本。
|
||||||
|
|
||||||
|
### 3.7 添加 GCC 格式链接脚本
|
||||||
|
|
||||||
|
GCC 格式的链接脚本需要使用到瑞萨的 IDE 工具 e2studio。在 e2studio 中创建新的工程,步骤如下:
|
||||||
|
|
||||||
|
![image-20220218114041568](figures/e2studio1.png)
|
||||||
|
|
||||||
|
![image-20220218113955219](figures/e2studio.png)
|
||||||
|
|
||||||
|
![image-20220218114633339](figures/e2studio2.png)
|
||||||
|
|
||||||
|
![image-20220218114839257](figures/e2studio3.png)
|
||||||
|
|
||||||
|
![image-20220218115035562](figures/e2studio4.png)
|
||||||
|
|
||||||
|
![image-20220218115332866](figures/e2studio5.png)
|
||||||
|
|
||||||
|
工程创建完成后,我们需要将工程中的两个 xxx.ld 文件 copy 到 BSP 中的 script 目录下。
|
||||||
|
|
||||||
|
![image-20220218115715957](figures/e2studio6.png)
|
||||||
|
|
||||||
|
- 修改链接脚本
|
||||||
|
|
||||||
|
> 链接脚本文件路径:**ra6m4-cpk\script\fsp.ld**
|
||||||
|
|
||||||
|
![image-20220215182642126](figures/linkscript1.png)
|
||||||
|
|
||||||
|
> 将下面的代码复制到 text 段中,**注意要添加到 text{ } 括号内**
|
||||||
|
|
||||||
|
```shell
|
||||||
|
/* section information for finsh shell */
|
||||||
|
. = ALIGN(4);
|
||||||
|
__fsymtab_start = .;
|
||||||
|
KEEP(*(FSymTab))
|
||||||
|
__fsymtab_end = .;
|
||||||
|
|
||||||
|
. = ALIGN(4);
|
||||||
|
__vsymtab_start = .;
|
||||||
|
KEEP(*(VSymTab))
|
||||||
|
__vsymtab_end = .;
|
||||||
|
|
||||||
|
/* section information for initial. */
|
||||||
|
. = ALIGN(4);
|
||||||
|
__rt_init_start = .;
|
||||||
|
KEEP(*(SORT(.rti_fn*)))
|
||||||
|
__rt_init_end = .;
|
||||||
|
|
||||||
|
. = ALIGN(4);
|
||||||
|
KEEP(*(FalPartTable))
|
||||||
|
```
|
||||||
|
|
||||||
|
> 添加后如下图所示:
|
||||||
|
|
||||||
|
![img](figures/linkscript.png)
|
||||||
|
|
||||||
|
### 3.8 修改 rtconfig.py 中的编译参数
|
||||||
|
|
||||||
|
![image-20220303165348085](figures/rtconfig_py.png)
|
||||||
|
|
||||||
|
除了上图的内核类型,还有编译参数的配置需要确认。相关配置项说明可查看文档中心对于 scons 工具的介绍。[跳转链接](https://www.rt-thread.org/document/site/#/development-tools/scons/scons?id=编译器选项)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
至此,一个基础的支持 GCC 和 MDK 的 BSP 工程就创建完成了,接着就可以使用 MDK 或 scons 验证开发的工程是否可编译、可运行。
|
||||||
|
|
||||||
|
感谢每一位贡献代码的开发者,RT-Thread 将与你一同成长。
|
||||||
|
|
||||||
|
## 4. 规范
|
||||||
|
|
||||||
|
本章节介绍 RT-Thread RA 系列 BSP 制作与提交时应当遵守的规范 。开发人员在 BSP 制作完成后,可以根据本规范提出的检查点对制作的 BSP 进行检查,确保 BSP 在提交前有较高的质量 。
|
||||||
|
|
||||||
|
### 4.1 BSP 制作规范
|
||||||
|
|
||||||
|
RA 的制作规范主要分为 3 个方面:工程配置,ENV 配置和 IDE 配置。在已有的 RA 系列 BSP 的模板中,已经根据下列规范对模板进行配置。在制作新 BSP 的过程中,拷贝模板进行修改时,需要注意的是不要修改这些默认的配置。BSP 制作完成后,需要对新制作的 BSP 进行功能测试,功能正常后再进行代码提交。
|
||||||
|
|
||||||
|
下面将详细介绍 BSP 的制作规范。
|
||||||
|
|
||||||
|
#### 4.1.1 工程配置
|
||||||
|
|
||||||
|
- 遵从RT-Thread 编码规范,代码注释风格统一
|
||||||
|
- main 函数功能保持一致
|
||||||
|
- 如果有 LED 的话,main 函数里**只放一个** LED 1HZ 闪烁的程序
|
||||||
|
- 在 `rt_hw_board_init` 中需要完成堆的初始化:调用 `rt_system_heap_init`
|
||||||
|
- 默认只初始化 GPIO 驱动和 FinSH 对应的串口驱动,不使用 DMA
|
||||||
|
- 当使能板载外设驱动时,应做到不需要修改代码就能编译下载使用
|
||||||
|
- 提交前应检查 GCC、MDK 编译器直接编译或者重新生成后编译是否成功
|
||||||
|
- 使用 `scons --dist` 命令对 BSP 进行发布,检查使用 `dist` 命令生成的工程是否可以正常使用
|
||||||
|
|
||||||
|
#### 4.1.2 ENV 配置
|
||||||
|
|
||||||
|
- 系统心跳统一设置为 1000(宏:RT_TICK_PER_SECOND)
|
||||||
|
- BSP 中需要打开调试选项中的断言(宏:RT_DEBUG)
|
||||||
|
- 系统空闲线程栈大小统一设置为 256(宏:IDLE_THREAD_STACK_SIZE)
|
||||||
|
- 开启组件自动初始化(宏:RT_USING_COMPONENTS_INIT)
|
||||||
|
- 需要开启 user main 选项(宏:RT_USING_USER_MAIN)
|
||||||
|
- 默认关闭 libc(宏:RT_USING_LIBC)
|
||||||
|
- FinSH 默认只使用 MSH 模式(宏:FINSH_USING_MSH_ONLY)
|
||||||
|
|
||||||
|
#### 4.1.3 IDE 配置
|
||||||
|
|
||||||
|
- 使能下载代码后自动运行
|
||||||
|
- 使能 C99 支持
|
||||||
|
- 使能 One ELF Section per Function(MDK)
|
||||||
|
- MDK/IAR 生成的临时文件分别放到build下的 MDK/IAR 文件夹下
|
||||||
|
- MDK/GCC/IAR 生成 hex 文件名字统一成 rtthread.hex
|
||||||
|
|
||||||
|
### 4.2 BSP 提交规范
|
||||||
|
|
||||||
|
- 提交前请认真修改 BSP 的 README.md 文件,README.md 文件的外设支持表单只填写 BSP 支持的外设,可参考其他 BSP 填写。查看文档[《RA系列驱动介绍》](./RA系列驱动介绍.md)了解驱动分类。
|
||||||
|
- 提交 BSP 分为 2 个阶段提交:
|
||||||
|
- 第一阶段:基础 BSP 包括串口驱动和 GPIO 驱动,能运行 FinSH 控制台。完成 MDK5 、IAR 和 GCC 编译器支持,如果芯片不支持某款编译器(比如MDK4)可以不用做。 BSP 的 README.md 文件需要填写第二阶段要完成的驱动。
|
||||||
|
- 第二阶段:完成板载外设驱动支持,所有板载外设使用 menuconfig 配置后就能直接使用。若开发板没有板载外设,则此阶段可以不用完成。不同的驱动要分开提交,方便 review 和合并。
|
||||||
|
- 只提交 BSP 必要的文件,删除无关的中间文件,能够提交的文件请对照其他 BSP。
|
||||||
|
- 提交前要对 BSP 进行编译测试,确保在不同编译器下编译正常
|
||||||
|
- 提交前要对 BSP 进行功能测试,确保 BSP 的在提交前符合工程配置章节中的要求
|
|
@ -0,0 +1,93 @@
|
||||||
|
# RA系列BSP外设驱动使用教程
|
||||||
|
|
||||||
|
## 1. 简介
|
||||||
|
|
||||||
|
本文档是为需要在 RT-Thread 操作系统上使用更多开发板资源的开发者准备的。通过使用 ENV 工具对 BSP 进行配置,可以开启更多板载资源,实现更多高级功能。
|
||||||
|
|
||||||
|
主要包括以下内容:
|
||||||
|
|
||||||
|
1. 如何使用开发板上更多的板载资源
|
||||||
|
2. 如何使用更多的片上资源
|
||||||
|
3. 如何添加更多片上资源选项
|
||||||
|
|
||||||
|
## 2. 前提要求
|
||||||
|
|
||||||
|
- 学会如何使用 ENV 工具,参考:[RT-Thread env 工具用户手册](https://www.rt-thread.org/document/site/programming-manual/env/env/)
|
||||||
|
- 熟悉 [FSP](https://www2.renesas.cn/jp/zh/software-tool/flexible-software-package-fsp) 配置工具的使用
|
||||||
|
|
||||||
|
## 3. 如何使用更多的外设资源
|
||||||
|
|
||||||
|
开发板上一般有很多外设资源,如 SPI、SDIO、ADC 等,但是 BSP 工程默认没有开启这些外设驱动。RT-Thread 提供了 ENV 工具来开启或关闭 BSP 的外设驱动。本文以 RA6M4-CPK 开发板上开启 SPI 驱动为例,一步步地展示如何使用 ENV 工具对 BSP 进行配置。
|
||||||
|
|
||||||
|
### 3.1 打开配置工具
|
||||||
|
|
||||||
|
在 BSP 目录下打开 menuconfig 配置界面。
|
||||||
|
|
||||||
|
![image-20220218162910778](figures/menuconfig_ra6m4cpk.png)
|
||||||
|
|
||||||
|
打开的配置工具界面如下所示:
|
||||||
|
![config1](figures/config1.png)
|
||||||
|
|
||||||
|
通过键盘上的上下键移动光标,选中 `Hardware Drivers Config`然后按回车键进入硬件驱动配置菜单。
|
||||||
|
|
||||||
|
### 3.2 进入硬件驱动配置菜单
|
||||||
|
|
||||||
|
在硬件配置菜单里有三个选项,分别是 **板载外设配置菜单**、**片上外设配置菜单**和**扩展模块配置菜单**,使用下键切换到片上外设,按回车键进入配置菜单。
|
||||||
|
|
||||||
|
![硬件驱动配置菜单](figures/config2.png)
|
||||||
|
|
||||||
|
### 3.3 在板载外设配置菜单里开启 SPI Flash 选项
|
||||||
|
|
||||||
|
![image-20220218163357420](figures/menuconfig_spi.png)
|
||||||
|
|
||||||
|
![image-20220218163714429](figures/menuconfig_spi1.png)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
### 3.4 保存退出
|
||||||
|
|
||||||
|
然后右移光标选中 Save 按回车键保存,然后按 Esc 键退出配置工具。
|
||||||
|
|
||||||
|
![保存退出](figures/save.png)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
### 3.5 生成 MDK5 工程
|
||||||
|
|
||||||
|
输入命令 `scons --target=mdk5` 重新生成 MDK5 的工程。
|
||||||
|
|
||||||
|
![image-20220218164532436](figures/scons_mdk5.png)
|
||||||
|
|
||||||
|
### 3.6 FSP 添加 SPI 外设
|
||||||
|
|
||||||
|
![image-20220218171841353](figures/fsp_spi.png)
|
||||||
|
|
||||||
|
![image-20220218172446068](figures/fsp_spi1.png)
|
||||||
|
|
||||||
|
在 Pins 中配置 SPI1 端口引脚。**注意: SSLx 片选引脚设为 None,片选引脚的控制在驱动程序中由软件控制。**
|
||||||
|
|
||||||
|
配置完成,保存退出 FSP。
|
||||||
|
|
||||||
|
![image-20220218174145848](figures/fsp_spi2.png)
|
||||||
|
|
||||||
|
### 3.7 测试验证
|
||||||
|
|
||||||
|
回到生成的 MDK5 工程并编译。使用 FSP 配置完成后如果有新的文件添加进工程中,不会马上添加进去。需要先编译一次,如果弹出如下提醒,选择 “是” 然后再次编译即可。
|
||||||
|
|
||||||
|
![image-20220218174811328](figures/mdk_build.png)
|
||||||
|
|
||||||
|
编译成功后,点击 debug 按钮下载并进入调试页面。
|
||||||
|
|
||||||
|
![image-20220218175442360](figures/mdk_build1.png)
|
||||||
|
|
||||||
|
### 3.8 查看运行结果
|
||||||
|
|
||||||
|
程序运行后,输入命令 `list_device` 可以看到名为 spi1 的总线设备,此时 SPI1 总线已经可以使用了。
|
||||||
|
|
||||||
|
![image-20220218175926965](figures/run_spi1.png)
|
||||||
|
|
||||||
|
## 4. 总结
|
||||||
|
|
||||||
|
本文以 SPI 为例介绍了外设驱动使用的操作流程,其他类型的外设如何使用和配置请查看:[RA系列使用FSP配置外设驱动.md](RA系列使用FSP配置外设驱动.md)
|
||||||
|
|
||||||
|
当开发者需要使用未开启的外设时,只要在 ENV 工具中使能相关的外设,然后在 FSP 中添加即可,重新生成的工程中就会添加对应的驱动文件。
|
|
@ -1,6 +1,8 @@
|
||||||
## 在 MDK 中使用 FSP
|
# RA系列使用 FSP 配置外设驱动
|
||||||
|
|
||||||
### 添加RA Smart Config
|
## 1. 准备工作
|
||||||
|
|
||||||
|
### 1.1 在 MDK 中添加用于启动FSP的自定义命令
|
||||||
|
|
||||||
1. 打开 MDK,选择 “Tools -> Customize Tools Menu…”
|
1. 打开 MDK,选择 “Tools -> Customize Tools Menu…”
|
||||||
2. 点击 “new” 图标,添加一条自定义命令: RA Smart Configurator
|
2. 点击 “new” 图标,添加一条自定义命令: RA Smart Configurator
|
||||||
|
@ -9,52 +11,45 @@
|
||||||
5. Arguments 输入参数: --device $D --compiler ARMv6 configuration.xml
|
5. Arguments 输入参数: --device $D --compiler ARMv6 configuration.xml
|
||||||
6. 点击 OK 保存命令
|
6. 点击 OK 保存命令
|
||||||
|
|
||||||
![img](picture/customize.png)
|
![img](figures/customize.png)
|
||||||
|
|
||||||
7. 点击添加的命令 “Tools -> RA smart Configurator”,**打开配置工具**:RA Smart Config
|
7. 点击添加的命令 “Tools -> RA smart Configurator”,**打开配置工具**:RA Smart Config
|
||||||
|
|
||||||
![image.png](picture/openrasc.png)
|
![image.png](figures/openrasc.png)
|
||||||
|
|
||||||
### 添加 Device Partition Manager,添加步骤同上。
|
PS:以上相关操作也可以在 FSP 的说明文档中找到。
|
||||||
|
|
||||||
1. 输入命令名称:`Device Partition Manager`
|
FSP 文档:https://www2.renesas.cn/jp/zh/software-tool/flexible-software-package-fsp#document
|
||||||
2. Command: 在安装路径选中`rasc.exe`
|
|
||||||
3. Initial Folder :`$P`
|
|
||||||
4. Arguments:`-application com.renesas.cdt.ddsc.dpm.ui.dpmapplication configuration.xml "SL%L"`
|
|
||||||
|
|
||||||
> PS:以上相关操作也可以在 FSP 的说明文档中找到。
|
### 1.2 注意事项
|
||||||
>
|
|
||||||
> 文档路径(本地):在 FSP 的安装目录下 .\fsp_documentation\v3.5.0\fsp_user_manual_v3.5.0\index.html
|
|
||||||
>
|
|
||||||
> 文档路径(官网):https://www2.renesas.cn/jp/zh/software-tool/flexible-software-package-fsp#document
|
|
||||||
|
|
||||||
### FSP 版本选择
|
#### 1.2.1 FSP 版本选择
|
||||||
|
|
||||||
此 BSP 已更新 **FSP 3.5.0** 版本的支持,请使用 **FSP 3.5.0** 版本进行配置修改。下文中部分操作截图使用的是 FSP 3.1.0 版本,仅供参考。
|
RA系列已更新 **FSP 3.5.0** 版本的支持,请使用 **FSP 3.5.0** 版本进行配置修改,**旧版本可能存在兼容性问题**。
|
||||||
|
|
||||||
**使用 RASC 前请务必检查 FSP version 、Board、Device 配置项是否正确。**
|
**使用 RASC 前请务必检查 FSP version 、Board、Device 配置项是否正确。**
|
||||||
|
|
||||||
![fsp_version](picture/fsp_version.png)
|
![fsp_version](figures/fsp_version.png)
|
||||||
|
|
||||||
## 更新工程配置
|
#### 1.2.2 更新工程配置
|
||||||
|
|
||||||
使用 FSP 配置完成后如果有新的文件添加进工程中,不会马上添加进去。需要先编译一次,如果弹出如下提醒,选择 “是” 然后再次编译即可。
|
使用 FSP 配置完成后如果有新的文件添加进工程中,不会马上添加进去。需要先编译一次,如果弹出如下提醒,选择 “是” 然后再次编译即可。
|
||||||
|
|
||||||
![img](picture/import_changes.png)
|
![img](figures/import_changes.png)
|
||||||
|
|
||||||
## 如何使用 RASC 添加外设
|
## 2. 使用 FSP 添加并配置外设
|
||||||
|
|
||||||
**注意:文档中的外设添加步骤均为单独配置的说明,排版顺序不代表外设添加顺序,如遇到引脚冲突请查阅开发板及芯片手册的相关章节。**
|
**PS:文档中的外设添加步骤均为单独配置的说明,排版顺序不代表外设添加顺序,如遇到引脚冲突请查阅开发板及芯片手册的相关章节。**
|
||||||
|
|
||||||
### UART
|
### UART
|
||||||
|
|
||||||
如何添加一个 UART 端口外设配置?
|
如何添加一个 UART 端口外设配置?
|
||||||
|
|
||||||
1. 选择 Stacks 配置页,点击 New Stack 找到 UART。
|
1. 选择 Stacks 配置页,点击 New Stack 找到 UART。
|
||||||
|
![image.png](figures/fsp_uart.png)
|
||||||
|
|
||||||
![image.png](picture/rascuart.png)
|
2. 配置 UART 参数,因为需要适配 RT-Thread 驱动中使用的命名,所以需要修改命名,设置**name** 、**channel** 、**callback** 为一致的标号。
|
||||||
|
![image.png](figures/fsp_uart1.png)
|
||||||
2. 配置 UART 参数,因为需要适配 RT-Thread 驱动中使用的命名,所以需要修改命名,设置**name** 、**channel** 、**callback** 是一致的标号。![image.png](picture/rascuart1.png)
|
|
||||||
|
|
||||||
### GPIO 中断
|
### GPIO 中断
|
||||||
|
|
||||||
|
@ -62,17 +57,17 @@
|
||||||
|
|
||||||
1. 选择引脚编号,进入配置,比如选择 P105 做为中断引脚。可先找到引脚查看可配置成的 IRQx 通道号。
|
1. 选择引脚编号,进入配置,比如选择 P105 做为中断引脚。可先找到引脚查看可配置成的 IRQx 通道号。
|
||||||
|
|
||||||
![image-20211103200949759](picture/p105.png)
|
![image-20211103200949759](figures/p105.png)
|
||||||
|
|
||||||
2. 打开 ICU 中断通道 IRQ00
|
2. 打开 ICU 中断通道 IRQ00
|
||||||
|
|
||||||
![image-20211103200813467](picture/irq0.png)
|
![image-20211103200813467](figures/irq0.png)
|
||||||
|
|
||||||
3. 创建 stack 并进入配置。因为需要适配 RT-Thread 驱动中使用的命名,所以需要修改命名,设置**name** 、**channel** 、**callback** 是一致的标号。选择你希望的触发方式,最后保存配置,生成配置代码。
|
3. 创建 stack 并进入配置。因为需要适配 RT-Thread 驱动中使用的命名,所以需要修改命名,设置 **name** 、**channel** 、**callback** 为一致的标号。选择你希望的触发方式,最后保存配置,生成配置代码。
|
||||||
|
|
||||||
![](picture/1635929089445.png)
|
![](figures/1635929089445.png)
|
||||||
|
|
||||||
![image-20211103201047103](picture/irq1.png)
|
![image-20211103201047103](figures/irq1.png)
|
||||||
|
|
||||||
4. 测试中断是否成功开启
|
4. 测试中断是否成功开启
|
||||||
|
|
||||||
|
@ -106,78 +101,78 @@
|
||||||
|
|
||||||
1. 创建 WDT
|
1. 创建 WDT
|
||||||
|
|
||||||
![image-20211019152302939](picture/wdt.png)
|
![image-20211019152302939](figures/wdt.png)
|
||||||
|
|
||||||
2. 配置 WDT,需要注意在 RT-Thread 中只使用了一个 WDT 设备,所以没有对其进行编号,如果是新创建的 WDT 设备需要注意 name 字段,在驱动中默认使用的是`g_wdt` 。
|
2. 配置 WDT,需要注意在 RT-Thread 中只使用了一个 WDT 设备,所以没有对其进行编号,如果是新创建的 WDT 设备需要注意 name 字段,在驱动中默认使用的是`g_wdt` 。
|
||||||
|
|
||||||
![image-20211019152407572](picture/wdt_config.png)
|
![image-20211019152407572](figures/wdt_config.png)
|
||||||
|
|
||||||
3. 如何在 ENV 中打开 WDT 以及[WDT 接口使用说明](https://www.rt-thread.org/document/site/#/rt-thread-version/rt-thread-standard/programming-manual/device/watchdog/watchdog)
|
3. 如何在 ENV 中打开 WDT 以及[WDT 接口使用说明](https://www.rt-thread.org/document/site/#/rt-thread-version/rt-thread-standard/programming-manual/device/watchdog/watchdog)
|
||||||
|
|
||||||
![image-20211027183406251](picture/wdt_env.png)
|
![image-20211027183406251](figures/wdt_env.png)
|
||||||
|
|
||||||
### RTC
|
### RTC
|
||||||
|
|
||||||
1. 添加 RTC 设备
|
1. 添加 RTC 设备
|
||||||
|
|
||||||
![image-20211019152536749](picture/rtc.png)
|
![image-20211019152536749](figures/rtc.png)
|
||||||
|
|
||||||
2. 配置 RTC,需要注意在 RT-Thread 中只是用了一个 RTC 设备,所以没有对其进行编号,如果是新创建的 RTC 设备需要注意 name 字段,在驱动中默认使用的是`g_rtc` 。修改 Callback 为 rtc_callback
|
2. 配置 RTC,需要注意在 RT-Thread 中只是用了一个 RTC 设备,所以没有对其进行编号,如果是新创建的 RTC 设备需要注意 name 字段,在驱动中默认使用的是`g_rtc` 。修改 Callback 为 rtc_callback
|
||||||
|
|
||||||
![image-20211019152627412](picture/rtc_config.png)
|
![image-20211019152627412](figures/rtc_config.png)
|
||||||
|
|
||||||
3. 如何在 ENV 中打开 RTC 以及[ RTC 接口使用说明](https://www.rt-thread.org/document/site/#/rt-thread-version/rt-thread-standard/programming-manual/device/rtc/rtc)
|
3. 如何在 ENV 中打开 RTC 以及[ RTC 接口使用说明](https://www.rt-thread.org/document/site/#/rt-thread-version/rt-thread-standard/programming-manual/device/rtc/rtc)
|
||||||
|
|
||||||
![image-20211027181550233](picture/rtc_env.png)
|
![image-20211027181550233](figures/rtc_env.png)
|
||||||
|
|
||||||
### Flash
|
### Flash
|
||||||
|
|
||||||
1. 创建 Flash
|
1. 创建 Flash
|
||||||
|
|
||||||
![image-20211026105031200](picture/add_flash.png)
|
![image-20211026105031200](figures/add_flash.png)
|
||||||
|
|
||||||
2. 配置 Flash,需要注意在 RT-Thread 中只使用了一个 flash 设备,所以没有对其进行编号,如果是新创建的 flash 设备需要注意 name 字段,在驱动中默认使用的是`g_flash` 。
|
2. 配置 Flash,需要注意在 RT-Thread 中只使用了一个 flash 设备,所以没有对其进行编号,如果是新创建的 flash 设备需要注意 name 字段,在驱动中默认使用的是`g_flash` 。
|
||||||
|
|
||||||
![image-20211026105628706](picture/config_flash.png)
|
![image-20211026105628706](figures/config_flash.png)
|
||||||
|
|
||||||
3. 如何在 ENV 中打开 Flash
|
3. 如何在 ENV 中打开 Flash
|
||||||
|
|
||||||
![image-20211026123252310](picture/flash_menuconfig.png)
|
![image-20211026123252310](figures/flash_menuconfig.png)
|
||||||
|
|
||||||
### SPI
|
### SPI
|
||||||
|
|
||||||
1. 添加一个 SPI 外设端口
|
1. 添加一个 SPI 外设端口
|
||||||
|
|
||||||
![image-20211027180820968](picture/spi_add.png)
|
![image-20211027180820968](figures/spi_add.png)
|
||||||
|
|
||||||
2. 配置 channel、name、Clock Phase、Clock Polarity、Callback、 SPI Mode 等参数,波特率在代码中可通过 API 修改,这里可以设置一个默认值。
|
2. 配置 channel、name、Clock Phase、Clock Polarity、Callback、 SPI Mode 等参数,波特率在代码中可通过 API 修改,这里可以设置一个默认值。
|
||||||
|
|
||||||
![img](picture/spi.png)
|
![img](figures/fsp_spi1.png)
|
||||||
|
|
||||||
3. 在 Pins 中打开 SPI0 ,配置端口引脚。**注意:请勿在此处配置 SSLx 片选引脚,片选引脚的控制在驱动程序中由软件控制。**
|
3. 在 Pins 中打开 SPI1 ,配置端口引脚。**注意:请勿在此处配置 SSLx 片选引脚,片选引脚的控制在驱动程序中由软件控制。**
|
||||||
|
|
||||||
![image-20211209162334093](picture/spi_pin.png)
|
![image-20211209162334093](figures/fsp_spi2.png)
|
||||||
|
|
||||||
|
|
||||||
4. 如何在 ENV 中打开 SPI 以及 [SPI 接口使用说明](https://www.rt-thread.org/document/site/#/rt-thread-version/rt-thread-standard/programming-manual/device/spi/spi)
|
4. 如何在 ENV 中打开 SPI 以及 [SPI 接口使用说明](https://www.rt-thread.org/document/site/#/rt-thread-version/rt-thread-standard/programming-manual/device/spi/spi)
|
||||||
|
|
||||||
![image-20211027181444023](picture/spi_env.png)
|
![image-20211027181444023](figures/spi_env.png)
|
||||||
|
|
||||||
### ADC/DAC
|
### ADC/DAC
|
||||||
|
|
||||||
创建 ADC/DAC
|
创建 ADC/DAC
|
||||||
|
|
||||||
![img](picture/adc_dac.png)
|
![img](figures/adc_dac.png)
|
||||||
|
|
||||||
- **ADC**
|
- **ADC**
|
||||||
|
|
||||||
1. 配置 name、unit、mode,选择扫描的通道编号
|
1. 配置 name、unit、mode,选择扫描的通道编号
|
||||||
|
|
||||||
![img](picture/adc_config.png)
|
![img](figures/adc_config.png)
|
||||||
|
|
||||||
2. 配置扫描通道对应的引脚
|
2. 配置扫描通道对应的引脚
|
||||||
|
|
||||||
![img](picture/adc_config1.png)
|
![img](figures/adc_config1.png)
|
||||||
|
|
||||||
3. 在 menuconfig 中打开对应的通道
|
3. 在 menuconfig 中打开对应的通道
|
||||||
|
|
||||||
|
@ -185,28 +180,29 @@
|
||||||
|
|
||||||
1. 需要先关闭 P014 的默认 mode
|
1. 需要先关闭 P014 的默认 mode
|
||||||
|
|
||||||
![img](picture/dac_config0.png)
|
![img](figures/dac_config0.png)
|
||||||
|
|
||||||
2. 开启 DAC0 通道
|
2. 开启 DAC0 通道
|
||||||
|
|
||||||
![img](picture/dac_config1.png)
|
![img](figures/dac_config1.png)
|
||||||
|
|
||||||
3. 修改通道号为 0,与 DAC0 对应
|
3. 修改通道号为 0,与 DAC0 对应
|
||||||
|
|
||||||
![img](picture/dac_config2.png)
|
![img](figures/dac_config2.png)
|
||||||
|
|
||||||
4. 在 menuconfig 中打开对应的通道
|
4. 在 menuconfig 中打开对应的通道
|
||||||
|
|
||||||
### 通用 PWM 定时器(GPT)
|
### PWM(GPT)
|
||||||
|
|
||||||
GPT 定时器在该芯片中可作为通用定时器,也可以用于产生 PWM 信号。在将其用于产生 PWM 信号时,GPT 定时器提供了 gpt0 - gpt9 总共 10 个通道,每个通道可以设定两个输出端口。当前版本的 PWM 驱动将每个通道都看做一个单独的 PWM 设备,每个设备都只有一个通道。用户可以选择开启一个通道的任意一个输出端口,或将两个端口均开启,但在同时开启两个端口的情况下,它们输出的波形将完全一致。
|
GPT 定时器在该芯片中可作为通用定时器,也可以用于产生 PWM 信号。在将其用于产生 PWM 信号时,GPT 定时器提供了 gpt0 - gpt9 总共 10 个通道,每个通道可以设定两个输出端口。当前版本的 PWM 驱动将每个通道都看做一个单独的 PWM 设备,每个设备都只有一个通道。用户可以选择开启一个通道的任意一个输出端口,或将两个端口均开启,但在同时开启两个端口的情况下,它们输出的波形将完全一致。
|
||||||
|
|
||||||
1. 添加 GPT 设备
|
1. 添加 GPT 设备
|
||||||
|
|
||||||
![img](./picture/add_gpt1.png)
|
![img](./figures/add_gpt1.png)
|
||||||
|
|
||||||
2. 配置通道
|
2. 配置通道
|
||||||
|
|
||||||
![img](./picture/add_gpt2.png)
|
![img](./figures/add_gpt2.png)
|
||||||
|
|
||||||
对 GPT 较为关键的配置如图所示,具体解释如下:
|
对 GPT 较为关键的配置如图所示,具体解释如下:
|
||||||
|
|
||||||
|
@ -217,81 +213,112 @@ GPT 定时器在该芯片中可作为通用定时器,也可以用于产生 PWM
|
||||||
5. 此处设置 GPT 通道下两个输出端口各自对应的引脚。
|
5. 此处设置 GPT 通道下两个输出端口各自对应的引脚。
|
||||||
3. 配置输出引脚
|
3. 配置输出引脚
|
||||||
|
|
||||||
![img](./picture/add_gpt3.png)
|
![img](./figures/add_gpt3.png)
|
||||||
|
|
||||||
在完成上一步对 GPT 定时器的设置后,根据图示找到对应 GPT 通道输出引脚设置的界面(这里是 GPT3),将图中标号 **1** 处设置为 ``GTIOCA or GTIOCB`` ,并根据需要在图中标号 **2** 处设置 GPT 通道下两个输出端口各自对应的输出引脚。
|
在完成上一步对 GPT 定时器的设置后,根据图示找到对应 GPT 通道输出引脚设置的界面(这里是 GPT3),将图中标号 **1** 处设置为 ``GTIOCA or GTIOCB`` ,并根据需要在图中标号 **2** 处设置 GPT 通道下两个输出端口各自对应的输出引脚。
|
||||||
|
|
||||||
4. 在 menuconfig 中打开对应的通道,[RT-Thread 的 pwm 框架介绍](https://www.rt-thread.org/document/site/#/rt-thread-version/rt-thread-standard/programming-manual/device/pwm/pwm)
|
4. 在 menuconfig 中打开对应的通道,[RT-Thread 的 pwm 框架介绍](https://www.rt-thread.org/document/site/#/rt-thread-version/rt-thread-standard/programming-manual/device/pwm/pwm)
|
||||||
|
|
||||||
![image-20211103202216381](picture/pwm_env.png)
|
![image-20211103202216381](figures/pwm_env.png)
|
||||||
|
|
||||||
### CAN
|
### CAN
|
||||||
|
|
||||||
1. 添加CAN
|
1. 添加CAN
|
||||||
|
|
||||||
![image-20211102145023112](picture/can.png)
|
![image-20211102145023112](figures/can.png)
|
||||||
|
|
||||||
2. 配置Callback为 `can0_callback` 或 `can1_callback`
|
2. 配置Callback为 `can0_callback` 或 `can1_callback`
|
||||||
|
|
||||||
![image-20211102145227603](picture/can_callback.png)
|
![image-20211102145227603](figures/can_callback.png)
|
||||||
|
|
||||||
3. 配置其他选项,并生成代码。
|
3. 配置其他选项,并生成代码。
|
||||||
|
|
||||||
4. 使用ENV使能CAN。[CAN设备使用说明](https://www.rt-thread.org/document/site/#/rt-thread-version/rt-thread-standard/programming-manual/device/can/can)
|
4. 使用ENV使能CAN。[CAN设备使用说明](https://www.rt-thread.org/document/site/#/rt-thread-version/rt-thread-standard/programming-manual/device/can/can)
|
||||||
|
|
||||||
![image-20211102145613309](picture/can_menuconfig.png)
|
![image-20211102145613309](figures/can_menuconfig.png)
|
||||||
|
|
||||||
|
### SDHI
|
||||||
|
|
||||||
### 使用 WiFi 模块 [RW007 ](https://github.com/RT-Thread-packages/rw007)
|
1. 添加sdhi驱动
|
||||||
|
|
||||||
1. 软件包配置中找到 RW007,并修改为下图配置
|
![添加sdhi驱动](figures/sdhi_config.png)
|
||||||
|
|
||||||
![image-20211108142805319](picture/rw007_pkg.png)
|
1. 添加DMAC
|
||||||
|
|
||||||
|
![添加DMAC](figures/dmac_config.png)
|
||||||
|
|
||||||
|
2. 设置DMAC中断
|
||||||
|
|
||||||
|
![设置DMAC中断](figures/dmac_int.png)
|
||||||
|
|
||||||
|
3. 设置SDHI中断和引脚
|
||||||
|
|
||||||
|
![设置SDHI](figures/sdhi_config1.png)
|
||||||
|
|
||||||
|
4. 在ENV中打开SDHI
|
||||||
|
|
||||||
|
![打开SDHI](figures/sdhi_env.png)
|
||||||
|
|
||||||
|
5. 在ENV中配置DFS,添加文件系统,如FatFS
|
||||||
|
|
||||||
|
![配置DFS](figures/sdhi_dfs.png)
|
||||||
|
|
||||||
|
6. 在命令行中,使用 `mkfs sd0 -t elm` 格式化sd卡
|
||||||
|
|
||||||
|
7. 在命令行中,使用 `mount sd0 / elm` 将sd0挂载到 `/`
|
||||||
|
|
||||||
|
8. 参考RT-Thread DFS使用手册[虚拟文件系统 (rt-thread.org)](https://www.rt-thread.org/document/site/#/rt-thread-version/rt-thread-standard/programming-manual/filesystem/filesystem)
|
||||||
|
|
||||||
|
### WiFi 模块: [RW007 ](https://github.com/RT-Thread-packages/rw007)
|
||||||
|
|
||||||
|
1. 软件包配置中找到 RW007,并修改为下图配置。
|
||||||
|
|
||||||
|
![image-20211108142805319](figures/rw007_pkg.png)
|
||||||
|
|
||||||
2. menuconfig 中打开驱动的 RW007 配置,默认使用了 SPI1 端口。所以需要打开 SPI1 总线。
|
2. menuconfig 中打开驱动的 RW007 配置,默认使用了 SPI1 端口。所以需要打开 SPI1 总线。
|
||||||
|
|
||||||
![image-20211108142453678](picture/rw007_spi.png)
|
![image-20211108142453678](figures/rw007_spi.png)
|
||||||
|
|
||||||
![image-20211213212034701](picture/drv_rw007.png)
|
![image-20211213212034701](figures/drv_rw007.png)
|
||||||
|
|
||||||
3. 在设备驱动框架中打开 [WLAN 框架](https://www.rt-thread.org/document/site/#/rt-thread-version/rt-thread-standard/programming-manual/device/wlan/wlan),
|
3. 在设备驱动框架中打开 [WLAN 框架](https://www.rt-thread.org/document/site/#/rt-thread-version/rt-thread-standard/programming-manual/device/wlan/wlan),
|
||||||
|
|
||||||
![image-20211108143027485](picture/rw007_wlan.png)
|
![image-20211108143027485](figures/rw007_wlan.png)
|
||||||
|
|
||||||
在网络配置中打开 NETDEV 组件:
|
在网络配置中打开 NETDEV 组件:
|
||||||
|
|
||||||
![image-20211108143712513](picture/rw007_netdev.png)
|
![image-20211108143712513](figures/rw007_netdev.png)
|
||||||
|
|
||||||
在 kernel 中打开 mempool 配置:
|
在 kernel 中打开 mempool 配置:
|
||||||
|
|
||||||
![image-20211209161902884](picture/rw007_mempool.png)
|
![image-20211209161902884](figures/rw007_mempool.png)
|
||||||
|
|
||||||
4. FSP 中打开添加 SPI 外设端口,[如何添加SPI](#SPI)。下图以 SPI1 端口为例的配置如下:
|
4. FSP 中打开添加 SPI 外设端口,[如何添加SPI](#SPI)。下图以 SPI1 端口为例的配置如下:
|
||||||
|
|
||||||
![image-20211108183631379](picture/rw007_spicfg.png)
|
![image-20211108183631379](figures/fsp_spi1.png)
|
||||||
|
|
||||||
5. RW007 有一个从机控制的 INT 引脚,需要占用一个 IRQ 通道,下图以 P506 为例的配置如下:
|
5. RW007 有一个从机控制的 INT 引脚,需要占用一个 IRQ 通道,下图以 P506 为例的配置如下:
|
||||||
|
|
||||||
![image-20211108183724282](picture/rw007_int.png)
|
![image-20211108183724282](figures/rw007_int.png)
|
||||||
|
|
||||||
6. RW007 的 RESET 控制引脚修改默认配置,这里在 RASC 中 mode 设为关闭,交由 RW007 中进行控制。
|
6. RW007 的 RESET 控制引脚修改默认配置,这里在 RASC 中 mode 设为关闭,交由 RW007 中进行控制。
|
||||||
|
|
||||||
![image-20211213144108558](picture/rw007_reset.png)
|
![image-20211213144108558](figures/rw007_reset.png)
|
||||||
|
|
||||||
7. 配置完成,检查 MDK 工程中是否加入了必要的文件
|
7. 配置完成,检查 MDK 工程中是否加入了必要的文件
|
||||||
|
|
||||||
![image-20211109102232233](picture/rw007_mdk.png)
|
![image-20211109102232233](figures/rw007_mdk.png)
|
||||||
|
|
||||||
8. 编译下载,验证结果。
|
8. 编译下载,验证结果。
|
||||||
|
|
||||||
系统启动会自动获取 RW007 的信息,输入`wifi scan` 命令扫描环境中的 WiFi 信号。[更多 WiFi 命令](https://www.rt-thread.org/document/site/#/rt-thread-version/rt-thread-standard/programming-manual/device/wlan/wlan?id=finsh-%e5%91%bd%e4%bb%a4)
|
系统启动会自动获取 RW007 的信息,输入`wifi scan` 命令扫描环境中的 WiFi 信号。[更多 WiFi 命令](https://www.rt-thread.org/document/site/#/rt-thread-version/rt-thread-standard/programming-manual/device/wlan/wlan?id=finsh-%e5%91%bd%e4%bb%a4)
|
||||||
|
|
||||||
![image-20211109103856130](picture/rw007_test.png)
|
![image-20211109103856130](figures/rw007_test.png)
|
||||||
|
|
||||||
使用 `WiFi join` 命令连接 WiFi 热点 :
|
使用 `WiFi join` 命令连接 WiFi 热点 :
|
||||||
|
|
||||||
![image-20211109104735733](picture/rw007_wifijoin.png)
|
![image-20211109104735733](figures/rw007_wifijoin.png)
|
||||||
|
|
||||||
使用 `ping rt-thread.com` 测试网络连接:
|
使用 `ping rt-thread.com` 测试网络连接:
|
||||||
|
|
||||||
![image-20211109104700939](picture/rw007_ping.png)
|
![image-20211109104700939](figures/rw007_ping.png)
|
|
@ -0,0 +1,63 @@
|
||||||
|
# RA 系列外设驱动添加指南
|
||||||
|
|
||||||
|
## 1. 简介
|
||||||
|
|
||||||
|
本文档是为需要给现有的 RA 系列 BSP 添加更多外设驱动的开发者准备的。通过阅读本文,开发者可以按照自己的实际情况给现有 BSP 添加自己需要的驱动。
|
||||||
|
|
||||||
|
## 2. 前提要求
|
||||||
|
|
||||||
|
- 熟练使用 ENV 工具,参考:[RT-Thread env 工具用户手册](https://www.rt-thread.org/document/site/rtthread-development-guide/rtthread-tool-manual/env/env-user-manual/)
|
||||||
|
- 熟悉 [Kconfig](https://www.rt-thread.org/document/site/#/development-tools/kconfig/kconfig) 语法
|
||||||
|
- 熟悉 [FSP](https://www2.renesas.cn/jp/zh/software-tool/flexible-software-package-fsp) 工具
|
||||||
|
- 了解 RT-Thread [设备驱动框架](https://www.rt-thread.org/document/site/#/rt-thread-version/rt-thread-standard/programming-manual/device/device)
|
||||||
|
|
||||||
|
## 3. 如何添加更多的外设驱动选项
|
||||||
|
|
||||||
|
本章节以添加片上外设驱动为例,讲解如何为 BSP 添加更多可用驱动。如果想使用的片上外设是 `片上外设配置菜单` 里没有的,就需要开发者自己添加了。下面我们将演示如何为 ra6m4-cpk 添加 UART9 端口。
|
||||||
|
|
||||||
|
添加 UART 的外设支持需要以下步骤:
|
||||||
|
|
||||||
|
### 3.1 修改 Kconfig 文件
|
||||||
|
|
||||||
|
打开 BSP 中的 board\kconfig 文件,添加 UART9 配置。
|
||||||
|
|
||||||
|
![image-20220221161853343](figures/add_uart.png)
|
||||||
|
|
||||||
|
![image-20220221163152761](figures/add_uart1.png)
|
||||||
|
|
||||||
|
修改完成后,在 BSP 目录下打开 ENV 工具,命令行输入 `menuconfig` 命令查看 UART9 配置是否已添加。
|
||||||
|
|
||||||
|
![image-20220221164229974](figures/add_uart2.png)
|
||||||
|
|
||||||
|
### 3.2 修改 uart_config.h 文件
|
||||||
|
|
||||||
|
Kconfig 的配置添加完成,还需要在配置文件和驱动文件中添加相应的配置。
|
||||||
|
|
||||||
|
打开 `libraries\HAL_Drivers\config\ra6m4\uart_config.h` 文件添加 UART9 配置。
|
||||||
|
|
||||||
|
![image-20220221170945734](figures/add_uart3.png)
|
||||||
|
|
||||||
|
### 3.3 修改 drv_usart_v2.h 文件
|
||||||
|
|
||||||
|
打开 `libraries\HAL_Drivers\drv_usart_v2.c`,添加如下代码:
|
||||||
|
|
||||||
|
![image-20220221171806580](figures/add_uart4.png)
|
||||||
|
|
||||||
|
![image-20220221172034531](figures/add_uart5.png)
|
||||||
|
|
||||||
|
### 3.4 测试验证
|
||||||
|
|
||||||
|
1. 在 menuconfig 中打开 UART9 并保存配置,使用 `scons --target=mdk5` 命令重新生成 MDK 工程。
|
||||||
|
2. 从 project 工程中打开 FSP 配置工具,添加 UART9 端口
|
||||||
|
|
||||||
|
![image-20220221180942314](figures/add_uart6.png)
|
||||||
|
|
||||||
|
![image-20220221183752087](figures/add_uart8.png)
|
||||||
|
|
||||||
|
3. 配置 UART9 对应的 IO 引脚,保存并退出。
|
||||||
|
|
||||||
|
![image-20220221183405828](figures/add_uart7.png)
|
||||||
|
|
||||||
|
4. 编译、debug 下载,输入 list_device 命令可以看到 uart9 设备已经注册到内核,说明设备添加成功,接下来就可以使用 UART9 端口进行通信了。
|
||||||
|
|
||||||
|
![image-20220221185534932](figures/add_uart9.png)
|
|
@ -0,0 +1,62 @@
|
||||||
|
# RA系列驱动介绍
|
||||||
|
|
||||||
|
在 RT-Thread 实时操作系统中,各种各样的设备驱动是通过一套 I/O 设备管理框架来管理的。设备管理框架给上层应用提供了一套标准的设备操作 API,开发者通过调用这些标准设备操作 API,可以高效地完成和底层硬件外设的交互。设备管理框架的结构如下图所示:
|
||||||
|
|
||||||
|
![image-20220308143402996](figures/rtdevice.png)
|
||||||
|
|
||||||
|
使用 I/O 设备管理框架开发应用程序,有如下优点:
|
||||||
|
|
||||||
|
- 使用同一套标准的 API 开发应用程序,使应用程序具有更好的移植性
|
||||||
|
- 底层驱动的升级和修改不会影响到上层代码
|
||||||
|
- 驱动和应用程序相互独立,方便多个开发者协同开发
|
||||||
|
|
||||||
|
## 1. 驱动分类介绍
|
||||||
|
|
||||||
|
本小节介绍 BSP 提供的不同类别驱动的概念,对一个 BSP 而言,有如下三类驱动:
|
||||||
|
|
||||||
|
- **板载外设驱动**(Onboard Peripheral Drivers):指 MCU 之外,开发板上外设,例如 TF 卡、以太网等
|
||||||
|
- **片上外设驱动**(On-chip Peripheral Drivers):指 MCU 芯片上的外设,例如硬件定时器、ADC 和看门狗等
|
||||||
|
- **扩展模块驱动**(Board extended module Drivers):指可以通过扩展接口或者杜邦线连接的开发板的模块,例如 RW007 模块
|
||||||
|
|
||||||
|
这三种外设的示意图如下所示:
|
||||||
|
|
||||||
|
![Peripheral](figures/Peripheral.png)
|
||||||
|
|
||||||
|
## 2. 外设驱动的使用方法
|
||||||
|
|
||||||
|
当前 RT-Thread 提供的驱动库已经支持 RA 多个系列的 BSP。点击下表中的驱动名称,即可跳转到对应驱动框架的介绍文档。开发者可以通过阅读相关资料,了解如何在应用开发中通过设备驱动框架来使用这些外设驱动。
|
||||||
|
|
||||||
|
### 2.1 片上外设
|
||||||
|
|
||||||
|
| 驱动 | 简介 |
|
||||||
|
| ------------------------------------------------------------ | ------------------------------------------------ |
|
||||||
|
| [GPIO](https://www.rt-thread.org/document/site/programming-manual/device/pin/pin/) | 操作 GPIO 管脚 |
|
||||||
|
| [UART](https://www.rt-thread.org/document/site/programming-manual/device/uart/uart/) | 通过串口收发数据 |
|
||||||
|
| [I2C](https://www.rt-thread.org/document/site/programming-manual/device/i2c/i2c/) | 通过软件 I2C 收发数据 |
|
||||||
|
| [SPI](https://www.rt-thread.org/document/site/programming-manual/device/spi/spi/) | 通过 SPI 收发数据 |
|
||||||
|
| [ADC](https://www.rt-thread.org/document/site/programming-manual/device/adc/adc/) | 测量管脚上的模拟量 |
|
||||||
|
| SDIO | 通过 SDIO 读写数据 |
|
||||||
|
| [TIMER](https://www.rt-thread.org/document/site/programming-manual/device/hwtimer/hwtimer/) | 使用硬件定时器实现测量时间和定时执行回调函数功能 |
|
||||||
|
| [PWM](https://www.rt-thread.org/document/site/programming-manual/device/pwm/pwm/) | 在特定的管脚输出 PWM 波形 |
|
||||||
|
| [RTC](https://www.rt-thread.org/document/site/programming-manual/device/rtc/rtc/) | 设置和读取时间 |
|
||||||
|
| [WDT](https://www.rt-thread.org/document/site/programming-manual/device/watchdog/watchdog/) | 看门狗驱动 |
|
||||||
|
| [QSPI](https://www.rt-thread.org/document/site/programming-manual/device/spi/spi/#qspi_1) | 通过 SPI(1、2、4线) 收发数据 |
|
||||||
|
|
||||||
|
### 2.2 板载外设
|
||||||
|
|
||||||
|
| 驱动 | 简介 |
|
||||||
|
| ------- | --------------------------------------- |
|
||||||
|
| I2C | 板载 I2C 传感器 |
|
||||||
|
| SDIO | 适用于 SPI 接口或 SDIO 接口的 SD(TF) 卡 |
|
||||||
|
|
||||||
|
### 2.3 扩展模块
|
||||||
|
|
||||||
|
| 驱动 | 简介 |
|
||||||
|
| -------- | ---------------------- |
|
||||||
|
| [RW007](https://github.com/RT-Thread-packages/rw007) | SPI 接口 WIFI 模块 |
|
||||||
|
| [HS300x](https://github.com/Guozhanxin/hs300x) | I2C 接口的温湿度传感器 |
|
||||||
|
| [ZMOD4410](https://github.com/ShermanShao/zmod4410) | I2C 接口的室内空气质量传感器 |
|
||||||
|
|
||||||
|
### 2.4 驱动示例代码
|
||||||
|
|
||||||
|
在 RT-Thread 的 `examples\test` 目录下,有 RT-Thread 提供的基于不同外设驱动的示例代码。在 env 工具中开启 BSP 中要测试的驱动,并将 `examples\test` 中对应的驱动框架测试文件加入工程,即可快速测试 BSP 中提供的驱动。
|
Before Width: | Height: | Size: 33 KiB After Width: | Height: | Size: 33 KiB |
After Width: | Height: | Size: 11 KiB |
After Width: | Height: | Size: 99 KiB |
After Width: | Height: | Size: 23 KiB |
Before Width: | Height: | Size: 23 KiB After Width: | Height: | Size: 23 KiB |
Before Width: | Height: | Size: 36 KiB After Width: | Height: | Size: 36 KiB |
After Width: | Height: | Size: 8.1 KiB |
After Width: | Height: | Size: 29 KiB |
After Width: | Height: | Size: 28 KiB |
Before Width: | Height: | Size: 79 KiB After Width: | Height: | Size: 79 KiB |
Before Width: | Height: | Size: 36 KiB After Width: | Height: | Size: 36 KiB |
After Width: | Height: | Size: 73 KiB |
After Width: | Height: | Size: 93 KiB |
After Width: | Height: | Size: 28 KiB |
After Width: | Height: | Size: 61 KiB |
After Width: | Height: | Size: 56 KiB |
After Width: | Height: | Size: 44 KiB |
After Width: | Height: | Size: 47 KiB |
After Width: | Height: | Size: 28 KiB |
After Width: | Height: | Size: 34 KiB |
After Width: | Height: | Size: 4.6 KiB |
After Width: | Height: | Size: 65 KiB |
After Width: | Height: | Size: 18 KiB |
After Width: | Height: | Size: 23 KiB |
After Width: | Height: | Size: 14 KiB |
After Width: | Height: | Size: 80 KiB |
After Width: | Height: | Size: 16 KiB |
Before Width: | Height: | Size: 21 KiB After Width: | Height: | Size: 21 KiB |
Before Width: | Height: | Size: 22 KiB After Width: | Height: | Size: 22 KiB |
After Width: | Height: | Size: 35 KiB |
After Width: | Height: | Size: 30 KiB |
Before Width: | Height: | Size: 12 KiB After Width: | Height: | Size: 12 KiB |
Before Width: | Height: | Size: 16 KiB After Width: | Height: | Size: 16 KiB |
After Width: | Height: | Size: 911 KiB |
Before Width: | Height: | Size: 18 KiB After Width: | Height: | Size: 18 KiB |
Before Width: | Height: | Size: 24 KiB After Width: | Height: | Size: 24 KiB |
Before Width: | Height: | Size: 31 KiB After Width: | Height: | Size: 31 KiB |
Before Width: | Height: | Size: 20 KiB After Width: | Height: | Size: 20 KiB |
Before Width: | Height: | Size: 17 KiB After Width: | Height: | Size: 17 KiB |
Before Width: | Height: | Size: 31 KiB After Width: | Height: | Size: 31 KiB |
Before Width: | Height: | Size: 25 KiB After Width: | Height: | Size: 25 KiB |
After Width: | Height: | Size: 19 KiB |
After Width: | Height: | Size: 24 KiB |
After Width: | Height: | Size: 49 KiB |
After Width: | Height: | Size: 38 KiB |
After Width: | Height: | Size: 60 KiB |
After Width: | Height: | Size: 58 KiB |
After Width: | Height: | Size: 5.4 KiB |
Before Width: | Height: | Size: 18 KiB After Width: | Height: | Size: 18 KiB |
After Width: | Height: | Size: 62 KiB |
Before Width: | Height: | Size: 18 KiB After Width: | Height: | Size: 18 KiB |
Before Width: | Height: | Size: 10 KiB After Width: | Height: | Size: 10 KiB |
After Width: | Height: | Size: 17 KiB |
After Width: | Height: | Size: 24 KiB |
After Width: | Height: | Size: 50 KiB |
After Width: | Height: | Size: 5.7 KiB |
After Width: | Height: | Size: 28 KiB |
After Width: | Height: | Size: 98 KiB |
After Width: | Height: | Size: 13 KiB |
After Width: | Height: | Size: 38 KiB |
After Width: | Height: | Size: 46 KiB |
After Width: | Height: | Size: 31 KiB |
After Width: | Height: | Size: 52 KiB |
After Width: | Height: | Size: 37 KiB |
Before Width: | Height: | Size: 5.8 KiB After Width: | Height: | Size: 5.8 KiB |
Before Width: | Height: | Size: 34 KiB After Width: | Height: | Size: 34 KiB |
Before Width: | Height: | Size: 42 KiB After Width: | Height: | Size: 42 KiB |
Before Width: | Height: | Size: 25 KiB After Width: | Height: | Size: 25 KiB |
Before Width: | Height: | Size: 14 KiB After Width: | Height: | Size: 14 KiB |
Before Width: | Height: | Size: 36 KiB After Width: | Height: | Size: 36 KiB |
Before Width: | Height: | Size: 16 KiB After Width: | Height: | Size: 16 KiB |
After Width: | Height: | Size: 23 KiB |
After Width: | Height: | Size: 5.3 KiB |
After Width: | Height: | Size: 9.6 KiB |
After Width: | Height: | Size: 26 KiB |
After Width: | Height: | Size: 24 KiB |
After Width: | Height: | Size: 10 KiB |
After Width: | Height: | Size: 12 KiB |
After Width: | Height: | Size: 87 KiB |
After Width: | Height: | Size: 22 KiB |
After Width: | Height: | Size: 9.9 KiB |
After Width: | Height: | Size: 24 KiB |
After Width: | Height: | Size: 19 KiB |
After Width: | Height: | Size: 19 KiB |
After Width: | Height: | Size: 9.8 KiB |
After Width: | Height: | Size: 38 KiB |
After Width: | Height: | Size: 21 KiB |
Before Width: | Height: | Size: 10 KiB After Width: | Height: | Size: 10 KiB |
Before Width: | Height: | Size: 25 KiB After Width: | Height: | Size: 25 KiB |
Before Width: | Height: | Size: 32 KiB After Width: | Height: | Size: 32 KiB |
After Width: | Height: | Size: 19 KiB |
After Width: | Height: | Size: 27 KiB |
Before Width: | Height: | Size: 25 KiB After Width: | Height: | Size: 25 KiB |
Before Width: | Height: | Size: 16 KiB After Width: | Height: | Size: 16 KiB |