目录
前言
环境配置
Hello RT-Thread
GPIO输入与中断
I2C主机驱动
SPI主机驱动
ADC设备驱动
PWM设备驱动
Flash设备驱动
WDT设备驱动
1 前言
本文说明如何在 RT-Thread 下配置与使用 EK-RA2E2 的板载外设的BSP驱动
BSP已被提交PR:https://github.com/RT-Thread/rt-thread/pull/10695
2 环境配置
整个移植过程会用到的几个工具版本如下,建议使用相同版本,较低版本会出现兼容性问题。
Env 工具版本 :V2.0.0
Arm GNU Toolchain: 13.2
JLink 版本 :V7.7.0
FSP 版本 :V6.0.0
Renesas 的芯片驱动源码是通过软件工具配置生成的,整个板子的移植过程都会使用到RASC这个软件工具。
下载链接: https://github.com/renesas/fsp/releases

注意:
如果要在 MDK 上使用FSP,请参照 rt-thread 的 RA系列BSP制作过程.md的如何在 MDK 中打开 FSP,绑定第三方工具RASC。
此次移植过程,笔者主要是以 linux 下的 GNU 环境进行移植,环境配置过程不再赘述。
3 Hello RT-Thread
EK-RA2E2 的基础例程默认支持MSH,编译基础例程并烧录成功后,可通过串口工具进行交互,同时能观察到LED3红灯以 1Hz 的频率闪烁。

SCI_UART 使用到的引脚分别是:
TX 为 P101
RX 为 P100

LED3 使用的引脚为:
P015

本次移植也支持了一键 nano ,因为该板子的MCU内存空间有限,如果想节省空间,可以考虑选择 nano。
nano 默认启用了MSH,与标准版的基础例程一致。

4 GPIO输入与中断
外部中断作为一种外设资源,需要开发者通过 ICU (interrupt control unit) 进行管理 。
下面以 EK-RA2E2 的按键SW2为例子,介绍如何配置一个外部中断。
打开RASC,RASC会通过文件configuration.xml 加载板子的配置。
进入Pins页面,找到Interrupt:IC

使能ICU,SW2 连接的引脚为 P205,所以这里 选择 IRQ1。

进入Stacks页面,通过New Stack中的INPUT 找到External IRQ (r_icu)。笔者配置了上升沿,并开启了数字滤波,中断回调函数需要写入irq_callback以支持drv_gpio.c的中断回调功能。

开发者通过使用rt_pin_attach_irq和rt_pin_irq_enable 实现中断注册和中断使能。


注意:
通过原理图和板子可以得知,标签E32表示按键和 P205 是开路状态。开发者使用按键时,需要通过电阻或锡将两个焊盘连接。
5 I2C主机驱动
EK-RA2E2 有一个 I3C 外设,兼容 I2C
笔者采样OLED模块SSD1360作为从设备,下面介绍如何使用 I2C 驱动。
打开RASC,点击进入到Pins页面,找到 Conectivity:I3C
SCL : P400
SDA: P401

进入Stacks页面,通过New Stack中的Conectivity找到I2C Master(r_iic_b_master)。中断回调函数修改为i2c_master_callback以支持drv_i2c.c的异步事件功能,数据传输后驱动层会通过rt_event_recv来确认传输是否成功完成。
scons --menuconfig启用 Hardware Drivers Config —> On-Chip Peripheral Drivers —> Enable hardware I2C Bus —> Enable hardware I2C0 Bus
编写应用程序进行读写功能验证


注意:
EK-RA2E2 的 I3C 引脚,SCL 和 SDA 没有挂上拉电阻。如果开发者在两脚悬空状态下使用 I2C,传输函数会返回错误。所以要么和笔者一样,选取的从设备模块自带上拉;要么先给板子提供上拉,再将从设备挂到总线上。
6 SPI主机驱动
EK-RA2E2有一个 SPI 外设,下面介绍如何使用 SPI 驱动。
注意:
由于SCI_UART使用了引脚 P101 和 P100 ,两个外设引脚冲突,所以开发者在使用 SPI 时需要将 SCI_UART 的引脚迁移到别的可用引脚上去。
打开RASC,进入Pins页面,找到 Conectivity:SPI。

进入Stacks页面,通过New Stack中的Conectivity找到SPI (r_spi)。中断回调函数修改为spi0_callback以支持drv_spi.c的异步事件功能。RASC 会提示要求开发者配置中断优先级,配置完中断优先级后请将DTC删掉,保持与图中一致。

scons --menuconfig启用 Hardware Drivers Config —> On-Chip Peripheral Drivers —> Enable hardware SPI Bus —> Enable hardware SPI0 Bus
编写应用程序进行读写功能验证


注意:
笔者这里展示的 MISO 均为 0xFF,这是因为MISO引脚处于悬空状态。笔者已经验证过引脚功能是有效的,开发者在验证的时候将其与MOSI短接,利用日志打印即可。
7 ADC设备驱动
ADC 特性:
12-bit A/D Converter,至多8个模拟输入采样通道
采样通道并不连续,支持 5、6、9、10、19、20、21、22
笔者使用了烟雾传感器,以 Channel9 为例,下面介绍如何进行 ADC 采样 。
打开RASC,进入Pins页面,找到Analog:ADC 。启用 Channel5 、Channel6 、Channel9。

进入Stacks页面,通过New Stack中的Analog 找到ADC (r_adc)。配置为 continuous scan 模式,并勾选上需要采样的通道。

scons --menuconfig启用 Hardware Drivers Config —> On-Chip Peripheral Drivers —> Enable ADC —> Enable ADC0
由于参考电压是 3.3V,所以是乘以 3300。此外,若配置的采样通道为21,则rt_adc_read的第二个参数应为21。
8 PWM设备驱动

GPT (General PWM Timer)特性:
一个 16-bit 6通道 的定时器
编号从 GPT4 到 GPT9,每个 GPT 可以控制两个引脚输出
在drv_pwm.c中,GPT 的每个通道都是一个设备实例。例如,使用 GPT4 和 GPT5,就需要创建两个 PWM 设备。
以 GPT4 为例,下面介绍如何通过 GPT 产生 PWM 。
打开RASC,进入Pins页面,找到Timers:GPT。配置两个引脚一起工作。

进入Stacks页面,通过New Stack中的 Timer 找到Timer, General PWM(r_gpt)。修改 timer4 和 channel4,然后启用Pin Output Support,最后使能两个引脚输出。



scons --menuconfig启用 Hardware Drivers Config —> On-Chip Peripheral Drivers —> Enable PWM —> Enable GPT4
编写应用程序验证 PWM 功能


9 Flash设备驱动
EK-RA2E2 能提供至多 64KB 的 Code Flash 内存 和 2KB Data Flash 内存,但实际在使用 Code Flash 的时候达不到这个理论值。
从文档《RA2E2-Group-Hardware》的Option-Setting Memory一节可知
0x00000400 到0x0000043B 被分配给了OFS1,OFS2 和 Security MPU
Code Flash从0x00000440 开始,到 0x00010000 结束
Data Flash从0x40100000 开始,到 0x40100800 结束

本次移植笔者支持了 Code Flash 的读写操作,下面笔者将通过 fal 抽象层演示 EK-RA2E2 的 flash 设备驱动。
打开RASC,进入Stacks页面,通过New Stack 中的Storage 找到flash (r_flash_lp) ,使能Code Flash
中断函数名需要填写flash_callback,这个函数没有实际意义。因为在驱动层操作 flash 的过程中,都会暂时的禁止中断。

scons --menuconfig启用 Hardware Drivers Config —> On-Chip Peripheral Drivers —> Enable Onchip FLASH
drv_flash.c中实现的函数允许开发者直接调用,也可以通过 fal 抽象层进行分区管理。

从 app 起始地址读取 16 字节,并与编译出的hex文件进行比较

从 app 起始地址偏移 0xF000 字节,进行 16 字节读写验证

10 WDT设备驱动
启用驱动的步骤与前面如出一辙,不再赘述。
因为驱动的配置都是围绕着时钟频率和计数次数,而不能直观知道多久不喂狗会造成复位,所以这里笔者重点解释如何计算 WDT 的超时时间。
WDT特性:
14-bit 的向下计数计时器
由 PCLKB 提供时钟
计数溢出时会产生 NMI (不可屏蔽中断),并造成系统复位
计算 WDT 超时时间:
PCLKB 可以在RASC的 clock页面 查到,默认为 24 MHz
时钟分频默认 8192,即工作频率为 PCLKB/8192
timeout 为 16384 cycles,即计数 16384 次后会造成复位
WDT 的工作频率为f =24 MHz/8192 ≈ 2929.6875 KHz
计数一次要花的时间为t = 1 / f = 1 / 2929.6875 ≈ 341.333 us
超时时间为T = 341.333 us * 16384 cycles ≈ 5.5 s
全部0条评论
快来发表一下你的评论吧 !