瑞萨单片机william hill官网
直播中

jf_50393217

4年用户 182经验值
擅长:可编程逻辑 嵌入式技术
私信 关注
[经验]

【瑞萨RA4系列开发板体验】3. 通过流水灯和触摸项目,学习RA工程源码结构

IMG_5299

新建工程

根据前一篇文章的流程,新建一个e2 studio标准工程。过程就不详细说了,结果如图。
new.png

新建工程之后,我在WSL2的Ubuntu环境里创建了一个git仓,用来保存修改的代码。也可以通过git了解到fsp和触摸工具是修改或者生成哪些源码才实现了对应的功能。

git.png


实现LED流水灯工程

实现流水灯工程,大致的流程如下。

  1. 通过原理图查看LED引脚
  2. 配置LED引脚
  3. 编写流水灯代码逻辑
  4. 编译并烧录测试

我们从原理图开始,从原理图上可以很方便的看出,板载的3个LED灯对应的引脚分别是P415、P404、P405。引脚输出高电平则点亮LED,输出低电平或者不输出则LED熄灭。

LED.png

然后我们打开fsp配置工具,可以通过右上角的按钮打开,也可以通过双击项目资源管理器里的configuration.xml文件来打开。打开配置页面后再下方的功能页里选择Pins引脚配置页面,并按图片里的示范调整好引脚的配置。从上面的原理图分析,也可以知道,io不需要配置上下拉。然后LED点亮也不需要io的速度特别快。所以这里不需要改上拉配置和io速度。

pinconfig.png

然后从乔帮主的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个。

修改好代码后,就可以编译和烧录了,流水灯也欢快的跑了起来

image.png

使用VSCode的git功能分析代码

通过VSCode可以看出,实际上fsp配置软件只修改了ra_gen/pin_data.c文件的pin引脚配置部分内容,见下图

pin_cfg.png

乔帮主的流水灯代码也只修改了hal_entry函数里的内容,把流水灯功能实现在函数里。其他的和自动生成的代码一致

blink_led.png

从原理上来说,我们也可以自己增加3个GPIO的配置,来实现新增的RGB流水灯功能。

手动修改代码,实现添加个RGB流水灯功能

操作流程如下:

  1. ra_gen/pin_data.c文件的g_bsp_pin_cfg_data数组添加3个io配置,分别是P708、P408、P409这三个IO
  2. src/hal_entry.c文件的pins数组里添加这3个io
  3. 编译并烧录测试

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.png

而ra_gen部分看起来是fsp配置工具生成的io配置和外设配置内容。

path.png

其他的暂时也还没时间去研究。

触摸项目测试

跟着参考资料里的触摸按键配置流程,我们顺利配置了触摸功能,然后简单修改一下流水灯和触摸程序,就可以实现触摸和流水灯的联动。由于没有引入RTOS功能,这两者的联动并不完美。

src/hal_entry.c文件的修改内容,在hal_entry里启动配置好的触摸程序。

void hal_entry(void)
{
    qe_touch_main();

#if BSP_TZ_SECURE_BUILD
    /* Enter non-secure code */
    R_BSP_NonSecureEnter();
#endif
}

qe_touch_sample.c文件的修改内容,把原来hal_entry的流水灯功能转到触摸循环里。

/* Main loop */
  while (true) {
    /* for [CONFIG01] configuration */
    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) {
      /* TODO: Add your own code here. */
      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);
      }
    }

    /* FIXME: Since this is a temporary process, so re-create a waiting process
     * yourself. */
    R_BSP_SoftwareDelay(TOUCH_SCAN_INTERVAL_EXAMPLE,
                        BSP_DELAY_UNITS_MILLISECONDS);
  }

编译完烧录到板子上的效果展示见篇头视频。


参考资料

  1. 【瑞萨RA4系列开发板体验】RA通用VSCode开发环境搭建并顺带流水灯
  2. 【瑞萨RA4系列开发板体验】触摸按键

更多回帖

发帖
×
20
完善资料,
赚取积分