EPTmachine 发表于 2024-11-23 15:44

【Follow me第二季第3期】1入门任务:搭建环境,下载调试示例程序,Blink,按键

本帖最后由 EPTmachine 于 2024-11-24 21:33 编辑

# 入门任务:搭建环境,下载调试示例程序,Blink,按键
本次Follow Me活动的开发板是瑞萨的EK-RA6M5,在官网可以下载到如下的相关的资料。


官方的《EK-RA6M5 Quick Start Guide.pdf》可以帮助开发者快速了解套件的内容和使用方法。

套件包含了以下的内容


## 搭建调试环境
e2studio是瑞萨提供的集成开发环境,包含编译器、代码编辑器、工程管理工具、芯片支持包等。

首先在e2studio的[下载页面](https://www.renesas.cn/zh/software-tool/e-studio)选择和电脑系统匹配的安装包。



下载后解压得到安装包,点击应用程序开始安装。



在安装选项中选择RA系列支持和fsp版本即可。安装过程各个界面的选项如下。



选择安装RA系列支持














点击install开始安装。




安装完成后,就可以编辑和调试代码。

## 示例程序
针对EK-RA6M5,官方提供了丰富的示例代码和帮助文档。EK-RA6M5的产品页面提供了相应的资料和代码下载。



将下载的代码压缩包解压后,其中的示例代码如下所示:


通过菜单栏中的File->Import将工程导入到工作目录中


选择导入存在的工程到工作空间中。


选择工程所在的目录,在"Option"中勾选“Copy projects into workspace”将工程复制到工作空间中。


导入后项目栏中可以看到相应的工程。

在工程的右键选项中选择“Build Project”,完成后即可下载程序。


使用USB线连接电脑和开发板,点击调试按钮即可下载程序进行调试。



## Blink程序
查看“EK-RA6M5 User's Manual.pdf”,板载三个LED灯的相关信息如下图。



在e2studio中创建EK-RA6M5的工程控制LED闪烁。

在菜单栏中选择"File->New->C/C++ Project"


输入工程名


选择对应的开发套件或者根据芯片型号进行工程创建


剩下的选择默认项即可




在开发瑞萨的RA系列芯片时,需要使用FSP配置工具对外设进行参数设置,在工程栏中点击“configuration.xml”即可打开FSP配置界面。



在“FSP Configuration”界面中对硬件外设和软件组件包进行管理。


查看下载资料"ek-ra6m5-v1-designpackage.zip"中的原理图可知,板上的LED的接线如图所示,控制引脚为P006、P007、P008。


在FSP界面的Pins选项卡页面可以查看相关引脚的设置。


在FSP界面的Stacks选项卡页面可以查看应用中涉及到的功能栈。Blink程序只涉及到引脚状态控制,使用r_ioport模块即可实现功能。



点击右上角的"Generate Project Content"生成相关设置的配置代码。

生成的代码中,与配置相关的部分在文件夹ra_cfg中



接下来编写相关的应用的代码。由于FSP配置生成的代码中包含main函数,每次点击"Generate Project Content"生成代码时都会对main进行改写,所以用户无法直接编写main函数的代码,用户代码的
入口就变为,在不使用RTOS实时操作系统的前提下,在src文件夹下的hal_entry.c中的hal_entry函数为用户代码入口。

hal_entry.c添加实现Blink功能的代码如下:

``` c
#include "hal_data.h"

FSP_CPP_HEADER
void R_BSP_WarmStart(bsp_warm_start_event_t event);
FSP_CPP_FOOTER

extern bsp_leds_t g_bsp_leds;

/*******************************************************************************************************************//**
* 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)
{
    /* TODO: add your own code here */


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

    /* Define the units to be used with the software delay function */
    const bsp_delay_units_t bsp_delay_units = BSP_DELAY_UNITS_MILLISECONDS;

    /* Set the blink frequency (must be <= bsp_delay_units */
    const uint32_t freq_in_hz = 2;

    /* Calculate the delay in terms of bsp_delay_units */
    const uint32_t delay = bsp_delay_units / freq_in_hz;

    /* LED type structure */
    bsp_leds_t leds = g_bsp_leds;

    /* Holds level to set for pins */
    bsp_io_level_t pin_level = BSP_IO_LEVEL_LOW;


    while (1)
    {
      /* Enable access to the PFS registers. If using r_ioport module then register protection is automatically
         * handled. This code uses BSP IO functions to show how it is used.
         */
      R_BSP_PinAccessEnable();

      /* Update all board LEDs */
      for (uint32_t i = 0; i < leds.led_count; i++)
      {
            /* Get pin to toggle */
            uint32_t pin = leds.p_leds;

            /* Write to this pin */
            R_BSP_PinWrite((bsp_io_port_pin_t) pin, pin_level);
      }

      /* Protect PFS registers */
      R_BSP_PinAccessDisable();

      /* Toggle level for next write */
      if (BSP_IO_LEVEL_LOW == pin_level)
      {
            pin_level = BSP_IO_LEVEL_HIGH;
                  }
      else
      {
            pin_level = BSP_IO_LEVEL_LOW;
                   }

      /* Delay */
      R_BSP_SoftwareDelay(delay, bsp_delay_units);
    }

}

```



## 按键程序
按键程序是GPIO引脚状态监视的应用,查看原理图可知,按键连接在P005(S1)和P004(S2)引脚上


以P005引脚为例,配置其为相应外部中断,在FSP配置界面上进行如下设置。



同时在Stack界面添加外部中断的组件,并命名中断处理的回调函数名,用于生成相应的底层代码。

参考示例代码中icu模块的例程,实现按键控制LED亮灭和闪烁频率的功能。

函数button_init、button_enable、button_deint用于管理按键中断模块的初始化、使能和关闭。由于FSP生成了相应的底层驱动,减少了用户的代码量。在中断回调函数中修改全局标记变量。相关代码如下:

button.h
```c
#ifndef BUTTON_H_
#define BUTTON_H_

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include "hal_data.h"

#define   USER_SW1_IRQ_NUMBER   0x0A
#define   USER_SW2_IRQ_NUMBER   0x09


/* Function declaration */
fsp_err_t button_init(void);
fsp_err_t button_enable(void);
void button_deinit(void);

typedef enum blink_speed{
    slow_speed=1,
    normal_speed=2,
    high_speed=3
} blink_speed_t;


#endif

```
button.c
```c


#include "button.h"

/*******************************************************************************************************************//**
* @addtogroup botton
* @{
**********************************************************************************************************************/

/* Boolean flag to determine switch is pressed or not.*/
volatile bool g_sw1_press = false;
volatile bool g_sw2_press = false;

/*******************************************************************************************************************//**
* @brief       This functions initializes botton.
* @param   None
* @retval      FSP_SUCCESS                  Upon successful open of ICU module
* @retval      Any Other Error code apart from FSP_SUCCESSUnsuccessful open
**********************************************************************************************************************/
fsp_err_t button_init(void)
{
    fsp_err_t err = FSP_SUCCESS;

    /* Open ICU module */
    err = R_ICU_ExternalIrqOpen(&g_external_irq9_ctrl, &g_external_irq9_cfg);
    err = R_ICU_ExternalIrqOpen(&g_external_irq10_ctrl, &g_external_irq10_cfg);

    return err;
}

/*******************************************************************************************************************//**
* @brief       This function enables external interrupt for specified channel.
* @param   None
* @retval      FSP_SUCCESS                  Upon successful enable of ICU module
* @retval      Any Other Error code apart from FSP_SUCCESSUnsuccessful open
**********************************************************************************************************************/
fsp_err_t button_enable(void)
{
    fsp_err_t err = FSP_SUCCESS;

    /* Enable ICU module */
    err = R_ICU_ExternalIrqEnable(&g_external_irq9_ctrl);
    err = R_ICU_ExternalIrqEnable(&g_external_irq10_ctrl);

    return err;
}


/*******************************************************************************************************************//**
* @brief       This function closes opened ICU module before the project ends up in an Error Trap.
* @param   None
* @retval      None
**********************************************************************************************************************/
void button_deinit(void)
{
    fsp_err_t err = FSP_SUCCESS;

    /* Close ICU module */
    err = R_ICU_ExternalIrqClose(&g_external_irq9_ctrl);
    err = R_ICU_ExternalIrqClose(&g_external_irq10_ctrl);
}

/*******************************************************************************************************************//**
* @brief      User defined external irq callback.
* @paramp_args
* @retval   None
**********************************************************************************************************************/
void button1_callback(external_irq_callback_args_t *p_args)
{
    /* Make sure it's the right interrupt*/
    if(USER_SW1_IRQ_NUMBER == p_args->channel)
    {
      g_sw1_press = true;
    }
}

void button2_callback(external_irq_callback_args_t *p_args)
{
    /* Make sure it's the right interrupt*/
    if(USER_SW2_IRQ_NUMBER == p_args->channel)
    {
      g_sw2_press = true;
    }
}

```

在hal_entry函数中,通过对全局变量`g_sw1_press`、`g_sw2_press`的状态进行判断,执行相应的处理逻辑,实现按键1控制LED1蓝灯,按键2控制LED2绿灯的闪烁频率。具体代码如下:
```c
#include "button.h"

/* Board's user LED */
extern bsp_leds_t g_bsp_leds;
/* Boolean flag to determine switch is pressed or not.*/
extern volatile bool g_sw1_press;
extern volatile bool g_sw2_press;

/*******************************************************************************************************************//**
* 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)
{
    /* TODO: add your own code here */


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

    fsp_err_t err                           = FSP_SUCCESS;
    blink_speed_t feq_level= slow_speed;

    /* Define the units to be used with the software delay function */
    const bsp_delay_units_t bsp_delay_units = BSP_DELAY_UNITS_MILLISECONDS;

    /* the blink frequency,high 5h=Hz,normal 2Hz,slow 1Hz , (must be <= bsp_delay_units */
    uint32_t freq_in_hz = 2;

    /* Calculate the delay in terms of bsp_delay_units */
    uint32_t delay = bsp_delay_units / freq_in_hz;

    /* LED type structure */
    bsp_leds_t leds = g_bsp_leds;

    /* Holds level to set for pins */
    bsp_io_level_t led1_level = BSP_IO_LEVEL_LOW;
    bsp_io_level_t led2_level = BSP_IO_LEVEL_LOW;

    /* Initialize button driver*/
    err = button_init();

    /* Enable button driver*/
    err = button_enable();
    /* Handle error */
    if(FSP_SUCCESS != err)
    {
      /* Close button module.*/
      button_deinit();

    }


    while (1)
    {
      /* Toggle user LED1when user button1 is pressed*/
      if(true == g_sw1_press)
      {
            /* Clear user button1 flag */
            g_sw1_press = false;

            /* Read user LEDpin */
            err = R_IOPORT_PinRead(&g_ioport_ctrl, (bsp_io_port_pin_t)leds.p_leds, &led1_level);
            /* Handle error */
            if (FSP_SUCCESS != err)
            {
                /* Close External IRQ module.*/
                button_deinit();
            }

            /* Reverse LED pin state*/
            led1_level ^= BSP_IO_LEVEL_HIGH;

            /* Toggle user LED */
            err = R_IOPORT_PinWrite(&g_ioport_ctrl, (bsp_io_port_pin_t)leds.p_leds, led1_level);

            /* Handle error */
            if (FSP_SUCCESS != err)
            {
                /* Close External IRQ module.*/
                button_deinit();
            }
      }
      /* Change user LED2 blink feqwhen user button2 is pressed*/
      if(true == g_sw2_press)
      {
            /* Clear user button2 flag */
            g_sw2_press = false;

            switch(feq_level)
            {
                case slow_speed:
                  feq_level=normal_speed;
                  freq_in_hz=1;
                  break;
                case normal_speed:
                  feq_level=high_speed;
                  freq_in_hz=2;
                  break;
                case high_speed:
                  feq_level=slow_speed;
                  freq_in_hz=5;
                  break;
            }
            delay = bsp_delay_units / freq_in_hz;

      }

      err = R_IOPORT_PinWrite(&g_ioport_ctrl, (bsp_io_port_pin_t)leds.p_leds, led2_level);
      /* Toggle level for next write */
      if (BSP_IO_LEVEL_LOW == led2_level)
      {
            led2_level = BSP_IO_LEVEL_HIGH;
                  }
      else
      {
            led2_level = BSP_IO_LEVEL_LOW;
                   }
      /* Delay */
      R_BSP_SoftwareDelay(delay, bsp_delay_units);
    }


}


```

## 总结
瑞萨的开发环境搭建很方便,提供的FSP工具可以快速的配置外设和模块,并生成底层代码,减少了用户编辑代码的工作量。对EK-RA6M5,瑞萨制作了相应的bsp支持包,用户在熟悉其代码后,可以快速搭建自身的应用并测试。

附件:

<br/><br/>

<br/><br/>

<br/><br/>

<br/><br/>























Jacktang 发表于 2024-11-24 09:35

<p>总感觉瑞萨提供的集成开发环境安装还是比较复杂繁琐的</p>

bigbat 发表于 2024-11-24 09:55

<p>瑞萨的VSCode环境还是比较好的,感觉比ST的那个还要好,就是不知道和瑞萨的E2环境的那些函数说明怎么获得</p>

bigbat 发表于 2024-11-24 15:19

<p>UP的原理图能传一份吗?&quot;ek-ra6m5-v1-designpackage.zip&quot;,</p>

<p> &nbsp;</p>

<p>我的原理图是怎样滴,我也没有做过什么对不起瑞萨的事情呀!</p>

<p>人品也是不错滴呀为啥我的原理图是这样的</p>

鱼豆腐车仔面 发表于 2024-11-24 20:11

bigbat 发表于 2024-11-24 15:19
UP的原理图能传一份吗?&quot;ek-ra6m5-v1-designpackage.zip&quot;,

&nbsp;

我的原理图是怎样滴,我也没 ...

<p>用edge打开就会这样,换个软件试试</p>

EPTmachine 发表于 2024-11-24 21:30

bigbat 发表于 2024-11-24 15:19
UP的原理图能传一份吗?&quot;ek-ra6m5-v1-designpackage.zip&quot;,

&nbsp;

我的原理图是怎样滴,我也没 ...

<p>好的</p>

bigbat 发表于 2024-11-25 15:21

鱼豆腐车仔面 发表于 2024-11-24 20:11
用edge打开就会这样,换个软件试试

<p>可以了,就是edge的问题,换成adboe的软件就可以了。</p>

bigbat 发表于 2024-11-25 15:32

EPTmachine 发表于 2024-11-24 21:30
好的

<p>可以了,就是edge的问题,换成adboe的软件就可以了。其它的浏览器也行</p>

hellokitty_bean 发表于 2024-11-25 19:25

鱼豆腐车仔面 发表于 2024-11-24 20:11
用edge打开就会这样,换个软件试试

<p>Edge不是换成Chrome内核了吗?怎么还这么操蛋?<img height="48" src="https://bbs.eeworld.com.cn/static/editor/plugins/hkemoji/sticker/facebook/lol.gif" width="48" /></p>

hellokitty_bean 发表于 2024-11-25 19:25

bigbat 发表于 2024-11-25 15:32
可以了,就是edge的问题,换成adboe的软件就可以了。其它的浏览器也行

<p>adboe是个啥东东??。。。。。。。。怎么没有印象捏。。。。。。<img height="48" src="https://bbs.eeworld.com.cn/static/editor/plugins/hkemoji/sticker/facebook/smile.gif" width="48" /></p>

bigbat 发表于 2024-11-26 10:18

hellokitty_bean 发表于 2024-11-25 19:25
adboe是个啥东东??。。。。。。。。怎么没有印象捏。。。。。。

<p>是Adobe Acrobat Reader DC软件,阅读PDF的专用软件。可以转换成edge格式可以看的</p>

hellokitty_bean 发表于 2024-11-26 13:55

bigbat 发表于 2024-11-26 10:18
是Adobe Acrobat Reader DC软件,阅读PDF的专用软件。可以转换成edge格式可以看的

<p>oh,.....原来如此。。。。。DC是以前的Acrobat Pro的升级版本了,可以编辑pdf的<img height="48" src="https://bbs.eeworld.com.cn/static/editor/plugins/hkemoji/sticker/facebook/loveliness.gif" width="48" /></p>
页: [1]
查看完整版本: 【Follow me第二季第3期】1入门任务:搭建环境,下载调试示例程序,Blink,按键