新建工程
根据前一篇文章的流程,新建一个e2 studio标准工程。过程就不详细说了,结果如图。
新建工程之后,我在WSL2的Ubuntu环境里创建了一个git仓,用来保存修改的代码。也可以通过git了解到fsp和触摸工具是修改或者生成哪些源码才实现了对应的功能。
实现LED流水灯工程
实现流水灯工程,大致的流程如下。
- 通过原理图查看LED引脚
- 配置LED引脚
- 编写流水灯代码逻辑
- 编译并烧录测试
我们从原理图开始,从原理图上可以很方便的看出,板载的3个LED灯对应的引脚分别是P415、P404、P405。引脚输出高电平则点亮LED,输出低电平或者不输出则LED熄灭。
然后我们打开fsp配置工具,可以通过右上角的按钮打开,也可以通过双击项目资源管理器里的configuration.xml文件来打开。打开配置页面后再下方的功能页里选择Pins引脚配置页面,并按图片里的示范调整好引脚的配置。从上面的原理图分析,也可以知道,io不需要配置上下拉。然后LED点亮也不需要io的速度特别快。所以这里不需要改上拉配置和io速度。
然后从乔帮主的hal_entry.c文件里拷贝流水灯代码
/*******************************************************************************************************************//**
* main() is generated by the RA Configuration editor and is used to generate threads if an RTOS is used. This function
* is called by main() when no RTOS is used.
**********************************************************************************************************************/
void hal_entry(void)
{
unsigned int c = 0;
bsp_io_port_pin_t pins[] = {
BSP_IO_PORT_04_PIN_15,
BSP_IO_PORT_04_PIN_04,
BSP_IO_PORT_04_PIN_05
};
/* TODO: add your own code here */
R_BSP_PinAccessEnable();
while(1) {
for(unsigned int i=0;i<sizeof(pins)/sizeof(bsp_io_port_pin_t);i++) {
if(i==c) {
R_BSP_PinWrite(pins[i], BSP_IO_LEVEL_HIGH);
} else {
R_BSP_PinWrite(pins[i], BSP_IO_LEVEL_LOW);
}
}
R_BSP_SoftwareDelay(100, BSP_DELAY_UNITS_MILLISECONDS);
c++;
if(c>=sizeof(pins)/sizeof(bsp_io_port_pin_t)) {
c = 0;
}
}
#if BSP_TZ_SECURE_BUILD
/* Enter non-secure code */
R_BSP_NonSecureEnter();
#endif
}
这里把乔帮主的流水灯代码稍微优化了一下,把 c>=3 修改成了 c>=sizeof(pins)/sizeof(bsp_io_port_pin_t) 。
因为接下来我要增加3个gpio来控制一个RGB灯,把流水灯的数量增加到6个。
修改好代码后,就可以编译和烧录了,流水灯也欢快的跑了起来
使用VSCode的git功能分析代码
通过VSCode可以看出,实际上fsp配置软件只修改了ra_gen/pin_data.c文件的pin引脚配置部分内容,见下图
乔帮主的流水灯代码也只修改了hal_entry函数里的内容,把流水灯功能实现在函数里。其他的和自动生成的代码一致
从原理上来说,我们也可以自己增加3个GPIO的配置,来实现新增的RGB流水灯功能。
手动修改代码,实现添加个RGB流水灯功能
操作流程如下:
- 在ra_gen/pin_data.c文件的
g_bsp_pin_cfg_data
数组添加3个io配置,分别是P708、P408、P409这三个IO
- 在src/hal_entry.c文件的pins数组里添加这3个io
- 编译并烧录测试
ra_gen/pin_data.c文件的修改内容
const ioport_pin_cfg_t g_bsp_pin_cfg_data[] =
{
{ .pin = BSP_IO_PORT_01_PIN_08, .pin_cfg = ((uint32_t) IOPORT_CFG_PERIPHERAL_PIN
| (uint32_t) IOPORT_PERIPHERAL_DEBUG) },
{ .pin = BSP_IO_PORT_01_PIN_09, .pin_cfg = ((uint32_t) IOPORT_CFG_PERIPHERAL_PIN
| (uint32_t) IOPORT_PERIPHERAL_DEBUG) },
{ .pin = BSP_IO_PORT_01_PIN_10, .pin_cfg = ((uint32_t) IOPORT_CFG_PERIPHERAL_PIN
| (uint32_t) IOPORT_PERIPHERAL_DEBUG) },
{ .pin = BSP_IO_PORT_03_PIN_00, .pin_cfg = ((uint32_t) IOPORT_CFG_PERIPHERAL_PIN
| (uint32_t) IOPORT_PERIPHERAL_DEBUG) },
{ .pin = BSP_IO_PORT_04_PIN_04, .pin_cfg = ((uint32_t) IOPORT_CFG_PORT_DIRECTION_OUTPUT
| (uint32_t) IOPORT_CFG_PORT_OUTPUT_LOW) },
{ .pin = BSP_IO_PORT_04_PIN_05, .pin_cfg = ((uint32_t) IOPORT_CFG_PORT_DIRECTION_OUTPUT
| (uint32_t) IOPORT_CFG_PORT_OUTPUT_LOW) },
{ .pin = BSP_IO_PORT_07_PIN_08, .pin_cfg = ((uint32_t) IOPORT_CFG_PORT_DIRECTION_OUTPUT
| (uint32_t) IOPORT_CFG_PORT_OUTPUT_LOW) },
{ .pin = BSP_IO_PORT_04_PIN_08, .pin_cfg = ((uint32_t) IOPORT_CFG_PORT_DIRECTION_OUTPUT
| (uint32_t) IOPORT_CFG_PORT_OUTPUT_LOW) },
{ .pin = BSP_IO_PORT_04_PIN_09, .pin_cfg = ((uint32_t) IOPORT_CFG_PORT_DIRECTION_OUTPUT
| (uint32_t) IOPORT_CFG_PORT_OUTPUT_LOW) },
{ .pin = BSP_IO_PORT_04_PIN_15, .pin_cfg = ((uint32_t) IOPORT_CFG_PORT_DIRECTION_OUTPUT
| (uint32_t) IOPORT_CFG_PORT_OUTPUT_LOW) }, };
src/hal_entry.c文件的修改内容
bsp_io_port_pin_t pins[] = {
BSP_IO_PORT_04_PIN_15,
BSP_IO_PORT_04_PIN_04,
BSP_IO_PORT_04_PIN_05,
BSP_IO_PORT_07_PIN_08,
BSP_IO_PORT_04_PIN_08,
BSP_IO_PORT_04_PIN_09
};
编译完烧录到板子上,可以看到6个led流水灯跑得很欢快。
RA工程目录学习
源码里的ra目录,个人赶紧有点类似芯片系列的通用sdk部分内容。
而ra_gen部分看起来是fsp配置工具生成的io配置和外设配置内容。
其他的暂时也还没时间去研究。
触摸项目测试
跟着参考资料里的触摸按键配置流程,我们顺利配置了触摸功能,然后简单修改一下流水灯和触摸程序,就可以实现触摸和流水灯的联动。由于没有引入RTOS功能,这两者的联动并不完美。
src/hal_entry.c文件的修改内容,在hal_entry里启动配置好的触摸程序。
void hal_entry(void)
{
qe_touch_main();
#if BSP_TZ_SECURE_BUILD
R_BSP_NonSecureEnter();
#endif
}
qe_touch_sample.c文件的修改内容,把原来hal_entry的流水灯功能转到触摸循环里。
while (true) {
err = RM_TOUCH_ScanStart(g_qe_touch_instance_config01.p_ctrl);
if (FSP_SUCCESS != err) {
while (true) {
}
}
while (0 == g_qe_touch_flag) {
}
g_qe_touch_flag = 0;
err = RM_TOUCH_DataGet(g_qe_touch_instance_config01.p_ctrl, &button_status,
NULL, NULL);
if (FSP_SUCCESS == err) {
if (button_status == 2) {
if (c >= max - 1) {
c = 0;
} else {
c++;
}
} else if (button_status == 3) {
if (c == 0) {
c = max - 1;
} else {
c--;
}
}
}
for (unsigned int i = 0; i < sizeof(pins) / sizeof(bsp_io_port_pin_t);
i++) {
if (i == c) {
R_BSP_PinWrite(pins[i], BSP_IO_LEVEL_HIGH);
} else {
R_BSP_PinWrite(pins[i], BSP_IO_LEVEL_LOW);
}
}
R_BSP_SoftwareDelay(TOUCH_SCAN_INTERVAL_EXAMPLE,
BSP_DELAY_UNITS_MILLISECONDS);
}
编译完烧录到板子上的效果展示见篇头视频。
参考资料
- 【瑞萨RA4系列开发板体验】RA通用VSCode开发环境搭建并顺带流水灯
- 【瑞萨RA4系列开发板体验】触摸按键