单片机/MCU论坛
直播中

人字拖大魔王

1年用户 7经验值
擅长:测量仪表 嵌入式技术
私信 关注
[文章]

【RA-Eco-RA6M4开发板评测】实现keil环境的搭建+串口打印+LED点亮

dd0041d091488fbaee758505c23196aa

d55e913a11424a28ae3b2b10e6e19d00.png
RA-Eco-RA6M4-100PIN-V1.0开发板,主控芯片为R7FA6M4AF3CFP。 瑞萨电子 RA6M4 微控制器 (MCU) 产品群使用了支持 TrustZone® 的高性能 Arm® Cortex®-M33 内核。与片内的 Secure Crypto Engine(SCE) 配合使用,可提供安全芯片的功能。集成带有专用 DMA 的以太网 MAC,可确保高数据吞吐率。RA6M4 采用高效的 40nm 工艺,由基于 FreeRTOS 的灵活配置软件包 (FSP) 这一开放且灵活的生态系统概念提供支持,并能够扩展以使用其他实时操作系统(RTOS)和中间件。RA6M4 适用于物联网应用的需求,如以太网、面向未来应用的安全功能、大容量嵌入式 RAM 和较低功耗(从闪存运行 CoreMark® 算法,低至 99µA/MHz)。

  • 1个复位按键
  • 2个用户按键
  • 2个触摸按键
  • 3个LED
  • 2个PMOD接口
  • 板载USB转TTL模块,可用于串口通信和烧录
  • 板载SWD接口,方便用户调试与下载
  • 支持 TrustZone 的 200MHz Arm Cortex-M33
  • 安全芯片的功能
  • 1MB 闪存、192kB支持奇偶校验 SRAM 以及64kb ECC SRAM
  • 具有后台运行能力的双区闪存
  • 8KB 数据闪存,提供与 EEPROM 类似的数据存储功能
  • 100 引脚封装
  • 带有专用 DMA 的以太网控制器
  • 电容触摸按键感应单元
  • 全速 USB 2.0,支持主机模式和设备模式
  • CAN 2.0B
  • QuadSPI 和 OctaSPI
  • SCI(UART、简单 SPI、简单 I2C)
  • SPI/ I2C 多主接口
  • SDHI 和 MMC

搭建keil的配置环境

  1. 需要先安装keil软件,然后再安装瑞萨的软件
  2. 首先打开 FSP 的发布页面(https://github.com/renesas/fsp/releases),在这个网页下面定位到所需的 FSP 发布版本,以 FSP 6.1.0 版本为例,
    在 Assets 栏下面发布了与 FSP 6.1.0 相关的工具软件,如下图所示。
    wechat_2025-09-28_195702_612.png
    在下载的时候很慢,后来使用了科学上网后才快速的下载完成。 进行安装,安装路径要注意不要用中文路径,需要记一下路径位置后续需要用到。
  3. 安装完成后,打开keil软件,进行一些配置
    7a703ab3173c424abc0583826260cbb2.png
    wKgZO2jZJ1mAO7AGAABFaO80REE871.png)
    在“Menu Content”窗口中新建一个菜单项 “RA Smart Configurator” ,
    然后在“Command”一栏中输入 RASC 程序的路径,在“Initial Folder”一栏中输入 “$P” ,
    在“Arguments”一栏中输入:

–device $D --compiler ARMv6 configuration.xml

同理,在“Menu Content”窗口中再次新建一个菜单项 “Device Partition Manager” ,
然后在“Command”一栏中输入 RASC 程序的路径,在“Initial Folder”一栏中输入 “$P” ,在“Arguments”一栏中输入:−applicationcom.renesas.cdt.ddsc.dpm.ui.dpmapplicationconfiguration.xml"L%L"fb72360cf7444cf79a75f63f1268dc2b.png

创建工程

wechat_2025-09-28_200200_628.png
这里进行芯片的选择,注意100pin的还分三种,选最下面的一个
然后进行配置,时钟我们默认就行

先点灯

  1. 看原理图
    wechat_2025-09-28_203730_906.png
    需要将这三个引脚进行配置wechat_2025-09-28_203105_318.png

配置串口

看原理图串口是使用的串口9
wechat_2025-09-28_203249_629.png
wechat_2025-09-28_203341_848.png
wechat_2025-09-28_203532_865.png
wechat_2025-09-28_203438_636.png

配置下DEBUG引脚和BSP的栈大小

wechat_2025-09-28_203008_074.png
wechat_2025-09-28_203149_122.png
选择SWD
然后就生成代码wechat_2025-09-28_204705_547.png

代码展示

在串口的主代码中需要添加一段代码如下:
wechat_2025-09-28_204902_700.png

unsigned char send_buff[100];
volatile bool uart_send_complete_flag = false;

void user_uart9_callback (uart_callback_args_t * p_args)
{
    if(p_args->event == UART_EVENT_TX_COMPLETE)
    {
        uart_send_complete_flag = true;
    }
}

int fputc(int ch)
{
   err = R_SCI_UART_Write(&g_uart9_ctrl, (uint8_t *)&ch, 1);
   if(FSP_SUCCESS != err) __BKPT();
   while(uart_send_complete_flag == false)
   {
   }
   uart_send_complete_flag = false;
   return ch;
}

主循环中,添加测试代码,进行串口的发送

void hal_entry(void)
{
/* TODO: add your own code here */
err = R_SCI_UART_Open(&g_uart9_ctrl, &g_uart9_cfg);
assert(FSP_SUCCESS == err);
while(1)
{
printf("Hellow  world ! \r\n");
}
#if BSP_TZ_SECURE_BUILD
/* Enter non-secure code */
R_BSP_NonSecureEnter();
#endif
}

点灯的代码分文件进行了编写:
.h的文件如下:

#ifndef __BSP_LED_H
#define __BSP_LED_H
#include "hal_data.h"

/* LED引脚置低电平 LED灯亮 */
#define LED1_ON     R_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_02_PIN_10, BSP_IO_LEVEL_LOW)
#define LED2_ON     R_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_02_PIN_11, BSP_IO_LEVEL_LOW)
#define LED3_ON     R_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_02_PIN_14, BSP_IO_LEVEL_LOW)

/* LED引脚置高电平 LED灯灭 */
#define LED1_OFF    R_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_02_PIN_10, BSP_IO_LEVEL_HIGH)
#define LED2_OFF    R_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_02_PIN_11, BSP_IO_LEVEL_HIGH)
#define LED3_OFF    R_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_02_PIN_14, BSP_IO_LEVEL_HIGH)

/* 使用寄存器来实现 LED灯翻转 */
#define LED1_TOGGLE R_PORT4->PODR ^= 1<<(BSP_IO_PORT_02_PIN_10 & 0xFF)
#define LED2_TOGGLE R_PORT4->PODR ^= 1<<(BSP_IO_PORT_02_PIN_11 & 0xFF)
#define LED3_TOGGLE R_PORT4->PODR ^= 1<<(BSP_IO_PORT_02_PIN_14 & 0xFF)


/* LED初始化函数 */
void LED_Init(void);
void basic_waterfall_led(void);
void toggle_waterfall_led(void);

#endif

.c的文件如下:

#include "bsp_led.h"

/* LED初始化函数 */
void LED_Init(void)
{
   /* 初始化配置引脚(这里重复初始化了,可以注释掉) */
   R_IOPORT_Open (&g_ioport_ctrl, g_ioport.p_cfg);
}

/* 模式1:基础流水灯(顺序点亮)*/
void basic_waterfall_led(void) {
    // 状态1:LED1亮,其他灭
    LED1_ON;
    LED2_OFF;
    LED3_OFF;
    R_BSP_SoftwareDelay(500, BSP_DELAY_UNITS_MILLISECONDS); 

    // 状态2:LED2亮,其他灭
    LED1_OFF;
    LED2_ON;
    LED3_OFF;
    R_BSP_SoftwareDelay(500, BSP_DELAY_UNITS_MILLISECONDS); 

    // 状态3:LED3亮,其他灭
    LED1_OFF;
    LED2_OFF;
    LED3_ON;
    R_BSP_SoftwareDelay(500, BSP_DELAY_UNITS_MILLISECONDS); 
}

/* 模式2:翻转流水灯(寄存器级高效切换)*/
void toggle_waterfall_led(void) {
    // 初始状态:仅LED1亮
    LED1_ON;
    LED2_OFF;
    LED3_OFF;
    R_BSP_SoftwareDelay(500, BSP_DELAY_UNITS_MILLISECONDS); 

    // 依次翻转下一个LED(同时关闭当前LED)
    LED1_TOGGLE;  // 关闭LED1
    LED2_TOGGLE;  // 开启LED2
    R_BSP_SoftwareDelay(500, BSP_DELAY_UNITS_MILLISECONDS); 

    LED2_TOGGLE;  // 关闭LED2
    LED3_TOGGLE;  // 开启LED3
    R_BSP_SoftwareDelay(500, BSP_DELAY_UNITS_MILLISECONDS); 

    LED3_TOGGLE;  // 关闭LED3
    LED1_TOGGLE;  // 重新开启LED1(循环)
}

进行测试

wechat_2025-09-28_181928_524.png
串口可以正常工作,三个流水灯也能正常的显示

7e56e7d22212f551b53c511ca359d192.jpg

d67c8ac06908e7fe5d50a4138cdb4c51

更多回帖

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