Funpack4-3 基于MAX32655的RGB闪烁效果切换
该项目使用了MAX32655,实现了RGB闪烁效果切换的设计,它的主要功能为:通过按键进行RGB闪烁效果切换切换。
标签
RGB
MAX32655
Funpack4-3
无言的朝圣
更新2026-02-05
46

一、项目描述

本次活动使用的是MAX32655的开发板实现的最原始的任务点灯。使用板载按键控制板卡上的RGB LED,并实现一种或多种不同灯效切换。这里我们主要是使用板载的两个用户按键实现RGBblink的切换。具体来说,通过编写程序,利用开发板上的硬件资源,我们可以让RGB LED灯进行颜色切换,执行另一种颜色进行blink。通过按键触发,让RGB LED灯依次显示红、绿、蓝三种颜色,一个按键执行正向切换,一个按键实现反向切换。主要是通过这种方式展示开发板的基本功能,激发对嵌入式系统编程的兴趣和创造力。

二、硬件介绍
image.png

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提供功率优化的灵活平台,以便进行快速概念验证和早期软件开发,从而加快产品上市。

三、软件流程及代码说明

软件流程图:

本次的项目实现没有额外的其他硬件,只是使用了本开发板的按键和rgb来完成任务,软件功能方面,我们只需要进行接口的初始化,然后进行颜色的切换就可以,具体流程图如下:


0

在这里,我们使用的主要是外部中断以及定时器中断配合着while进行的处理,其中,定时器中断会改变颜色效果的变量,然后在while中发现改变效果后进行切换每按键一次只执行切换一次,blink采用的是定时器的方式进行执行,非阻塞。

要想实现LED是连续翻转,我们需要选择定时器为Counter Mode,初始化配置的一般流程如下:

1.关闭定时器

2.设置预缩放值

3.配置定时器为连续模式

4. 设置极性、定时器参数

5. 启用定时器

为此我们参考例程定时器初始化内容如下:

void BasicTimerInit()
{
// Declare variables
mxc_tmr_cfg_t tmr;
uint32_t periodTicks = MXC_TMR_GetPeriod(Basic_TIMER, Basic_CLOCK_SOURCE, 128, Basic_FREQ);

/*
Steps for configuring a timer for PWM mode:
1. Disable the timer
2. Set the prescale value
3 Configure the timer for continuous mode
4. Set polarity, timer parameters
5. Enable Timer
*/

MXC_TMR_Shutdown(Basic_TIMER);

tmr.pres = TMR_PRES_128;
tmr.mode = TMR_MODE_CONTINUOUS;
tmr.bitMode = TMR_BIT_MODE_16A;
tmr.clock = Basic_CLOCK_SOURCE;
tmr.cmp_cnt = periodTicks; //SystemCoreClock*(1/interval_time);
tmr.pol = 0;

if (MXC_TMR_Init(Basic_TIMER, &tmr, false) != E_NO_ERROR) {
printf("Failed Continuous timer Initialization.\n");
return;
}

MXC_NVIC_SetVector(TMR3_IRQn, BasicTimerHandler);
NVIC_EnableIRQ(TMR3_IRQn);
MXC_TMR_EnableInt(Basic_TIMER);
printf("Continuous timer started.\n");
MXC_TMR_Start(Basic_TIMER);
}

中断处理内容如下:

void BasicTimerHandler()
{
// Clear interrupt
MXC_TMR_ClearFlags(Basic_TIMER);
LED_Toggle(LEDSt);
}

外部中断中继续颜色切换:


void SW1_Callback()
{
key_cnt++;
printf("timer sys state: %d\n",MXC_TMR_GetCount(Basic_TIMER));
printf("key1!\n");
// PB_RegisterCallback(SW1, NULL);
}
void SW2_Callback()
{
key_cnt--;
printf("key2!\n");
// PB_RegisterCallback(SW2, NULL);
}

// *****************************************************************************
int main(void)
{
PB_RegisterCallback(SW1, SW1_Callback);
PB_IntEnable(SW1);
PB_RegisterCallback(SW2, SW2_Callback);
PB_IntEnable(SW2);

BasicTimerInit();

printf("The program starts running!\n");

while (1) {

MXC_Delay(1);
if(key_cnt != key_cnt_old) {
LED_Off(LED_RED);
LED_Off(LED_GREEN);
LED_Off(LED_BLUE);
switch(key_cnt%3) {
case 0:
LED_On(LED_RED);
LEDSt = LED_RED;
printf("LED_RED blink %d\n", key_cnt);
break;
case 1:
LED_On(LED_GREEN);
LEDSt = LED_GREEN;
printf("LED_GREEN blink %d\n", key_cnt);
break;
case 2:
LED_On(LED_BLUE);
LEDSt = LED_GREEN;
printf("LED_BLUE blink %d\n", key_cnt);
break;
default:
break;
}
key_cnt_old = key_cnt;
}
}
}

四、功能展示

我们一起来看一下操作以及颜色切换:

我们设置了一些串口打印用于状态指示,可以看到串口发送情况如下:
0

五、心得体会

随着活动的不断进行,官方也为了大家考虑,添加了本次的任务点灯,当然我们也不是只是简单的运行demo而是进行了一些功能上的扩展,比如我们加入了按键,两个按键来分别控制颜色变化的方向,我们的历程一开始是基于hello world的历程进行的,例程是通过在while中通过延时的方法实现的阻塞点灯,这里我们也进行了一下扩展,通过定时器的方式实现非阻塞点灯的效果,同时通过按键来切换颜色以达到对这个开发板的使用。非常感谢电子森林提供的本次的体验,确实不同的开发板都有不同的开发方式和实现效果,每个板子都是有各自的特点,我们多接触一点,对我们日后的应用还是非常有帮助的。

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