瑞萨RA6M5 GPIO资源分布
从规格书可以看到,RA6M5,除了专用口,偏置电平,地以及参考电平,剩余的几乎所有脚都可以用作GPIO的功能。而野火板卡中引出的GPIO也不少,光不需要飞线的座子上都一眼能看到66个gpio,因此所有gpio都验证,实际上若非做方案导入和框架验证,几乎没必要对所有GPIO都验证一遍。
处于便捷的考虑,直接取野火板卡的J29座子上的P907(55pin)、P906(58pin)和P908(57pin)作为测试脚,其中,P906作为终端输入,P907作为输入,P908作为输出,使用P907读取P908的值的方式验证驱动是否适配上。
驱动适配步骤
由于之前适配板卡的基础驱动,实际上已经适配了GPIO驱动(因为标准要求是只点一个灯,而且灯要闪烁工作),因此KConfig和Sconctruct那块的配置并不需要再去匹配一遍,gpio的匹配工作就是从RASC生成对应的gpio配置开始。
RASC配置-输入
RASC配置-输出
RASC配置-输入中断
生成配置文件
修改中断部分的代码
由于之前匹配板卡时未验证gpio中断,因此中断配置中有不少编译问题,修改点如下:
1. 由于匹配时习惯性的把09以后的编号按照十六进制编码,但实际上瑞萨生成时是按照十进制编写的,导致编译错误,因此更改成十进制命名。
2. 驱动代码中,开启gpio中断后,会报缺少;,原因是宏PIN2IRQX_TABLE未以;结尾,而函数调用中也未做此操作,考虑到其他板卡都没在PIN2IRQX_TABLE中添加;,因此直接改驱动代码。
修改应用代码
瑞萨框架有个不好的点是把pin编号(BSP_IO_PORT_09_PIN_06之类的)写死,而且还没有地方去查枚举名对应的编号,因此无法使用msh命令的方式去验证gpio效果,只能写代码验证。
#include <rtthread.h> #include "hal_data.h" #include <rtdevice.h> #define IRQ_PIN BSP_IO_PORT_09_PIN_06 /* input IRQ pins */ #define OUT_PIN BSP_IO_PORT_09_PIN_07 /* output pins */ #define IN_PIN BSP_IO_PORT_09_PIN_08 /* input IRQ pins */ void pin_irq_handle(void *args) { rt_kprintf("irq input ,pin level %d\n\r", rt_pin_read(IRQ_PIN)); } void hal_entry(void) { rt_uint8_t pin_level = PIN_LOW; rt_bool_t is_high = RT_FALSE; rt_kprintf("\nHello RT-Thread!\n"); rt_pin_attach_irq(IRQ_PIN, PIN_IRQ_MODE_RISING_FALLING, pin_irq_handle, RT_NULL); rt_pin_irq_enable(IRQ_PIN, RT_TRUE); while (1) { if(is_high) { rt_pin_write(OUT_PIN, PIN_LOW); } else { rt_pin_write(OUT_PIN, PIN_HIGH); } is_high = !is_high; rt_thread_mdelay(1000); if(pin_level != rt_pin_read(IN_PIN)) { rt_kprintf("input pin level %d\n\r", rt_pin_read(IN_PIN)); pin_level = rt_pin_read(IN_PIN); } } }
编译烧录验证
\ | / - RT - Thread Operating System / | \ 5.2.0 build Nov 2 2024 21:39:51 2006 - 2024 Copyright by RT-Thread team Hello RT-Thread! msh >irq input ,pin level 0 irq input ,pin level 1 irq input ,pin level 0 irq input ,pin level 1 irq input ,pin level 0 irq input ,pin level 1 irq input ,pin level 0 irq input ,pin level 1 input pin level 1 input pin level 0 input pin level 1 input pin level 0 input pin level 1 input pin level 0
验证过程说明:
首先,我将所有管脚悬空,之后复位板卡,待出现msh>后等待一会,确认无抖动时,使用杜邦线将P906短接到P907上,此时间隔1s打印中断回调函数中的打印信息,表示中断输出翻转有效,且边沿触发中断使能成功。
之后将杜邦线跳接至P907和P908上,此时间隔1s打印主循环中的打印信息,表明输入模式配置成功。
结合以上现象,另外,输入上拉,不能确保生效,只能说可能生效,因为管脚悬空时读到的电平未发生跳变。
总结
至此,瑞萨的GPIO驱动已适配完成。遗留的点如下:
1. 其他GPIO也可以参照此方法适配,唯一的区别便是所选的管脚和中断编号的区别。
2. 由于未验证代码修改输入输出,甚至中断模式,因此不太确定通过RASC配置的初始状态是否可以通过代码修改,若代码无法修改,那感觉驱动可能还得迭代。
3. 虽然驱动并未设置配置上下拉入口,但RASC配置中可以默认配置上下拉,后续也可以尝试修改驱动文件,配置成上下拉动态配置