Funpack5-3 - 用MAX32690EVKIT实现LED控制
该项目使用了MAX32690EVKIT,实现了按键控制LED灯的闪烁的设计,它的主要功能为:使用MAX32690EVKIT的中断,接收按键控制信息,通过长按、短按来控制LED灯的闪烁。
标签
嵌入式系统
LED控制
MAX32690EVKIT
中断
aramy
更新2026-08-11
29

一、硬件介绍:

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"反向变化

按上面的逻辑循环

频率变化过程应平滑(无明显跳变)

三、设计思路:

image.png

系统上电后,初始化GPIO,串口和中断,中断使用上下沿都触发的方式。当按键按下、松开记录下按键时长,根据时长来判断按键是长按、还是短按。短按则控制LED灯是否闪烁,长按则切换LED灯闪烁的频率。并在串口输出当前的状态信息,用于监控系统运行。

参考着官方的电路图,可以看见板载有两个LED灯,还有一个按键。按键连接着P4.0的排针,需要额外使用杜邦线连接到MCU的P2.11管脚上去。

image.png

bf303edc4e11bf47ce33863a58dd6a02.jpg

四、任务实现:

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

image.png

初始化按键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);
            }
        }
    }

五、效果展示:

可以通过串口观察当前系统状态。

275a0e842d00697c55a7673642be8aeb.png

60c7fe08a1ac3597bae26a982763528c.jpg

ff6d2241ca475e298430bb6fdfcb700d.jpg

六、心得体会:

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

附件下载
Hello_World.zip
源码工程
团队介绍
单片机业余爱好者,瞎捣鼓小能手。
评论
0 / 100
查看更多
硬禾服务号
关注最新动态
0512-67862536
info@eetree.cn
江苏省苏州市苏州工业园区新平街388号腾飞创新园A2幢815室
苏州硬禾信息科技有限公司
Copyright © 2024 苏州硬禾信息科技有限公司 All Rights Reserved 苏ICP备19040198号