Funpack4-3 - 用MAX32655FTHR实现流水灯效果
- 项目描述
本项目基于MAX32655FTHR,利用板载RGB灯实现流水灯功能。
1.1 硬件介绍
MAX32655FTHR 是一款快速开发平台,可帮助工程师使用MAX32655 Arm© Cortex®-M4F和Bluetooth® 5.2低功耗(LE)快速实施超低功耗无线解决方案。该电路板还包括MAX20303 PMIC以实现电池和电源管理。0.9 x 2.6英寸小尺寸双排接头与Adafruit Feather Wing外设扩展板兼容。该电路板包括各种外设,如数字麦克风、低功耗立体声音频编解码器、128MB QSPI闪存、micro SD卡连接器、RGB指示器LED和按钮。MAX32655FTHR提供功率优化的灵活平台,以便进行快速概念验证和早期软件开发,从而加快产品上市。
板卡优势与特点:
ARM Cortex-M4F,100MHz
32位RISC-V协处理器,可减轻时序关键型蓝牙处理负荷
512KB闪存
128KB SRAM
16KB缓存
蓝牙5.2 LE无线电
带电量计的MAX20303可穿戴PMIC
通过USB充电
用于Arm Cortex-M4F的板载DAPLink调试和编程接口
试验板兼容接头
Micro USB连接器
Micro SD卡连接器
集成外设
RGB指示灯LED
用户按钮
低功耗立体声音频编解码器
数字麦克风
SWD调试器
虚拟UART控制台
微控制器:MAX32655
MAX32655微控制器(MCU)是一款先进的片上系统(SoC),采用Arm® Cortex®-M4F CPU,可高效执行复杂的函数和算法计算,额定温度范围为-40°C至+105°C。该SoC将功率调节和管理功能与单电感多输出(SIMO)降压稳压器系统集成于一体。板载新一代蓝牙® 5.2低功耗(LE)无线电,支持远程(编码)和高吞吐量模式以及医疗身体区域网络(MBAN)。该器件提供具有512KB闪存和128KB SRAM的大型板载存储器,并在一个32KB SRAM存储区上提供可选的纠错编码(ECC)功能。该32KB存储区也可保留在BACKUP模式中。提供8KB用户OTP区域。

MAX32655采用81 CTBGA封装(8mm x 8mm,0.8mm间距),支持多种高速外设,例如I2C、50MHz SPI和UART,以及一个用于连接音频编解码器的I2S端口。八路输入、10位ADC可用于监测来自外部模拟源的模拟输入。此外,低功耗UART (LPUART)支持在超低功耗的睡眠模式下工作,有助于在不发生任何数据丢失的情况下进行唤醒。总共提供了六个具有I/O功能的定时器,包括两个低功耗定时器,即使在超低功耗的睡眠模式下也能实现脉冲计数、捕获/比较和脉宽调制(PWM)生成。
特性:
超低功耗无线微控制器
内置100MHz振荡器
具有7.3728MHz系统时钟选项的灵活低功耗模式
512KB闪存和128KB SRAM
一个32KB SRAM存储区上提供可选ECC
16KB指令缓存
蓝牙5.2 LE无线电
专用的超低功耗32位RISC-V协处理器,可减轻时序关键型蓝牙处理负荷
提供完全开源的蓝牙5.2协议栈
支持医疗身体区域网络(MBAN)和Mesh
高吞吐量(2Mbps)模式
远程(125kbps和500kbps)模式
Rx灵敏度:-97dBm;Tx功率:+5.5dBm
单端天线连接(50Ω)
提供电源管理充分延长电池寿命
电源电压范围:2.0V至3.6V
集成SIMO功率调节器
3.0V时的有源电流为12.9μA/MHz
对于32KB,3.0V时的保持电流为1.53μA
低功耗模式下可选择SRAM数据保留功能+RTC
多个外设,用于实施系统控制
多达两个高速SPI控制器/目标
多达三个I2C控制器/目标
多达四个UART
一个I2S控制器/目标
多达8路输入、10位Σ-Δ ADC 7.8ksps
多达四个微功耗比较器
定时器:四个32位、两个低功耗、一个看门狗、一个低功耗看门狗
1-Wire®控制器
多达四个脉冲序列(PWM)引擎
带唤醒定时器的RTC
多达52个GPIO
安全性和完整性
可选安全引导
TRNG Seed发生器
AES 128/192/256硬件加速引擎
板卡引脚图:

板卡框图:

MAX32655FTHR 顶部组件:

MAX32655FTHR 底部组件:

1.2 功能概览
利用MCUGPIO端口P0.18,P0.19,P0.26控制外围D3 RGB 灯顺序开关,形成流水灯效果。

1.3 设计思路
先套用MAX32655 GPIO官方例程,在此基础上增加流水灯效果:RGB LED引脚定义, RGB_LED引脚初始化,定义RGB颜色控制函数, 定义RGB_流水灯函数,使用板载LED驱动函数 运行流水灯1, 启动RGB流水灯2。
2. 功能实现
2.1 软件流程

2.2 实现过程
主要程序代码如下:
// RGB LED引脚定义。
#define RGB_LED_RED_PIN MXC_GPIO_PIN_18
#define RGB_LED_GREEN_PIN MXC_GPIO_PIN_19
#define RGB_LED_BLUE_PIN MXC_GPIO_PIN_26// RGB_LED引脚初始化定义
void RGB_LED_Init(void) {
// 配置红色LED引脚
mxc_gpio_cfg_t led_red = {
.port = MXC_GPIO0,
.mask = RGB_LED_RED_PIN,
.func = MXC_GPIO_FUNC_OUT,
.pad = MXC_GPIO_PAD_NONE,
.vssel = MXC_GPIO_VSSEL_VDDIO
};
MXC_GPIO_Config(&led_red);
// 配置绿色LED引脚
mxc_gpio_cfg_t led_green = {
.port = MXC_GPIO0,
.mask = RGB_LED_GREEN_PIN,
.func = MXC_GPIO_FUNC_OUT,
.pad = MXC_GPIO_PAD_NONE,
.vssel = MXC_GPIO_VSSEL_VDDIO
};
MXC_GPIO_Config(&led_green);
// 配置蓝色LED引脚
mxc_gpio_cfg_t led_blue = {
.port = MXC_GPIO0,
.mask = RGB_LED_BLUE_PIN,
.func = MXC_GPIO_FUNC_OUT,
.pad = MXC_GPIO_PAD_NONE,
.vssel = MXC_GPIO_VSSEL_VDDIO
};
MXC_GPIO_Config(&led_blue);
// 初始状态:所有LED熄灭
MXC_GPIO_OutSet(led_red.port, led_red.mask);
MXC_GPIO_OutSet(led_green.port, led_green.mask);
MXC_GPIO_OutSet(led_blue.port, led_blue.mask);
}
//控制单个LED
void RGB_LED_On(mxc_gpio_regs_t* port, uint32_t mask) {
MXC_GPIO_OutClr(port, mask); // 低电平点亮
}
void RGB_LED_Off(mxc_gpio_regs_t* port, uint32_t mask) {
MXC_GPIO_OutSet(port, mask); // 高电平熄灭
}
// RGB颜色控制1
void Set_RGB_Color(uint8_t red, uint8_t green, uint8_t blue) {
if(red)
RGB_LED_On(MXC_GPIO0, RGB_LED_RED_PIN);
else
RGB_LED_Off(MXC_GPIO0, RGB_LED_RED_PIN);
if(green)
RGB_LED_On(MXC_GPIO0, RGB_LED_GREEN_PIN);
else
RGB_LED_Off(MXC_GPIO0, RGB_LED_GREEN_PIN);
if(blue)
RGB_LED_On(MXC_GPIO0, RGB_LED_BLUE_PIN);
else
RGB_LED_Off(MXC_GPIO0, RGB_LED_BLUE_PIN);
}
// RGB流水灯2
void RGB_Flow_LED(void) {
while(1) {
// 红色亮
Set_RGB_Color(1, 0, 0);
printf(" Red LED on.\n");
delay_ms(3000);
// 绿色亮
Set_RGB_Color(0, 1, 0);
printf(" Green LED on.\n");
delay_ms(3000);
// 蓝色亮
Set_RGB_Color(0, 0, 1);
printf(" Blue LED on.\n");
delay_ms(3000);
// 黄色 (红+绿)
Set_RGB_Color(1, 1, 0);
printf(" Yellow LED on.\n");
delay_ms(3000);
// 青色 (绿+蓝)
Set_RGB_Color(0, 1, 1);
printf(" Indigo LED on .\n");
delay_ms(3000);
// 紫色 (红+蓝)
Set_RGB_Color(1, 0, 1);
printf(" Purple LED on.\n");
delay_ms(3000);
// 白色 (全亮)
Set_RGB_Color(1, 1, 1);
printf(" White LED.\n");
delay_ms(3000);
// 全灭
Set_RGB_Color(0, 0, 0);
printf(" LED off.\n");
delay_ms(3000);
}
}
// main主程序
int main(void)
{
printf("\n\n************************* MAX32655 GPIO and RGB LED ***********************\n\n");
// 初始化GPIO功能
mxc_gpio_cfg_t gpio_in, gpio_out, gpio_interrupt, gpio_interrupt_status;
int counter = 0;
/* Setup input pin. */
gpio_in.port = MXC_GPIO_PORT_IN;
gpio_in.mask = MXC_GPIO_PIN_IN;
gpio_in.pad = MXC_GPIO_PAD_PULL_UP;
gpio_in.func = MXC_GPIO_FUNC_IN;
gpio_in.vssel = MXC_GPIO_VSSEL_VDDIO;
gpio_in.drvstr = MXC_GPIO_DRVSTR_0;
MXC_GPIO_Config(&gpio_in);
/* Setup output pin. */
gpio_out.port = MXC_GPIO_PORT_OUT;
gpio_out.mask = MXC_GPIO_PIN_OUT;
gpio_out.pad = MXC_GPIO_PAD_NONE;
gpio_out.func = MXC_GPIO_FUNC_OUT;
gpio_out.vssel = MXC_GPIO_VSSEL_VDDIO;
gpio_out.drvstr = MXC_GPIO_DRVSTR_0;
MXC_GPIO_Config(&gpio_out);
while (counter<5) {
/* Read state of the input pin. */
if (MXC_GPIO_InGet(gpio_in.port, gpio_in.mask)) {
/* Input pin was high, set the output pin. */
MXC_GPIO_OutSet(gpio_out.port, gpio_out.mask);
} else {
/* Input pin was low, clear the output pin. */
MXC_GPIO_OutClr(gpio_out.port, gpio_out.mask);
}
counter++;
printf("Counter is %d\n",counter);
delay_ms(1000);
}
// 初始化RGB LED
RGB_LED_Init();
printf("Test R\G\B LED one time..\n");
// 使用板载LED驱动函数
LED_On(0); // 红色
LED_Off(1); // 绿色
LED_Off(2); // 蓝色
printf(" R LED on one time\n");
MXC_Delay(2000000);
LED_Off(0); // 红色
LED_On(2); // 蓝色
LED_Off(1); // 绿色
printf("B LED on one time..\n");
MXC_Delay(2000000);
LED_Off(0); // 红色
LED_Off(2); // 蓝色
LED_On(1); // 绿色
printf("G LED one time..\n");
MXC_Delay(2000000);
// 关闭所有LED
LED_Off(0);
LED_Off(1);
LED_Off(2);
printf(" LED off time..\n");
MXC_Delay(2000000);
printf("GPIO demo completed. Starting RGB LED flow pattern...\n");
// 初始化RGB LED
RGB_LED_Init();
// 启动RGB流水灯2
RGB_Flow_LED();
// 程序不会执行到这里,因为RGB_Flow_LED是无限循环
return 0;
}
- 功能展示.




以上是·SSCOM 串口助手上显示RGB LED闪亮状态,以及开发板LED 实拍图片。
- 项目总结
在电子森林这个项目活动中初步学习了maxium SDK 软件的使用,MCU编程方法和步骤,还需要努力学习更多的知识去深入了解MCU编程。