一、硬件介绍:
MAX32690EVKIT 是 ADI 推出的一款全能型评估板,核心搭载了 MAX32690 微控制器。主控是 120MHz 的 Arm Cortex-M4F,带有一个独立的 RISC-V 协处理器专门负责低功耗后台任务,能很好地兼顾性能和省电。板载了完整的蓝牙 5.2 LE 射频模块,接口方面不仅支持常规的 USB 和 GPIO,还直接引出了 CAN 总线接口,可以直接对接工业现场设备。板子上直接焊了一颗 1.45 英寸的彩色 TFT 屏,配有立体声编解码器和 3.5mm 耳机孔,板载 64Mb HyperRAM,配合芯片自带的 1MB 内存,板子的可玩性极高。
二、任务选择:
选择了任务1:按键控制LED闪烁
基础题目: 使用 MAX32690EVKIT 的板载按键功能,实现以下逻辑:单次按键 → LED开始闪烁;再次按键 → LED停止闪烁
功能要求:
正确初始化 GPIO 中断
LED 控制逻辑清晰,不出现误触发
闪烁频率约 1Hz
进阶题目: 在基础题之上,实现长按按键调节LED闪烁频率功能。
功能要求:
短按:LED 闪烁 开启/关闭
长按:连续调节闪烁频率
频率从"1Hz → 5Hz"线性变化
当到达最快后,保持长按可实现"5Hz → 1Hz"反向变化
按上面的逻辑循环
频率变化过程应平滑(无明显跳变)
三、设计思路:

系统上电后,初始化GPIO,串口和中断,中断使用上下沿都触发的方式。当按键按下、松开记录下按键时长,根据时长来判断按键是长按、还是短按。短按则控制LED灯是否闪烁,长按则切换LED灯闪烁的频率。并在串口输出当前的状态信息,用于监控系统运行。
参考着官方的电路图,可以看见板载有两个LED灯,还有一个按键。按键连接着P4.0的排针,需要额外使用杜邦线连接到MCU的P2.11管脚上去。


四、任务实现:
开发工具使用官方提供的MaximMicrosSDK。参考着官方例程“hello world”和“GPIO”两个例程进行开发。

初始化按键GPIO,添加中断,让按键上下沿均触发中断。
mxc_gpio_cfg_t gpio_interrupt;
gpio_interrupt.port = MXC_GPIO_PORT_IN;
gpio_interrupt.mask = MXC_GPIO_PIN_IN;
gpio_interrupt.pad = MXC_GPIO_PAD_PULL_UP;
gpio_interrupt.func = MXC_GPIO_FUNC_IN;
gpio_interrupt.vssel = MXC_GPIO_VSSEL_VDDIOH;
gpio_interrupt.drvstr = MXC_GPIO_DRVSTR_0;
MXC_GPIO_Config(&gpio_interrupt);
// 回调传参匹配 void (*)(void *)
MXC_GPIO_RegisterCallback(&gpio_interrupt, gpio_callback, NULL);
// 双边沿中断:按下/松开都触发
MXC_GPIO_IntConfig(&gpio_interrupt, MXC_GPIO_INT_BOTH);
MXC_GPIO_EnableInt(gpio_interrupt.port, gpio_interrupt.mask);
int irq_num = MXC_GPIO_GET_IRQ(MXC_GPIO_GET_IDX(MXC_GPIO_PORT_IN));
// 修复:强制转换为uint32_t指针地址
NVIC_SetVector(irq_num, (uint32_t)MXC_GPIO_Handler);
NVIC_EnableIRQ(irq_num);
定义按键状态机,添加中断回调函数,当中断事件触发时,做按键消抖,并改变按键状态机的状态。
void gpio_callback(void *cbdata)
{
static uint32_t last_int_ms = 0;
// 简易消抖
MXC_Delay(MXC_DELAY_MSEC(DEBOUNCE_MS));
last_int_ms += DEBOUNCE_MS;
key_changed = true;
}
在main方法中,使用轮询方式检查按键状态机是否有按键中断发生。一旦有按键事件发生,通过按键管脚电平判断是按下还是弹起,记录按键按下的时长。通过时长判断是短按还是长按。通过不同的按键动作来改变LED灯闪烁的状态或频率。
while (1)
{
// 检测按键电平变化中断标记
if (key_changed)
{
key_changed = false;
bool pin_low = (MXC_GPIO_InGet(MXC_GPIO_PORT_IN, MXC_GPIO_PIN_IN) == 0);
if (pin_low && !key_is_down)
{
// 按键按下,清零计时
key_is_down = true;
hold_time = 0;
}
else if (!pin_low && key_is_down)
{
// 按键松开,判断长短按
key_is_down = false;
if (hold_time < LONG_PRESS_MS)
{ // 短按
ledstat = !ledstat;
if (!ledstat)
printf("LED blink OFF\n");
else
printf("LED blink ON\n");
}
else
{ // 长按
ledtimes += ledstep;
if (ledtimes == 5)
ledstep = -1;
if (ledtimes == 1)
ledstep = 1;
printf("Change LED blink %d Hz\n", ledtimes);
}
}
}
// 按键按住时持续累加计时
if (key_is_down)
{
hold_time += 10;
}
MXC_Delay(LOOP_DELAY);
ledsleepcount++; // led闪烁计数
// printf("LED toggle %d %d\n", ledsleepcount,ledstat);
if (ledstat)
{
if (100 / ledtimes <= ledsleepcount)
{
ledsleepcount = 0;
LED_Toggle(LED_RED);
LED_Toggle(LED_GREEN);
}
}
}
五、效果展示:
可以通过串口观察当前系统状态。



六、心得体会:
感谢得捷和硬禾科技。MAX32690EVKIT这块开发板功能很强大,感觉MAX系列的开发板在编程开发方面一致性做得还是挺不错的,再加上老师的指导视频做得非常细致,开发板学习过程变得非常有趣。期待下次活动。