查看MAX78000FTHR开发板的说明书和电路板
RGB灯对应D1,整体是一个模块,对应3个灯。
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
这是原版例程
他的功能是:读取按钮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
下载后就可以看到RGB灯依次闪烁了。