这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » DIY与开源设计 » 电子DIY » Let'sdo2025年第2期—智能手环:②过程帖一:点亮RGB灯

共1条 1/1 1 跳转至

Let'sdo2025年第2期—智能手环:②过程帖一:点亮RGB灯

菜鸟
2025-10-08 15:47:41     打赏


查看MAX78000FTHR开发板的说明书和电路板

RGB灯对应D1,整体是一个模块,对应3个灯。


image.png


image.png

R红灯:P2.0

G绿灯:P2.1

B蓝灯:P2.2

低电平——亮灯

高电平——灭灯



要点亮RGB灯,只需要把P2.0、P2.1、P2.2设置为普通GPIO口,方向为输出即可。

在Eclipse MaximSDK中,ADI提供了现成的HAL库(Hardware Abstraction Layer,硬件抽象层),类似STM32的HAL库

这样我们就不需要直接操作寄存器,只需要操作对应的函数即可。


我们新建1个程序,基于官方例程GPIO

image.png


这是原版例程

他的功能是:读取按钮2(SW2  P1.7)的值,将该值赋予LED1(P2.0红灯)

                          按下按钮1(SW1 P0.2)将会产生中断,中断函数会执行P0.9翻转的动作。

/**
 * @file        main.c
 * @brief       GPIO Example
 * @details
 */

/******************************************************************************
 *
 * Copyright (C) 2022-2023 Maxim Integrated Products, Inc. (now owned by 
 * Analog Devices, Inc.),
 * Copyright (C) 2023-2024 Analog Devices, Inc.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 *
 ******************************************************************************/

/***** Includes *****/
#include <stdio.h>
#include <string.h>
#include "mxc_device.h"
#include "mxc_delay.h"
#include "nvic_table.h"
#include "pb.h"
#include "board.h"
#include "gpio.h"

/***** Definitions *****/
#ifdef BOARD_EVKIT_V1
#define MXC_GPIO_PORT_IN MXC_GPIO2
#define MXC_GPIO_PIN_IN MXC_GPIO_PIN_6

#define MXC_GPIO_PORT_OUT MXC_GPIO0
#define MXC_GPIO_PIN_OUT MXC_GPIO_PIN_2

#define MXC_GPIO_PORT_INTERRUPT_IN MXC_GPIO2
#define MXC_GPIO_PIN_INTERRUPT_IN MXC_GPIO_PIN_7

#define MXC_GPIO_PORT_INTERRUPT_STATUS MXC_GPIO0
#define MXC_GPIO_PIN_INTERRUPT_STATUS MXC_GPIO_PIN_3
#endif

#ifdef BOARD_FTHR_REVA
#define MXC_GPIO_PORT_IN MXC_GPIO1
#define MXC_GPIO_PIN_IN MXC_GPIO_PIN_7

#define MXC_GPIO_PORT_OUT MXC_GPIO2
#define MXC_GPIO_PIN_OUT MXC_GPIO_PIN_0

#define MXC_GPIO_PORT_INTERRUPT_IN MXC_GPIO0
#define MXC_GPIO_PIN_INTERRUPT_IN MXC_GPIO_PIN_2

#define MXC_GPIO_PORT_INTERRUPT_STATUS MXC_GPIO0
#define MXC_GPIO_PIN_INTERRUPT_STATUS MXC_GPIO_PIN_9
#endif

/***** Globals *****/

/***** Functions *****/
void gpio_isr(void *cbdata)
{
    mxc_gpio_cfg_t *cfg = cbdata;
    MXC_GPIO_OutToggle(cfg->port, cfg->mask);
}

int main(void)
{
    mxc_gpio_cfg_t gpio_in;
    mxc_gpio_cfg_t gpio_out;
    mxc_gpio_cfg_t gpio_interrupt;
    mxc_gpio_cfg_t gpio_interrupt_status;

#ifdef BOARD_EVKIT_V1
    printf("\n\n***** GPIO Example *****\n\n");
    printf("1. This example reads P2.6 (PB1 input) and outputs the same state onto\n");
    printf("   P0.2 (LED1).\n");
    printf("2. An interrupt is set up on P2.7 (PB2 input). P0.3 (LED2) toggles when\n");
    printf("   that interrupt occurs.\n\n");
#else
    printf("\n\n***** GPIO Example *****\n\n");
    printf("1. This example reads P1.7 (SW2 input) and outputs the same state onto\n");
    printf("   P2.0 (LED1).\n");
    printf("2. An interrupt is set to occur when SW1 (P0.2) is pressed. P0.9 (SDIO3 pin\n");
    printf("   on header J4) toggles when that interrupt occurs.\n\n");
#endif

    /* Setup interrupt status pin as an output so we can toggle it on each interrupt. */
    gpio_interrupt_status.port = MXC_GPIO_PORT_INTERRUPT_STATUS;
    gpio_interrupt_status.mask = MXC_GPIO_PIN_INTERRUPT_STATUS;
    gpio_interrupt_status.pad = MXC_GPIO_PAD_NONE;
    gpio_interrupt_status.func = MXC_GPIO_FUNC_OUT;
    gpio_interrupt_status.vssel = MXC_GPIO_VSSEL_VDDIO;
    gpio_interrupt_status.drvstr = MXC_GPIO_DRVSTR_0;
    MXC_GPIO_Config(&gpio_interrupt_status);

    /*
     *   Set up interrupt pin.
     *   Switch on EV kit is open when non-pressed, and grounded when pressed.  Use an internal pull-up so pin
     *     reads high when button is not pressed.
     */
    gpio_interrupt.port = MXC_GPIO_PORT_INTERRUPT_IN;
    gpio_interrupt.mask = MXC_GPIO_PIN_INTERRUPT_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);
    MXC_GPIO_RegisterCallback(&gpio_interrupt, gpio_isr, &gpio_interrupt_status);
    MXC_GPIO_IntConfig(&gpio_interrupt, MXC_GPIO_INT_FALLING);
    MXC_GPIO_EnableInt(gpio_interrupt.port, gpio_interrupt.mask);
    NVIC_EnableIRQ(MXC_GPIO_GET_IRQ(MXC_GPIO_GET_IDX(MXC_GPIO_PORT_INTERRUPT_IN)));

    /*
     *   Setup input pin.
     *   Switch on EV kit is open when non-pressed, and grounded when pressed.  Use an internal pull-up so pin
     *     reads high when button is not pressed.
     */
    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 (1) {
        /* 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);
        }
    }

    return 0;
}


我们在官方例程的基础上,修改下,实现功能是:GRB灯依次闪烁

为了实现延时,需要添加头文件

#include "mxc_delay.h"


main.c文件如下:

#include <stdio.h>
#include <string.h>
#include "mxc_device.h"
#include "mxc_delay.h"
#include "nvic_table.h"
#include "pb.h"
#include "board.h"
#include "gpio.h"





#define MXC_R_PORT_OUT MXC_GPIO2
#define MXC_R_PIN_OUT MXC_GPIO_PIN_0

#define MXC_G_PORT_OUT MXC_GPIO2
#define MXC_G_PIN_OUT MXC_GPIO_PIN_1

#define MXC_B_PORT_OUT MXC_GPIO2
#define MXC_B_PIN_OUT MXC_GPIO_PIN_2


int main(void)
{

    mxc_gpio_cfg_t LEDR,LEDG,LEDB;

    /* Setup output pin. */
    LEDR.port = MXC_R_PORT_OUT;   //端口号
    LEDR.mask = MXC_R_PIN_OUT;       //针脚号
    LEDR.pad = MXC_GPIO_PAD_NONE;      //上拉还是下拉
    LEDR.func = MXC_GPIO_FUNC_OUT;     //设置为GPIO功能
    LEDR.vssel = MXC_GPIO_VSSEL_VDDIOH; //初始电压
    LEDR.drvstr = MXC_GPIO_DRVSTR_0;   //驱动强度
    MXC_GPIO_Config(&LEDR);

    /* Setup output pin. */
    LEDG.port = MXC_G_PORT_OUT;   //端口号
    LEDG.mask = MXC_G_PIN_OUT;       //针脚号
    LEDG.pad = MXC_GPIO_PAD_NONE;      //上拉还是下拉
    LEDG.func = MXC_GPIO_FUNC_OUT;     //设置为GPIO功能
    LEDG.vssel = MXC_GPIO_VSSEL_VDDIOH; //初始电压
    LEDG.drvstr = MXC_GPIO_DRVSTR_0;   //驱动强度
    MXC_GPIO_Config(&LEDG);

    /* Setup output pin. */
    LEDB.port = MXC_B_PORT_OUT;   //端口号
    LEDB.mask = MXC_B_PIN_OUT;       //针脚号
    LEDB.pad = MXC_GPIO_PAD_NONE;      //上拉还是下拉
    LEDB.func = MXC_GPIO_FUNC_OUT;     //设置为GPIO功能
    LEDB.vssel = MXC_GPIO_VSSEL_VDDIOH; //初始电压
    LEDB.drvstr = MXC_GPIO_DRVSTR_0;   //驱动强度
    MXC_GPIO_Config(&LEDB);


    while (1)
    {

        MXC_GPIO_OutClr(LEDR.port, LEDR.mask);  //亮灯
        MXC_Delay(1000000);  //1秒
        MXC_GPIO_OutSet(LEDR.port, LEDR.mask);  //灭灯
        MXC_Delay(1000000);  //1秒



        MXC_GPIO_OutClr(LEDG.port, LEDG.mask);  //亮灯
        MXC_Delay(1000000);  //1秒
        MXC_GPIO_OutSet(LEDG.port, LEDG.mask);  //灭灯
        MXC_Delay(1000000);  //1秒

        MXC_GPIO_OutClr(LEDB.port, LEDB.mask);  //亮灯
        MXC_Delay(1000000);  //1秒
        MXC_GPIO_OutSet(LEDB.port, LEDB.mask);  //灭灯
        MXC_Delay(1000000);  //1秒
    }

    return 0;
}



编译成功后,在Debug——Debug Configuration页面,选择工程名称RGB

image.png

image.png


下载后就可以看到RGB灯依次闪烁了。


RGB.gif








关键词: MAX78000    

共1条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]