这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » DIY与开源设计 » 电子DIY » 【FRDMRW612系列】Zephyr获取开发板上的P3T1755温度计

共1条 1/1 1 跳转至

【FRDMRW612系列】Zephyr获取开发板上的P3T1755温度计

高工
2026-08-09 16:52:37     打赏

【前言】

在FRDM_RW612开发板上,板载了一颗温度传感P3T1755。本次使用Zephyr的Sensor模块来驱动他,获取温度值。

【温度传感器】

在开发板的靠近MCULINK接口

image.png

在开发板原理图上有注明为U2

image.png

通过原理图得知他的器件地址为0x90。接到了GPIO_16与GPIO_17上。

【zephyr工程组织】

创建工程文件目录结构如下:

app/RW612_p3t1755/
├── CMakeLists.txt      # 标准 Zephyr 应用骨架
├── prj.conf            # CONFIG_SENSOR=y
└── src/main.c          # 每秒读一次温度并 printk

【代码前期验证】

1、通过设备树查找,FRDM-RW612 的板级设备树 frdm_rw612_common.dtsi:345 已经帮你做好了硬件描述:

&flexcomm2 {                       // I2C 控制器(arduino_i2c)
	compatible = "nxp,lpc-i2c";
	status = "okay";
	p3t1755: p3t1755@48 {          // 板载传感器,7位地址 0x48
		compatible = "nxp,p3t1755";
		reg = <0x48>;
		status = "okay";
	};
};

2、Zephyr 自带驱动 zephyr/drivers/sensor/nxp/p3t1755/,只要设备树节点是 okay,CONFIG_P3T1755 就默认 y,I2C 驱动也会自动选中。所以应用层只需 CONFIG_SENSOR=y,然后走标准 sensor API 即可,不需要任何 overlay。

【代码实现】

1、通过上面的验证,我们只需要在prj.conf中打开sensor配置即可

prj.conf文件内容如下:

# 使能 Zephyr 传感器子系统(P3T1755 驱动在设备树节点 enabled 时默认编译)
CONFIG_SENSOR=y

2、CMakeLists.txt

在这里我们也只需要编写常规即可,指定加入编译的文件也就只有src/main.c即可

# SPDX-License-Identifier: Apache-2.0

cmake_minimum_required(VERSION 3.20.0)

find_package(Zephyr REQUIRED HINTS $ENV{ZEPHYR_BASE})
project(RW612_p3t1755)

target_sources(app PRIVATE src/main.c)

3、main.c

在main.c中,我们的核心三步:

  1. DEVICE_DT_GET(DT_NODELABEL(p3t1755)) — 按节点标签拿到设备指针

  2. sensor_sample_fetch(dev) — 触发一次转换并读回原始值

  3. sensor_channel_get(dev, SENSOR_CHAN_AMBIENT_TEMP, &temp) — 换算成摄氏度,val1 是整数部分,val2 是小数部分(微度)

源码全文如下:

/*
 * FRDM-RW612 板载 P3T1755 温度传感器轮询示例
 *
 * P3T1755 挂在 flexcomm2 (arduino_i2c) 上,地址 0x48,
 * 设备树节点标签为 p3t1755(板级 dtsi 已定义并启用)。
 */

#include <zephyr/kernel.h>
#include <zephyr/device.h>
#include <zephyr/drivers/sensor.h>

int main(void)
{
    const struct device *const dev = DEVICE_DT_GET(DT_NODELABEL(p3t1755));
    struct sensor_value temp;
    int ret;

    if (!device_is_ready(dev)) {
        printk("P3T1755 device %s is not ready\n", dev->name);
        return 0;
    }

    printk("P3T1755 (%s) ready, polling every 1s...\n", dev->name);

    while (1) {
        ret = sensor_sample_fetch(dev);
        if (ret) {
            printk("sensor_sample_fetch failed: %d\n", ret);
            goto wait;
        }

        ret = sensor_channel_get(dev, SENSOR_CHAN_AMBIENT_TEMP, &temp);
        if (ret) {
            printk("sensor_channel_get failed: %d\n", ret);
            goto wait;
        }

        /* sensor_value_to_double 也可,这里用整数+小数打印避免浮点 printf 开销 */
        printk("Temperature: %d.%06d C\n", temp.val1, temp.val2);
    wait:
        k_sleep(K_SECONDS(1));
    }

    return 0;
}

【编译与下载】

由于我们app在zephyr的目录下面,就不需要配置zephyr sdk的路径了,直接west build -b frdm_rw613即可以编译,如果在其他的环境中,需要配置环境。

export ZEPHYR_SDK_INSTALL_DIR="D:\\luglZephyrproject\\zephyr-sdk-1.0.1\\zephyr-sdk-1.0.1"
export ZEPHYR_TOOLCHAIN_VARIANT=zephyr

west build -b frdm_rw612 app/RW612_p3t1755 -p   # 已验证通过
west flash                                       # 需装好 LinkServer,板子 USB 接 CMSIS-DAP 口

【效果观察】

打开串口终端 波特率为115200 

image.png

【想改硬件配置时】

  • 换 I2C 地址/总线:在应用目录加 boards/frdm_rw612.overlay,覆写 &p3t1755reg 或把节点挪到别的 flexcomm

  • 读更高精度:驱动返回的 val2 本身分辨率是 0.0625°C(1/16),已完整打印。

  • 想走 shell 交互调试:prj.confCONFIG_SENSOR_SHELL=y,串口里直接敲 sensor get p3t1755@48


【总结】

在zephyr下,我们驱动P3t1755非常方便,用户不需要去观察底层,只需要少量的代码就完成即定功能!




关键词: FRDMRW612     Zephyr     P3T1755         

共1条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]