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

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来完成任务,软件功能方面,我们只需要进行接口的初始化,然后进行颜色的切换就可以,具体流程图如下:
在这里,我们使用的主要是外部中断以及定时器中断配合着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;
}
}
}
四、功能展示
我们一起来看一下操作以及颜色切换:

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