Funpack4-3 基于MAX32655FTHR快速开发平台的灯效测试总结报告
该项目使用了MAX32655FTHR,实现了灯效测试的设计,它的主要功能为:彩虹效果 、青色呼吸效果 和RGB呼吸效果。
标签
MAX32655FTHR
灯效
都市木头
更新2026-02-25
17

一、项目介绍

本项目使用MAX32655FTHR快速开发平台板载按键,控制板卡上的RGB LED,实现多种不同灯效切换(颜色切换、彩虹灯效、呼吸灯),通过测试了解美信SDK开发包(MSDK)基本使用和MAX32655FTHR快速开发平台基本功能验证。MSDK开发包支持多个操作系统(Windows(Windows10 )、Linux(Ubuntu)、MacOS)和MAX32xxx 和 MAX78xxx系列多型号微控制器和评估平台,支持在多种开发环境(Visual Studio Code、Eclipse IDE、IAR Embedded Workbench、Keil MDK以及三种操作系统中的命令行)下的开发使用,支持C/C++及汇编语言的开发。此次测试仅记录了在Windows 10系统下针对MAX32655FTHR的MSDK的安装、设置和VScode环境下的C语言开发使用情况,其它开发环境方法有所不同,可进一步参考官方开发文档(见第五部分参考资料)。


图片.png

1.1 硬件介绍

MAX32655FTHR 是一个快速开发平台,旨在帮助工程师使用 MAX32655 Arm® Cortex®-M4F 和蓝牙® 5.2 低功耗(LE)模块快速实现超低功耗无线解决方案。该板还集成了 MAX20303 PMIC 用于电池和电源管理。其外形尺寸为 0.9 英寸 × 2.6 英寸,采用双排插头封装,兼容 Adafruit Feather Wing 外设扩展板。该板包含多种外设,如数字麦克风、低功耗立体声音频 CODEC、128MB QSPI Flash、micro SD 卡接口、RGB 指示灯 LED 和按钮。下图是板卡引脚图。

图片.png

做为基本功能验证和上手测试,当然从按键点灯开始,所以先看看MAX32655FTHR 板上有哪些可用资源。

LED 指示灯

MAX32655FTHR 板上有三个 RGB LED:

  • D1:连接至 MAX32655FTHR 的 GPIO 引脚。此 LED 可由用户固件控制。其中,Port 0.18:红色;Port 0.19:绿色;Port 0.26:蓝色
  • D2:连接至 MAX20303 PMIC 的 LEDx 输出端口。这些 LED 可通过 I²C 命令进行控制,也可以通过发送 I²C 命令配置为充电状态指示灯。
  • D3:DAPLink 适配器(MAX32625)的状态 LED。由 DAPLink 适配器控制,不可用作用户 LED

可以看出,D1连接至 MAX32655FTHR 的 GPIO 引脚。此 LED 可由用户固件控制,比较适合实现功能,便于测试。

另外,在测试时查找电路图发现说明中D1实际丝印是D3

图片.png

按钮

MAX32655FTHR 板上有六个按钮:

  • SW1 PMIC 电源按钮,当板处于通电状态时,按压 12 秒执行硬关机;当板处于断电状态时,按压启动板;此按钮也可被 MAX32655 固件读取,PMIC_PFN2 信号连接至 Port 0.13,是按钮状态的缓冲输入。当按钮按下时,该信号变为低电平。
  • SW2 用户可编程功能按钮,连接至 MAX32655 Port 0.2,通过去抖 IC。
  • SW3 用户可编程功能按钮,连接至 MAX32655 Port 0.3,通过去抖 IC。
  • SW4 唤醒按钮,连接至 MAX32655 Port 3.1。
  • SW5 重置 MAX32655,通过 MAX32655 的 RSTN 输入。
  • SW6 DAPLink 适配器按钮。在为板子上电时按住此按钮,可将板上的 DAPLink 适配器置于 MAINTENANCE 模式,用于更新 DAPLink 固件。

可以看出,SW2(BUTTON1) 用户可编程功能按钮,连接至 MAX32655 Port 0.2。比较适合实现功能,便于测试。

图片.png

1.2 功能概览

从上述硬件电路分析,实现板载按键,控制板卡上的RGB LED的多种不同灯效切换,最简便的电路选择即使用AX32655FTHR开发板板载SW2(BUTTON1)循环切换D1(实际丝印是D3)进行测试,这里测试三种效果模式:
模式0:彩虹效果 - 循环显示7种预定义颜色
模式1:青色呼吸效果 - 青色LED模拟呼吸灯效果
模式2:RGB呼吸效果 - 红绿蓝三色依次呼吸变化

1.3 实现思路

实现上面功能概览的功能,步骤如下:

  1. 准备硬件和软件环境
  2. MAX32655FTHR开发板与开发主机连接上,并测试官方示例以保证硬件和软件环境功能正常
  3. 创建新项目并将项目的官方发布包导入(复制)自己的项目中
  4. 编写三种效果模式代码
    • 模式 0 (彩虹效果):循环显示7种颜色,每0.5秒切换一次
    • 模式 1 (青色呼吸):青色LED以呼吸方式变化亮度
    • 模式 2 (RGB呼吸):红色、绿色、蓝色LED依次以呼吸方式变化亮度
  5. 完成所有配置后,调试并测试功能完整并正确显示,并烧录生成的固件。

二、功能实现

2.1 开发环境搭建

对于初次使用MSDK,还是建议仔细查阅官方文档稳妥一些,开发环境搭建详见官方用户手册https://analogdevicesinc.github.io/msdk/USERGUIDE/,这里就在Windows 10系统下针对MSDK的安装、设置和VScode环境关键环节说明如下:

2.1.1 MSDK安装

在Windows 10系统下安装要具有管理员权限。从安装程序下载链接中选择Windows 10。我是使用图形化安装,和一般安装程序差别不大。建议安装所有组件,并记下安装路径。安装完成后会看到安装目录中的MSDK,建议先将示例程序先备份保存一份。

图片.png

2.1.2 Visual Studio Code安装配置

下载并安装适用于您操作系统的 Visual Studio Code后,以下设置每次安装需完成一次。

  1. 启动 Visual Studio Code。
  2. 安装 Microsoft C/C++ 扩展程序。
  3. 安装 Cortex-Debug 扩展程序。
  4. 使用CTRL + SHIFT + P​打开开发者提示。
  5. 输入“open user settings”并选择“Preferences: Open User Settings (JSON)打开用户设置(JSON)”选项。
    将下面的条目添加到用户 settings.json 文件中。
    // There may be other settings up here...

    "MAXIM_PATH": "Change me! Only use forward slashes (/) for this path",
    "update.mode": "manual",
    "extensions.autoUpdate": false,

    // There may be other settings down here...
    ⚠️ 设置 MAXIM_PATH
    设置MAXIM_PATH​选择MSDK 安装的绝对路径。 例如在 Windows中可以将"MAXIM_PATH": 这一行修改成前面安装MSDK的路径"MAXIM_PATH":"C:/MaximSDK"
    "update.mode: "manual"​和"extensions.autoUpdate": false​分别禁用 VSCode及其扩展的自动更新。这是一个可选的(官方推荐)新增功能,是VSCode早期保留下来的。
  6. 将更改保存CTRL + S​到文件中并重新启动VSCode。


2.1.3 创建自己的项目

创建新项目可以有多种方法,这里使用官方文档中推荐的复制预制项目的方法创建。在MSDK 中位于Tools/VSCode-Maxim​包含一个New_Project​文件夹,我们可以复制这个项目模板来开发。此外,任何使用VSCode的示例项目都可以从MSDK复制。

  1. 将现有项目文件夹复制到新项目的所在文件夹内,注意项目的完整路径不得有任何空格。
  2. 可以重命名文件夹。例如,我将文件夹重命名为LEDBlink​。
  3. 在VSCode中打开项目(File -> Open Folder...​)
  4. 正确设置配置变量:目标微控制器和开发板参数。此次使用MAX32655FTHR,则目标微控制器为 MAX32655,板级支持文件为FTHR_Apps_P1。在 VS Code 中,这是通过编辑完成.vscode/settings.json​文件并设置“target”和"board"项目配置选项。
    图片.png注意,当更改这个选项时,通常最好先彻底清理项目,然后再重构项目。
  5. 重新加载 VSCode窗口。更改任何settings.json选项后需要重新加载以强制其重新索引 VSCode 引擎。也可以通过CTRL+SHIFT+P -> Reload Window​重新解析项目设置。
  6. 上述工作完成后开发环境已准备就绪,可进行程序构建、调试和修改。

2.2软件流程结构图

下面的结构图显示程序的层次结构

主程序 (main)
├── 初始化
│ ├── 全局变量初始化
│ ├── 串口输出
│ ├── LED初始化
│ └── 按钮初始化
└── 主循环
├── 按钮检测与处理
│ ├── 状态检测 (PB_Get)
│ ├── 边沿检测
│ ├── 模式切换
│ └── 按钮消抖
└── LED效果执行
├── 模式0: rainbow_effect
│ ├── set_rgb_color
│ └── color_index管理
├── 模式1: breathing_effect
│ ├── 亮度计算
│ ├── 时间控制
│ └── breath_counter管理
└── 模式2: rgb_breathing_effect
├── 位置计算
├── 亮度计算
├── 颜色切换
└── rgb_breath_pos管理

2.3主要代码片段及说明

下面详细说明代码的各个部分:

2.3.1. 代码概述

这个程序演示了如何通过按钮控制 RGB LED 的三种不同效果:彩虹效果、青色呼吸效果和 RGB 呼吸效果。

程序的主要结构:

  1. 初始化阶段:设置全局变量、打印信息、初始化LED和按钮
  2. 主循环结构:无限循环,包含按钮检测和效果执行两个主要部分
  3. 按钮检测逻辑:检测按钮释放事件,切换效果模式,防止抖动
  4. 效果执行:根据当前模式执行不同的LED效果
  5. 三种效果模式
    • 模式0:彩虹效果 - 循环显示7种预定义颜色
    • 模式1:青色呼吸效果 - 青色LED模拟呼吸灯效果
    • 模式2:RGB呼吸效果 - 红绿蓝三色依次呼吸变化

程序通过逻辑编号(BUTTON 0、RGB_LED_RED等)访问硬件,实际的物理引脚映射由BSP底层实现,实现了硬件抽象和可移植性。

2.3.2. 头文件和定义

#include <stdio.h>
#include <stdint.h>
#include "mxc_device.h"
#include "led.h"
#include "pb.h"
#include "board.h"
#include "mxc_delay.h"

#define RGB_LED_RED 0 // 红色LED引脚
#define RGB_LED_GREEN 1 // 绿色LED引脚
#define RGB_LED_BLUE 2 // 蓝色LED引脚
#define BUTTON 0 // 按钮引脚
  • 必要的头文件包含:
    • stdio.h​ - 标准输入输出库,用于printf函数
    • stdint.h​ - 标准整数类型定义库
    • mxc_device.h​ - Maxim设备特定的定义
    • led.h​ - LED控制API定义
    • pb.h​ - Push Button(按钮)API定义
    • board.h​ - 板级支持包定义
    • mxc_delay.h​ - 延时函数API定义
  • 宏定义定义了RGB LED的三个颜色组件和按钮的逻辑编号:
    • RGB_LED_RED​ 为0,代表红色LED组件
    • RGB_LED_GREEN​ 为1,代表绿色LED组件
    • RGB_LED_BLUE​ 为2,代表蓝色LED组件
    • BUTTON​ 为0,代表使用第一个按钮

2.3.3. 全局变量

int effect_mode = 0;        // 效果模式:0-彩虹,1-青色呼吸,2-RGB呼吸
int color_index = 0; // 当前颜色索引
int breath_counter = 0; // 呼吸效果计数器
int rgb_breath_pos = 0; // RGB呼吸位置

// 预定义的颜色组合
int color_cycle[7][3] = {
{1, 0, 0}, // 红色
{0, 1, 0}, // 绿色
{0, 0, 1}, // 蓝色
{1, 1, 1}, // 白色
{0, 1, 1}, // 青色
{1, 0, 1}, // 品红
{1, 1, 0} // 黄色
};
  • 全局变量,用于跟踪程序状态:
    • effect_mode​ - 当前LED效果模式,0为彩虹效果,1为青色呼吸效果,2为RGB呼吸效果
    • color_index​ - 颜色循环中的当前索引
    • breath_counter​ - 呼吸效果计数器
    • rgb_breath_pos​ - RGB呼吸效果的位置
  • 定义了一个颜色循环数组,包含7种颜色,每种颜色由RGB三个分量组成,1表示开启,0表示关闭

2.3.4. 核心函数功能

set_rgb_color 函数

控制 RGB LED 的颜色,通过 LED_OnLED_Off 函数分别控制红、绿、蓝三个颜色分量的开关。

  • set_rgb_color​函数:根据输入的红、绿、蓝参数值控制RGB LED的各颜色组件,1为开启,0为关闭
// Rainbow effect - cycle through colors smoothly
void rainbow_effect(void) {
// Simple rainbow effect by cycling through predefined colors
set_rgb_color(color_cycle[color_index][0],
color_cycle[color_index][1],
color_cycle[color_index][2]);

// Update color index
color_index = (color_index + 1) % 7;
}
rainbow_effect 函数

实现彩虹效果,循环显示预定义的7种颜色。每次调用时切换到下一个颜色,通过 color_index 变量跟踪当前颜色。

  • rainbow_effect​函数:彩虹效果,循环显示预定义的7种颜色,每次调用切换到下一个颜色
// Breathing effect - cyan color breathing
void breathing_effect(void) {
breath_counter++;

// Calculate brightness based on triangle wave (0-100)
int brightness;
if (breath_counter < 50) {
brightness = breath_counter * 2; // 0 to 100
} else if (breath_counter < 100) {
brightness = 100 - ((breath_counter - 50) * 2); // 100 to 0
} else {
breath_counter = 0;
brightness = 0;
}
breathing_effect 函数

实现青色呼吸效果,模拟呼吸灯效果。通过改变亮灭时间比例来模拟亮度变化,形成从暗到亮再到暗的循环效果。

  • breathing_effect​函数:青色呼吸效果,通过计算亮度值模拟呼吸灯效果
  • breath_counter++​:计数器递增
  • 亮度计算:前50步线性增加(0到100),后50步线性减少(100到0),形成三角波
    // Calculate on/off time based on brightness
int on_time = brightness * 10000 / 100;
int off_time = 20000 - on_time;

if (on_time > 0) {
set_rgb_color(0, 1, 1); // Cyan
MXC_Delay(on_time);
}

if (off_time > 0) {
set_rgb_color(0, 0, 0); // Off
MXC_Delay(off_time);
}
  • 根据亮度值计算LED开启和关闭的时间
  • on_time​:开启时间,与亮度成正比
  • off_time​:关闭时间,与亮度成反比
  • 通过控制开/关时间比例模拟亮度变化
    // Slow down breathing effect
if (breath_counter % 10 == 0) {
MXC_Delay(1000);
}
} // Added missing closing brace for breathing_effect function
  • 每10个步骤增加额外延时,减缓呼吸效果速度
// RGB breathing effect - cycle through R, G, B breathing
void rgb_breathing_effect(void) {
// Each color gets 100 steps, so full cycle is 300 steps
int color_idx = rgb_breath_pos / 100; // 0=R, 1=G, 2=B
int pos_in_cycle = rgb_breath_pos % 100;
rgb_breathing_effect 函数

实现 RGB 呼吸效果,红、绿、蓝三种颜色依次进行呼吸效果,每个颜色有100个步骤,总共300个步骤的循环。

  • rgb_breathing_effect​函数:RGB呼吸效果,红、绿、蓝三色依次呼吸
  • 每种颜色分配100步,总共300步一个循环
  • color_idx​:当前颜色索引(0=红,1=绿,2=蓝)
  • pos_in_cycle​:当前颜色循环内的位置
    // Calculate brightness based on position in the 100-step cycle
int brightness;
if (pos_in_cycle < 50) {
brightness = pos_in_cycle * 2; // 0 to 100
} else {
brightness = 100 - ((pos_in_cycle - 50) * 2); // 100 to 0
}
  • 计算亮度值,前50步增加(0到100),后50步减少(100到0)
    // Set the appropriate color with calculated brightness
int r = 0, g = 0, b = 0;
if (color_idx == 0) r = brightness > 0 ? 1 : 0; // Red breathing
else if (color_idx == 1) g = brightness > 0 ? 1 : 0; // Green breathing
else b = brightness > 0 ? 1 : 0; // Blue breathing

set_rgb_color(r, g, b);
  • 根据当前颜色索引设置对应颜色的呼吸效果
    // Delay based on brightness for breathing effect
int on_time = brightness * 1000 / 100;
int off_time = 1000 - on_time;

if (on_time > 0) {
// Turn on the appropriate color
if (color_idx == 0) set_rgb_color(1, 0, 0); // Red
else if (color_idx == 1) set_rgb_color(0, 1, 0); // Green
else set_rgb_color(0, 0, 1); // Blue

MXC_Delay(on_time);
}

if (off_time > 0) {
set_rgb_color(0, 0, 0); // Off
MXC_Delay(off_time);
}
  • 根据亮度值控制LED的开/关时间,模拟呼吸效果
    // Move to next position in RGB breathing cycle
rgb_breath_pos = (rgb_breath_pos + 1) % 300;

// Slow down breathing effect
MXC_Delay(5000);
}
  • 更新RGB呼吸循环位置,当达到300时重置为0
  • 添加额外延时,减缓呼吸效果速度
2.3.5. main 函数工作流程
// *****************************************************************************
int main(void)
{
int btn_pressed = 0;
int prev_btn_state = 1; // Start with 1 (button not pressed)
  • 主函数开始,定义局部变量
  • btn_pressed​:当前按钮状态
  • prev_btn_state​:前一次按钮状态,初始化为1(未按下状态)
    printf("RGB LED Control Example!\n");
printf("Press button to switch between effects\n");
  • 输出欢迎信息到串口
    // Initialize all LEDs to off state
set_rgb_color(0, 0, 0);

// Initialize button
PB_Init();
  • 将所有LED初始化为关闭状态
  • 初始化按钮
    while (1) {
// Check button state
btn_pressed = PB_Get(BUTTON);

// Detect button release (was pressed, now released)
if (prev_btn_state == 0 && btn_pressed == 1) {
// Button was pressed, wait for release
while(PB_Get(BUTTON) == 1);
  • 主循环,无限循环
  • 检查按钮状态
  • 检测按钮释放事件(之前是按下状态,现在是释放状态)
  • 等待按钮完全释放
            // Toggle effect mode (0, 1, or 2)
effect_mode = (effect_mode + 1) % 3;

if (effect_mode == 0) {
printf("Effect: Rainbow\n");
} else if (effect_mode == 1) {
printf("Effect: Cyan Breathing\n");
} else {
printf("Effect: RGB Breathing\n");
}
  • 切换效果模式(0到2之间循环)
  • 打印当前效果模式到串口
            // Brief delay to prevent accidental double detection
MXC_Delay(200000);
}
prev_btn_state = btn_pressed;
  • 短暂延时,防止按钮抖动导致的重复检测
  • 更新前一次按钮状态
        switch (effect_mode) {
case 0: // Rainbow effect
rainbow_effect();
MXC_Delay(500000); // Delay 0.5 seconds between color changes
break;

case 1: // Cyan breathing effect
breathing_effect();
break;

case 2: // RGB breathing effect
rgb_breathing_effect();
break;
}
}
}
  • 根据当前效果模式执行对应的效果函数
  • 彩虹效果:每次切换颜色后延时0.5秒
  • 青色呼吸效果和RGB呼吸效果:使用各自函数内部的延时控制
  • 循环执行,形成连续的LED效果

三、功能展示

IMG_20260104_005850.jpg

这个程序很好地展示了如何使用 MAX32655 微控制器进行基本的外设控制,包括 LED 控制和按钮检测,是MAX32655 微控制器嵌入式开发的一个很好的入门示例。

主要有以下技术特点:

  • 使用 MAX32655 微控制器的 GPIO 控制 LED
  • 使用按钮中断方式检测用户输入
  • 通过延时函数控制 LED 效果的时间间隔
  • 实现了三种不同的视觉效果算法
  • 具有防抖动机制,避免按钮误触发

四、总结

4.1 遇到的问题

1、容易把32655 和32665混淆,开始以为是编译环境设置问题,后来发现是误操作了不一致的文件夹。

2、在尝试使用GDB烧录程序到MAX32655开发板时遇到了问题。错误信息显示找不到可执行文件,构建的ELF文件不存在。Makefile显示这是一个MAX32655的项目,默认BOARD是EvKit_V1。解决办法是要么修改默认BOARD是FTHR_Apps_P1​,要么在project.mk文件中设定BOARD ?= FTHR_Apps_P1​。

3、MAX32655FTHR开发板板载RGBLED中的丝印有错误,D1实际丝印是D3,经过电路图对比后才发现该问题。

4.2 心得体会

这次选择VSCode作为开发环境,本来感觉点灯会很容易上手,谁知一开始环境配置就出了难题,最后只能老老实实查看MSDK用户文档,先实现官方例程的烧录,然后使用模板进行了初步开发,所以一个新的设备的开发环境搭建非常重要,MSDK的依赖性还是比较大的,本来想时间延长了还可以更进一步上显示器,折腾了一段时间只能先实现了点灯。部分功能比如呼吸效果先想找资料看看有没有经验借鉴,后来也是用AI辅助进行了开发,不过觉得AI在编程学习方面确实方面,只要问题问的好,经过多轮询问,几乎都能实现自己需要的答案。

五、参考资料

1、MSDK用户文档Analog Devices MSDK Documentation

2、MAX32655FTHR 数据手册:Evaluation Kit for the MAX32655 Data Sheet (Rev. 0)

附件下载
LEDBlink.rar
vscode 文件
LEDBlink.elf
LEDBlink.elf
团队介绍
个人
评论
0 / 100
查看更多
硬禾服务号
关注最新动态
0512-67862536
info@eetree.cn
江苏省苏州市苏州工业园区新平街388号腾飞创新园A2幢815室
苏州硬禾信息科技有限公司
Copyright © 2024 苏州硬禾信息科技有限公司 All Rights Reserved 苏ICP备19040198号