一、项目介绍
本项目使用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语言开发使用情况,其它开发环境方法有所不同,可进一步参考官方开发文档(见第五部分参考资料)。
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 和按钮。下图是板卡引脚图。

做为基本功能验证和上手测试,当然从按键点灯开始,所以先看看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。

按钮
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。比较适合实现功能,便于测试。
1.2 功能概览
从上述硬件电路分析,实现板载按键,控制板卡上的RGB LED的多种不同灯效切换,最简便的电路选择即使用AX32655FTHR开发板板载SW2(BUTTON1)循环切换D1(实际丝印是D3)进行测试,这里测试三种效果模式:
模式0:彩虹效果 - 循环显示7种预定义颜色
模式1:青色呼吸效果 - 青色LED模拟呼吸灯效果
模式2:RGB呼吸效果 - 红绿蓝三色依次呼吸变化
1.3 实现思路
实现上面功能概览的功能,步骤如下:
- 准备硬件和软件环境
- 将MAX32655FTHR开发板与开发主机连接上,并测试官方示例以保证硬件和软件环境功能正常
- 创建新项目并将项目的官方发布包导入(复制)自己的项目中
- 编写三种效果模式代码
- 模式 0 (彩虹效果):循环显示7种颜色,每0.5秒切换一次
- 模式 1 (青色呼吸):青色LED以呼吸方式变化亮度
- 模式 2 (RGB呼吸):红色、绿色、蓝色LED依次以呼吸方式变化亮度
- 完成所有配置后,调试并测试功能完整并正确显示,并烧录生成的固件。
二、功能实现
2.1 开发环境搭建
对于初次使用MSDK,还是建议仔细查阅官方文档稳妥一些,开发环境搭建详见官方用户手册https://analogdevicesinc.github.io/msdk/USERGUIDE/,这里就在Windows 10系统下针对MSDK的安装、设置和VScode环境关键环节说明如下:
2.1.1 MSDK安装
在Windows 10系统下安装要具有管理员权限。从安装程序下载链接中选择Windows 10。我是使用图形化安装,和一般安装程序差别不大。建议安装所有组件,并记下安装路径。安装完成后会看到安装目录中的MSDK,建议先将示例程序先备份保存一份。
2.1.2 Visual Studio Code安装配置
下载并安装适用于您操作系统的 Visual Studio Code后,以下设置每次安装需完成一次。
- 启动 Visual Studio Code。
- 安装 Microsoft C/C++ 扩展程序。
- 安装 Cortex-Debug 扩展程序。
- 使用CTRL + SHIFT + P打开开发者提示。
- 输入“open user settings”并选择“Preferences: Open User Settings (JSON)打开用户设置(JSON)”选项。
将下面的条目添加到用户 settings.json 文件中。// There may be other settings up here...
⚠️ 设置 MAXIM_PATH
"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选择MSDK 安装的绝对路径。 例如在 Windows中可以将"MAXIM_PATH": 这一行修改成前面安装MSDK的路径"MAXIM_PATH":"C:/MaximSDK"
"update.mode: "manual"和"extensions.autoUpdate": false分别禁用 VSCode及其扩展的自动更新。这是一个可选的(官方推荐)新增功能,是VSCode早期保留下来的。 - 将更改保存CTRL + S到文件中并重新启动VSCode。
2.1.3 创建自己的项目
创建新项目可以有多种方法,这里使用官方文档中推荐的复制预制项目的方法创建。在MSDK 中位于Tools/VSCode-Maxim包含一个New_Project文件夹,我们可以复制这个项目模板来开发。此外,任何使用VSCode的示例项目都可以从MSDK复制。
- 将现有项目文件夹复制到新项目的所在文件夹内,注意项目的完整路径不得有任何空格。
- 可以重命名文件夹。例如,我将文件夹重命名为LEDBlink。
- 在VSCode中打开项目(File -> Open Folder...)
- 正确设置配置变量:目标微控制器和开发板参数。此次使用MAX32655FTHR,则目标微控制器为 MAX32655,板级支持文件为FTHR_Apps_P1。在 VS Code 中,这是通过编辑完成.vscode/settings.json文件并设置“target”和"board"项目配置选项。
注意,当更改这个选项时,通常最好先彻底清理项目,然后再重构项目。 - 重新加载 VSCode窗口。更改任何settings.json选项后需要重新加载以强制其重新索引 VSCode 引擎。也可以通过CTRL+SHIFT+P -> Reload Window重新解析项目设置。
- 上述工作完成后开发环境已准备就绪,可进行程序构建、调试和修改。
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 呼吸效果。
程序的主要结构:
- 初始化阶段:设置全局变量、打印信息、初始化LED和按钮
- 主循环结构:无限循环,包含按钮检测和效果执行两个主要部分
- 按钮检测逻辑:检测按钮释放事件,切换效果模式,防止抖动
- 效果执行:根据当前模式执行不同的LED效果
- 三种效果模式:
- 模式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_On 和 LED_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效果
三、功能展示

这个程序很好地展示了如何使用 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)