【e起DIY】低功耗蓝牙温湿度计-开箱及MCUXpressoIDE点灯
https://forum.eepw.com.cn/thread/400155/1
书接上回:开箱并用官方MCUXpressoIDE点灯成功后,本篇就进入本次活动的主题:
使用 FRDM MCXW71 (或MCXW72)开发板与 SHT30 (或DHT11)温湿度传感器,构建一个基于 Zephyr 实时操作系统的低功耗蓝牙温湿度监测设备。
那么首先我们就需要安装Zephyr操作系统。
方法参照官方文档:
NXP FRDM-MCXW72_Zephyr_Lab.pdf
首先安装Visual Studio Code软件。
下载地址:https://code.visualstudio.com/Download

2. 在Visual Studio Code的扩展中搜索并安装MCUXpresso for VS Code
安装完成后就可以在左侧边栏,看到X形状的MCUXpresso图标,后续开发都是先点击这个图标,再进到界面中操作。

3. 安装Zephyr软件包及其支持包。这一步骤很关键,都往往在这里就会遇到麻烦,因为很多基础软件包是基于Github的,国内对于Github的环境不太好,下载时断时续,只能多次尝试。
o Zephyr Developer
o Arm GNU Toolchain
o Standalone Toolchain Add ons
o Linkserver
o PEmicro
进入Visual Studio Code的MCUXpresso扩展包,点击Open MCUXpresso Installer

在出现的页面选中
Zephyr Developer、arm
Arm GNU Toolchain
Standalone Toolchain Add ons
Zephyr SDK
Linkserver
SEEGER J-link
点击Install就可以安装了,点Detail可以查看具体要装哪些软件包(比如常见的CMake、Git等)。

下载时断时续,只能多次尝试,直到右侧都出现绿色打勾标识,就说明全部软件包安装完成。
4. 下载Zephyr Repository(代码仓库,是存放代码、文件、版本记录的容器 )
各种支持Zephyr 的开发板的代码及例程都会下载。
同样的,Zephyr Repository也是基于github,下载不稳定,需多次尝试,每次尝试前需要把下载目录种的内容全部删除,也就是必须一次性下载完成,下载过程中,底部状态栏会显示每个子软件包是否下载成功,只要有一个不成功,建议删除重来,否则后续会报错。


下载完成后的文件夹,高达8GB。

在board目录可以看到许多品牌(168个品牌),如renesas、NXP、ST等等。
NXP目录,可以看到很多个板子(83个板子),包括本次的frdm_mcxw72。

5.导入例程、编译下载
选择Import Example from Repository
依次选择Repository路径、开发板型号、例程等,就可以将例程导入到左下角的项目区。

选择刚刚导入的工程,点开Project Files——src——main.c就可以看到源文件。

main.c
/*
* Copyright (c) 2016 Intel Corporation
*
* SPDX-License-Identifier: Apache-2.0
*/
/**
* @file 基于PWM实现RGB LED调色演示例程
*/
/* Zephyr 内核基础头文件 */
#include <zephyr/kernel.h>
/* 串口打印输出头文件 */
#include <zephyr/sys/printk.h>
/* 设备驱动基础头文件 */
#include <zephyr/device.h>
/* PWM 外设驱动头文件 */
#include <zephyr/drivers/pwm.h>
/**
* @brief 通过设备树别名获取三路PWM LED配置
* PWM_DT_SPEC_GET:从设备树解析PWM引脚、周期、通道等参数
* DT_ALIAS(xxx):读取设备树中定义的别名
*/
static const struct pwm_dt_spec red_pwm_led =
PWM_DT_SPEC_GET(DT_ALIAS(red_pwm_led));
static const struct pwm_dt_spec green_pwm_led =
PWM_DT_SPEC_GET(DT_ALIAS(green_pwm_led));
static const struct pwm_dt_spec blue_pwm_led =
PWM_DT_SPEC_GET(DT_ALIAS(blue_pwm_led));
/* 亮度步进值:2000微秒,控制PWM占空比变化步长 */
#define STEP_SIZE PWM_USEC(2000)
int main(void)
{
uint32_t pulse_red, pulse_green, pulse_blue; /* 三路PWM高电平脉冲宽度 */
int ret; /* 函数返回值,用于判断接口执行状态 */
printk("PWM-based RGB LED control\n");
/* 检查三路PWM设备是否初始化就绪 */
if (!pwm_is_ready_dt(&red_pwm_led) ||
!pwm_is_ready_dt(&green_pwm_led) ||
!pwm_is_ready_dt(&blue_pwm_led)) {
printk("Error: one or more PWM devices not ready\n");
return 0;
}
/* 死循环,循环切换RGB颜色 */
while (1) {
/* 红色通道:脉冲宽度从0递增到PWM完整周期 */
for (pulse_red = 0U; pulse_red <= red_pwm_led.period;
pulse_red += STEP_SIZE) {
/* 设置红色LED的PWM脉冲宽度(改变亮度) */
ret = pwm_set_pulse_dt(&red_pwm_led, pulse_red);
if (ret != 0) {
printk("Error %d: red write failed\n", ret);
return 0;
}
/* 绿色通道:嵌套循环,同步变化亮度 */
for (pulse_green = 0U;
pulse_green <= green_pwm_led.period;
pulse_green += STEP_SIZE) {
ret = pwm_set_pulse_dt(&green_pwm_led,
pulse_green);
if (ret != 0) {
printk("Error %d: green write failed\n",
ret);
return 0;
}
/* 蓝色通道:最内层循环,组合出不同色彩 */
for (pulse_blue = 0U;
pulse_blue <= blue_pwm_led.period;
pulse_blue += STEP_SIZE) {
ret = pwm_set_pulse_dt(&blue_pwm_led,
pulse_blue);
if (ret != 0) {
printk("Error %d: "
"blue write failed\n",
ret);
return 0;
}
/* 每种颜色组合保持1秒 */
k_sleep(K_SECONDS(1));
}
}
}
}
return 0;
}点击项目名旁边的编译、调试按钮,开启编译及下载调试。

点击运行就可以看到就可以看到RGB灯颜色切换了。

运行效果:

我要赚赏金
