0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

【瑞萨RA × Zephyr评测】LED、按键和UART

枫雪天 来源:枫雪天 2026-01-10 10:21 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

硬件: Renesas FPB-RA6E2 + 板载 LED 和按键
目标: 实现按键控制 LED 的开关状态,并通过 UART 输出按键事件日志,验证 GPIO 和串口通信功能。


1. 硬件连接与引脚定义

包含 GPIO 输入输出功能与 UART 数据传输引脚。

功能物理引脚 (Pin)信号定义接线说明
按键输入P304Digital In (SW0)板载按键无需接线
LED 输出P207Digital Out (LED0)板载 LED 无需接线
UART 发送P411UART TX连接到调试器
UART 接收P410UART RX连接到调试器

2. 软件环境配置


2.1 Device Tree Overlay (app.overlay)

必须明确指定 GPIO 和 UART 的物理引脚绑定,并开启外设状态。

chosen {
    zephyr,console = &uart0;    /* in externalzephyrboardsrenesasfpb_ra6e2fpb_ra6e2.dts:22 */
    zephyr,shell-uart = &uart0; /* in externalzephyrboardsrenesasfpb_ra6e2fpb_ra6e2.dts:23 */
};

/* GPIO 配置 */
leds {
    compatible = "gpio-leds";
    led1: led1 {
        gpios = < &ioport2 7 GPIO_ACTIVE_HIGH >;
        label = "LED1";
    };
    led2: led2 {
        gpios = < &ioport2 6 GPIO_ACTIVE_HIGH >;
        label = "LED2";
    };
};

buttons {
    compatible = "gpio-keys";
    button0: s1 {
    gpios = < &ioport3 4 (GPIO_PULL_UP | GPIO_ACTIVE_LOW) >;
    label = "Push button switch 1";
        zephyr,code = < INPUT_KEY_0 >;
    };
};

/* UART 配置 */
&uart0 {
    status = "okay";
    pinctrl-0 = < &uart0_default >;
    pinctrl-names = "default";
    current-speed = < 115200 >; /* 波特率设置 */
};
};
};

2.2 Kconfig 配置 (prj.conf)

确保启用了 GPIO 和 UART 驱动支持。

CONFIG_GPIO=y
CONFIG_SERIAL=y
CONFIG_UART_INTERRUPT_DRIVEN=y

3. 代码逻辑分析

3.1 主程序代码(main.c)

/*
 * Copyright (c) 2016 Open-RnD Sp. z o.o.
 * Copyright (c) 2020 Nordic Semiconductor ASA
 *
 * SPDX-License-Identifier: Apache-2.0
 *
 * NOTE: If you are looking into an implementation of button events with
 * debouncing, check out `input` subsystem and `samples/subsys/input/input_dump`
 * example instead.
 */

#include < zephyr/kernel.h >
#include < zephyr/device.h >
#include < zephyr/drivers/gpio.h >
#include < zephyr/sys/util.h >
#include < zephyr/sys/printk.h >
#include < inttypes.h >

#define SLEEP_TIME_MS	1

/*
 * Get button configuration from the devicetree sw0 alias. This is mandatory.
 */
#define SW0_NODE	DT_ALIAS(sw0)
#if !DT_NODE_HAS_STATUS_OKAY(SW0_NODE)
#error "Unsupported board: sw0 devicetree alias is not defined"
#endif
static const struct gpio_dt_spec button = GPIO_DT_SPEC_GET_OR(SW0_NODE, gpios,
							      {0});
static struct gpio_callback button_cb_data;

/*
 * The led0 devicetree alias is optional. If present, we'll use it
 * to turn on the LED whenever the button is pressed.
 */
static struct gpio_dt_spec led = GPIO_DT_SPEC_GET_OR(DT_ALIAS(led0), gpios,
						     {0});

void button_pressed(const struct device *dev, struct gpio_callback *cb,
		    uint32_t pins)
{
	printk("Button pressed at %" PRIu32 "n", k_cycle_get_32());
}

int main(void)
{
	int ret;

	if (!gpio_is_ready_dt(&button)) {
		printk("Error: button device %s is not readyn",
		       button.port- >name);
		return 0;
	}

	ret = gpio_pin_configure_dt(&button, GPIO_INPUT);
	if (ret != 0) {
		printk("Error %d: failed to configure %s pin %dn",
		       ret, button.port- >name, button.pin);
		return 0;
	}

	ret = gpio_pin_interrupt_configure_dt(&button,
					      GPIO_INT_EDGE_TO_ACTIVE);
	if (ret != 0) {
		printk("Error %d: failed to configure interrupt on %s pin %dn",
			ret, button.port- >name, button.pin);
		return 0;
	}

	gpio_init_callback(&button_cb_data, button_pressed, BIT(button.pin));
	gpio_add_callback(button.port, &button_cb_data);
	printk("Set up button at %s pin %dn", button.port- >name, button.pin);

	if (led.port && !gpio_is_ready_dt(&led)) {
		printk("Error %d: LED device %s is not ready; ignoring itn",
		       ret, led.port- >name);
		led.port = NULL;
	}
	if (led.port) {
		ret = gpio_pin_configure_dt(&led, GPIO_OUTPUT);
		if (ret != 0) {
			printk("Error %d: failed to configure LED device %s pin %dn",
			       ret, led.port- >name, led.pin);
			led.port = NULL;
		} else {
			printk("Set up LED at %s pin %dn", led.port- >name, led.pin);
		}
	}

	printk("Press the buttonn");
	if (led.port) {
		while (1) {
			/* If we have an LED, match its state to the button's. */
			int val = gpio_pin_get_dt(&button);

			if (val >= 0) {
				gpio_pin_set_dt(&led, val);
			}
			k_msleep(SLEEP_TIME_MS);
		}
	}
	return 0;
}

3.2 核心流程

程序采用中断驱动的方式,实现了按键事件捕获与 LED 状态切换,同时通过 UART 输出日志。

  1. 初始化阶段
    • 配置 GPIO 引脚:P002 设置为输入模式,启用内部上拉电阻;P003 设置为输出模式。
    • 配置 UART:波特率 115200,8N1 格式。
    • 注册按键中断回调函数。
  2. 运行时逻辑
    • 按键按下时触发中断,切换 LED 状态(开/关)。
    • 在中断回调中,记录按键事件并通过 UART 输出日志。
    • 主循环保持空闲,等待中断触发。

3.1 关键 API 使用

以下是代码中使用的关键 API:

  • GPIO 初始化与控制
    gpio_pin_configure(gpio_dev, PIN_BTN, GPIO_INPUT | GPIO_PULL_UP);
    gpio_pin_configure(gpio_dev, PIN_LED, GPIO_OUTPUT);
    
  • UART 数据发送
    printk(str, args...);
    
  • 中断注册与处理
    gpio_pin_interrupt_configure(gpio_dev, PIN_BTN, GPIO_INT_EDGE_TO_ACTIVE);
    gpio_init_callback(&btn_cb, button_pressed, BIT(PIN_BTN));
    gpio_add_callback(gpio_dev, &btn_cb);
    

4. 实验现象与数据分析

4.1 串口日志 (UART Output)

终端应显示如下数据流:

Button pressed at 91714454
Button pressed at 228051750
Button pressed at 342154106
Button pressed at 431864898
Button pressed at 514931258
...

4.2 板载 LED 行为

  • 初始状态:LED 关闭。
  • 每次按键按下,LED 状态翻转(开/关)。
  • 视觉效果:LED 应与按键动作同步,无明显延迟。

5. 测评总结

本程序成功演示了 Renesas RA6E2 在 Zephyr RTOS 下的 GPIO 和 UART 外设控制。通过按键事件驱动 LED 状态切换,并实时记录日志到 UART,直观地展示了嵌入式系统中“输入-处理-输出”的基本工作流程。代码结构清晰,适配了最新的驱动 API,适用于初学者学习和开发者快速验证硬件功能。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 单片机
    +关注

    关注

    6078

    文章

    45629

    浏览量

    675355
  • 瑞萨
    +关注

    关注

    38

    文章

    22542

    浏览量

    91689
  • Zephyr
    +关注

    关注

    1

    文章

    62

    浏览量

    6643
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    如何搭建RA VS code开发环境

    在上一篇文章“当RA MCU遇见Zephyr,打通嵌入式开发任督二脉!”中,我们介绍了Zephyr极具前景的发展趋势以及开发板对
    的头像 发表于 11-05 14:41 4816次阅读
    如何搭建<b class='flag-5'>瑞</b><b class='flag-5'>萨</b><b class='flag-5'>RA</b> VS code开发环境

    RA6M3 HMI Board评测挑战】-RA6M3上的CAN实践

    RA6M3 HMI Board 评测大挑战】-RA6M3上的CAN实践
    的头像 发表于 10-17 14:55 3908次阅读
    【<b class='flag-5'>RA</b>6M3 HMI Board<b class='flag-5'>评测</b>挑战】-<b class='flag-5'>瑞</b><b class='flag-5'>萨</b><b class='flag-5'>RA</b>6M3上的CAN实践

    RA MCU遇见Zephyr系列(3)——在Vs code中配置Zephyr集成开发环境

    RA生态工作室关注我们上一篇文章介绍了如何在VScode中使用官方插件为RA芯片创建项目与项目调试,相信大家对RA在VScode中的开发
    的头像 发表于 01-01 10:04 5242次阅读
    当<b class='flag-5'>RA</b> MCU遇见<b class='flag-5'>Zephyr</b>系列(3)——在Vs  code中配置<b class='flag-5'>Zephyr</b>集成开发环境

    RA-Eco-RA6M4开发板评测】——2.串口打印

    3_ON;delay_ms(200);LED3_OFF; printf(\"欢迎试用电子RA-Eco-RA6M4开发板评测\\\\r\\
    发表于 07-16 13:20

    RA6E2】zephyr系统适配、点亮leduart输出测试

    就行了。如下: 到这里板卡基本也就适配完成,但是由于ek_ra6e2板子的串口、led按键等外设引脚和RA-Eco-RA6E2-64PIN-V1.0 开发板存在差异,所以我们要
    发表于 11-16 17:57

    FPB-RA6E2试用】【原创】【RA × Zephyr开发板评测】+入门级任务测试1

    很荣幸获得了RA × ZephyrFPB-RA
    发表于 12-24 23:52

    FPB-RA6E2试用】基础功能使用1

    ,首先从点灯开始。 zephyrLED工程 在配置好环境以后,需要验证配置的环境是否正常,生成的代码是否能够在开发板上成功跑通。在零基础的情况下,参考
    发表于 12-28 21:35

    FPB-RA6E2试用】【RA × Zephyr开发板评测】Linux环境配置和初步试用

    1. 前言 很荣幸获得了RA × ZephyrFPB-
    发表于 12-29 12:55

    FPB-RA6E2试用】【原创】基于【FPB-RA6E2】Windows 下Zephyr RTOS自定义项目开发全流程(创建-编译-烧录-串口调试)

    【原创】基于【FPB-RA6E2】Windows 下Zephyr RTOS自定义项目开发全流程(创建 · 编译 · 烧录 · 串口调试) 《整体全流程演示》。 使用的硬件:
    发表于 01-01 15:35

    FPB-RA6E2试用】【RA × Zephyr开发板评测】+以按键控制LED

    安装过程中常会出现安装失败的情况,为此需要多次重复才能确保完成。 在完成安装后,即可进行工程的创建。 具体其操作为,点击界面左侧下方的“Create Renesas RA Project”。随后,将
    发表于 01-05 17:04

    FPB-RA6E2试用】GPIO-Zephyr RTOS 闪烁程序及设备树理解

    ://docs.zephyrproject.org/latest/samples/basic/blinky/README.html 5.3 项目代码 *附件:fpb_ra6e2_basic_blinky.zip 感谢电子发烧友平台,感谢
    发表于 01-13 14:37

    FPB-RA6E2试用】环境配置及基础任务代码示例

    RA × Zephyr开发板评测】 开发板基础功能测试与代码移植 本报告两篇开发内容主要以入门级的外设为标准进行测试,在入门级测试需求
    发表于 01-24 20:47

    RA × Zephyr开发板评测】+ CANFD

    感谢【RA x Zephyr评测】三、CAN模块测试_
    发表于 02-03 00:08

    RA-Eco-RA4M2开发板评测】适配Zephyr OS,快速驱动LED与串口

    前言 非常感谢电子发烧友论坛与生态工作室给予这块“马年定制开发板”的试用机会。 众所周之,RA的开发环境有keil 或者 IAR 或者是使用e2struiod的开发环境。当然也还有
    发表于 03-19 15:01

    RA × Zephyr评测】SSD1306显示MPU6050加速度计读数

    本文介绍了在RA6E2单片机上基于Zephyr RTOS操作SPI与I2C总线的实验
    的头像 发表于 01-10 10:24 1007次阅读
    【<b class='flag-5'>瑞</b><b class='flag-5'>萨</b><b class='flag-5'>RA</b> × <b class='flag-5'>Zephyr</b><b class='flag-5'>评测</b>】SSD1306显示MPU6050加速度计读数