【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/>
<p>总感觉瑞萨提供的集成开发环境安装还是比较复杂繁琐的</p>
<p>瑞萨的VSCode环境还是比较好的,感觉比ST的那个还要好,就是不知道和瑞萨的E2环境的那些函数说明怎么获得</p>
<p>UP的原理图能传一份吗?"ek-ra6m5-v1-designpackage.zip",</p>
<p> </p>
<p>我的原理图是怎样滴,我也没有做过什么对不起瑞萨的事情呀!</p>
<p>人品也是不错滴呀为啥我的原理图是这样的</p>
bigbat 发表于 2024-11-24 15:19
UP的原理图能传一份吗?"ek-ra6m5-v1-designpackage.zip",
我的原理图是怎样滴,我也没 ...
<p>用edge打开就会这样,换个软件试试</p>
bigbat 发表于 2024-11-24 15:19
UP的原理图能传一份吗?"ek-ra6m5-v1-designpackage.zip",
我的原理图是怎样滴,我也没 ...
<p>好的</p>
鱼豆腐车仔面 发表于 2024-11-24 20:11
用edge打开就会这样,换个软件试试
<p>可以了,就是edge的问题,换成adboe的软件就可以了。</p>
EPTmachine 发表于 2024-11-24 21:30
好的
<p>可以了,就是edge的问题,换成adboe的软件就可以了。其它的浏览器也行</p>
鱼豆腐车仔面 发表于 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>
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>
hellokitty_bean 发表于 2024-11-25 19:25
adboe是个啥东东??。。。。。。。。怎么没有印象捏。。。。。。
<p>是Adobe Acrobat Reader DC软件,阅读PDF的专用软件。可以转换成edge格式可以看的</p>
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]