瑞萨RA4E2的IO Port代码风格
初学瑞萨RA4E2还是挺生硬的,主要是不了解瑞萨的命名规则与代码书写风格。本帖子就先分享一下瑞萨FSP中的IO配置部分。
瑞萨的FSP和其RA4E2的技术手册与其它国产或同行的命名大不相同,比如别人都把IO称为GPIO,即通用IO,而瑞萨称为IO Port。这使得我刚打开技术手册时第一时间没有找到~~
还有一个大不同,别人家对IO的Port口分类是按英文字母排序,比如GPIOA,GPIOB,而瑞萨的FSP和技术手册是按数字,百位数为Port口标识,十位和个位代表引脚IO的标号。举个例子,对于之前的PA5,瑞萨为P005引脚;PB6,瑞萨为P106;PC13,瑞萨则为P313。
再返回技术手册,可以看到瑞萨FSP在设计寄存器时同样使用了Port口数值的偏移量。

Portm = 0x4008_0000 + 0x20 * m (m = 0-5,8),这样下来,
对于P005的基地址的m = 0;
对于P106的基地址的m = 1;
对于P313的基地址的m = 3;
我们再查看FSP的源代码,其预定义也是类似实现:
IOPORT_PORT_00_PIN_05 = 0x0005, ///< IO port 0 pin 5
IOPORT_PORT_01_PIN_06 = 0x0106, ///< IO port 1 pin 6
IOPORT_PORT_03_PIN_13 = 0x030D, ///< IO port 3 pin 13
通过上述源代码可以清晰看到FSP将Port口的数值放置于bit[15:8]位。基于此设计,瑞萨FSP在配置引脚的过程中也是先将引脚定义右移8位,获取到Port的偏移量数值后再做对应引脚的配置。
/* Write configuration */
R_PFS->PORT[pin >> IOPORT_PRV_PORT_OFFSET].PIN[pin & BSP_IO_PRV_8BIT_MASK].PmnPFS = value;
明白了瑞萨FSP的代码风格,我们阅读技术手册时对IO Port的理解也就更方便了。对于IO Port的其它参数,如默认电平,驱动能力等均与其它Cortex-M内核的MCU的配置相同,此处不过多描述。接下来,我们再看看基于瑞萨FSP代码库如何初始化IO Port来驱动LED灯闪烁。
瑞萨FSP是先调用 R_IOPORT_Open(),初始化IO引脚,再调用 R_IOPORT_PinWrite()控制引脚的高低电平。使用起来还是挺简单的。
/* Configure pins. */
R_IOPORT_Open (&g_ioport_ctrl, g_ioport.p_cfg);
while(1)
{
R_BSP_SoftwareDelay(500, BSP_DELAY_UNITS_MILLISECONDS);
R_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_02_PIN_07, BSP_IO_LEVEL_LOW);
R_BSP_SoftwareDelay(500, BSP_DELAY_UNITS_MILLISECONDS);
R_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_02_PIN_07, BSP_IO_LEVEL_HIGH);
}