【瑞萨RA x Zephyr评测】二、ADC模块测试


文章目录

  • [1. 简介📢](#1. 简介📢)
  • [2. 基础知识📒](#2. 基础知识📒)
  • [3. ADC实验准备](#3. ADC实验准备)
  • 参考

1. 简介📢

在上一篇中,我们搭建了环境,点亮了开发板,这一篇我们开始熟悉Zephyr的设备驱动,以FPB-RA6E2上的ADC为例展开,欢迎大家收藏、转发,多多交流哈🤗😃🎉🪅📢

🏳️‍🌈🏳️‍🌈🏳️‍🌈🏳️‍🌈🏳️‍🌈🏳️‍🌈🏳️‍🌈🏳️‍🌈🏳️‍🌈🏳️‍🌈🏳️‍🌈🏳️‍🌈🏳️‍🌈🏳️‍🌈🏳️‍🌈🏳️‍🌈🏳️‍🌈🏳️‍🌈🏳️‍🌈🏳️‍🌈🏳️‍🌈🏳️‍🌈🏳️‍🌈🏳️‍🌈🏳️‍🌈🏳️‍🌈🏳️‍🌈🏳️‍🌈🏳️‍🌈🏳️‍🌈🏳️‍🌈🏳️‍🌈🏳️‍🌈🏳️‍🌈🏳️‍🌈🏳️‍🌈🏳️‍🌈🏳️‍🌈🏳️‍🌈🏳️‍🌈🏳️‍🌈🏳️‍🌈🏳️‍🌈🏳️‍🌈

🚀 ------评测系列跳转------🚀
瑞萨FPB-RA6E2开发板快速入门
【瑞萨RA x Zephyr评测】一、点亮FPB-RA6E2开发板


2. 基础知识📒

复制代码
ADC通道是板载硬件,所以在DeviceTree中直接"挂在"板子下面。

关于设备树中的设备引脚配置,我们先温习一下,后面ADC实验中可能会用到。

以Renesas RA 系列微控制器引脚选择(PSEL)配置的宏定义为例:

c 复制代码
...
#define RA_PSEL_ADC          0x0
...
#define RA_PSEL_POS  8
#define RA_PSEL_MASK 0x1f

#define RA_MODE_POS  13
#define RA_MODE_MASK 0x1

#define RA_PSEL(psel, port_num, pin_num)                                                           \
	(1 << RA_MODE_POS | psel << RA_PSEL_POS | port_num << RA_PORT_NUM_POS |                    \
	 pin_num << RA_PIN_NUM_POS)

其中,

#define RA_MODE_POS 31 // 模式位位置(最高位)

#define RA_PSEL_POS 24 // 外设选择位位置

#define RA_PORT_NUM_POS 16 // 端口号位位置

#define RA_PIN_NUM_POS 8 // 引脚号位位置

  • psel:外设选择码(如 ADC、SPI、SCI 等)
  • port_num:端口号(0-9 等)
  • pin_num:引脚号(0-15 等)

生成的32位数值结构:

text 复制代码
31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9  8  7  6  5  4  3  2  1  0
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
| MODE |       PSEL       |     PORT_NUM     |      PIN_NUM      |        可能保留位            |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+

那如果要配置ADC通道:

c 复制代码
// adc0_default: 端口0,引脚0
RA_PSEL(RA_PSEL_ADC, 0, 0)

// 假设:
// RA_PSEL_ADC = 0x0A(ADC外设代码)
// 端口0,引脚0

// 计算结果:
1 << 31 = 0x80000000  // 模式位设为1
0x0A << 24 = 0x0A000000  // ADC外设选择
0 << 16 = 0x00000000      // 端口0
0 << 8 = 0x00000000       // 引脚0

// 最终值:0x8A000000

最终,在设备树中:

text 复制代码
// 配置ADC0使用端口0,引脚0
adc0_default: adc0_default {
    group1 {
        psels = <RA_PSEL(RA_PSEL_ADC, 0, 0)>;  // 生成0x8A000000
        renesas,analog-enable;  // 启用模拟功能
    };
};

那如果是想在程序中查看配置值,则可以:

c 复制代码
// 如果想在代码中查看这些值
#define ADC_PSEL_VALUE RA_PSEL(RA_PSEL_ADC, 0, 0)
printk("ADC PSEL值: 0x%08X\n", ADC_PSEL_VALUE);

3. ADC实验准备

我们先看一下Zephyr中对FPB-RA6E2开发板的设备树文件:

可以看到,默认是支持ADC的,再确认一下瑞萨原厂的R6设备树文件:

文件路径:zephyr\dts\arm\renesas\ra\ra6\ra6-cm33-common.dtsi

OK,那我们再来找一个APP程序就可以了。

在sample的driver中有ADC的应用例程:

但是,我们发现,这个例程中,没有对FPB-RA6E2开发板做支持,那我们就需要添加一个.overlay文件:

文件路径:zephyr\samples\drivers\adc\adc_dt\boards\fpb_ra6e2.overlay

c 复制代码
/*
 * Copyright (c) 2024 Renesas Electronics Corporation
 *
 * SPDX-License-Identifier: Apache-2.0
 */

/ {
	zephyr,user {
		io-channels = <&adc0 0>, <&adc0 2>;
	};
};

&adc0 {
	status = "okay";
	#address-cells = <1>;
	#size-cells = <0>;

	channel@0 {
		reg = <0>;
		zephyr,gain = "ADC_GAIN_1";
		zephyr,reference = "ADC_REF_INTERNAL";
		zephyr,resolution = <12>;
		zephyr,acquisition-time = <ADC_ACQ_TIME_DEFAULT>;
		zephyr,vref-mv = <3300>;
	};

	channel@2 {
		reg = <2>;
		zephyr,gain = "ADC_GAIN_1";
		zephyr,reference = "ADC_REF_INTERNAL";
		zephyr,resolution = <12>;
		zephyr,acquisition-time = <ADC_ACQ_TIME_DEFAULT>;
		zephyr,vref-mv = <3300>;
	};
};

在这个文件中,我们将io-channels与adc0绑定,并且对adc0做了配置。

powershell 复制代码
 west build -p always -b fpb_ra6e2 ./samples/drivers/adc/adc_dt

powershell 复制代码
west flash

观察实验结果:


参考

【1】Introduction to devicetree

【2】初识Zephyr?看这个就够了!

【3】详解Zephyr设备数与设备驱动模型

【4】详解Zephyr设备树(DeviceTree)与驱动模型

相关推荐
ScilogyHunter4 天前
Zephyr串口驱动开发及构建完全指南
驱动开发·uart·zephyr
ScilogyHunter4 天前
Zephyr Hello World应用开发构建完全指南
zephyr·hello world
ScilogyHunter4 天前
Zephyr Twister测试框架完全指南
zephyr·twister
ScilogyHunter5 天前
west init 命令详解
init·zephyr·west
ScilogyHunter5 天前
使用Kconfig配置Zephyr工程完全指南
kconfig·zephyr
ScilogyHunter5 天前
Zephyr设备树完全指南
zephyr
ScilogyHunter6 天前
Zephyr项目按需配置完全指南
zephyr
ScilogyHunter6 天前
Zephyr最简工程配置指南
zephyr
ScilogyHunter6 天前
Zephyr主仓库目录结构完全指南
zephyr
ScilogyHunter6 天前
Zephyr工程配置完全指南
zephyr