232|1

107

帖子

1

TA的资源

一粒金砂(高级)

楼主
 

基于NXP MCUXpresso SDK的GPIO控制与中断处理示例 [复制链接]

 

5c3d41835e452d1b8858ec60a8b6c17d

 

引言

欢迎来到本次的技术分享!今天,我们将一起探讨一个基于NXP MCUXpresso SDK开发的GPIO(通用输入输出)控制与中断处理示例程序。这个程序展示了如何通过配置GPIO引脚来实现LED灯的闪烁以及按钮按下时的中断响应。

程序概述

该程序主要实现了以下功能:

  1. LED灯控制:通过GPIO引脚控制板载LED灯的闪烁。
  2. 按钮中断处理:配置GPIO引脚为中断输入,当按钮被按下时,触发中断并响应相应的动作(如切换LED灯状态)。

关键组件与配置

外部中断号

一组GPIO 可以使能2个中断

 

ISF 中断状态标志

 

GPIO_PinGetInterruptFlag:读单个引脚的中断状态标志

 


#define GPIO_ICR_ISF_SHIFT                       (24U)

/*!
 * brief Read individual pin's interrupt status flag.
 *
 * param base GPIO peripheral base pointer. (GPIOA, GPIOB, GPIOC, and so on)
 * param pin GPIO specific pin number.
 * return The current selected pin's interrupt status flag.
 */
uint8_t GPIO_PinGetInterruptFlag(GPIO_Type *base, uint32_t pin)
{
    return (uint8_t)((base->ICR[pin] & GPIO_ICR_ISF_MASK) >> GPIO_ICR_ISF_SHIFT);
}

程序结构详解

  1. 头文件包含:
  • 包含了必要的头文件,如fsl_debug_console.h用于调试输出,fsl_gpio.h用于GPIO控制等。
#include "fsl_debug_console.h"
#if defined(FSL_FEATURE_SOC_PORT_COUNT) && (FSL_FEATURE_SOC_PORT_COUNT)
#include "fsl_port.h"
#endif
#include "fsl_gpio.h"
#include "fsl_common.h"
#include "pin_mux.h"
#include "clock_config.h"
#include "board.h"

 

 

 

2.宏定义与变量声明:

 

  1. 定义了LED和按钮对应的GPIO引脚。
  2. 声明了用于标记按钮按下状态的变量。

3.中断服务函数实现:

*!
 * @brief  Interrupt service fuction of switch.
 *
 * This function toggles the LED
 */
void BOARD_SW_IRQ_HANDLER(void)
{
	if(GPIO_PinGetInterruptFlag(GPIO0,6))
	{
	   #if (defined(FSL_FEATURE_PORT_HAS_NO_INTERRUPT) && FSL_FEATURE_PORT_HAS_NO_INTERRUPT) || \
    (!defined(FSL_FEATURE_SOC_PORT_COUNT))
    /* Clear external interrupt flag. */
    GPIO_GpioClearInterruptFlags(BOARD_SW_GPIO, 1U << BOARD_SW_GPIO_PIN);
    #else
    /* Clear external interrupt flag. */
    GPIO_PortClearInterruptFlags(BOARD_SW_GPIO, 1U << BOARD_SW_GPIO_PIN);
    #endif
    /* Change state of button. */
    g_ButtonPress = true;
	
	}
	
	if(GPIO_PinGetInterruptFlag(GPIO0,29))
	{
	   #if (defined(FSL_FEATURE_PORT_HAS_NO_INTERRUPT) && FSL_FEATURE_PORT_HAS_NO_INTERRUPT) || \
    (!defined(FSL_FEATURE_SOC_PORT_COUNT))
    /* Clear external interrupt flag. */
    GPIO_GpioClearInterruptFlags(GPIO0, 1U << 29);
    #else
    /* Clear external interrupt flag. */
    GPIO_PortClearInterruptFlags(BOARD_SW_GPIO, 1U << BOARD_SW_GPIO_PIN);
    #endif
    /* Change state of button. */
    g_ButtonPress1 = true;
	
	}
	
	if(GPIO_PinGetInterruptFlag(GPIO1,23))
	{
	   #if (defined(FSL_FEATURE_PORT_HAS_NO_INTERRUPT) && FSL_FEATURE_PORT_HAS_NO_INTERRUPT) || \
    (!defined(FSL_FEATURE_SOC_PORT_COUNT))
    /* Clear external interrupt flag. */
    GPIO_GpioClearInterruptFlags(GPIO1, 1U << 23);
    #else
    /* Clear external interrupt flag. */
    GPIO_PortClearInterruptFlags(BOARD_SW_GPIO, 1U << BOARD_SW_GPIO_PIN);
    #endif
    /* Change state of button. */
    g_ButtonPress2 = true;
	
	}

    SDK_ISR_EXIT_BARRIER;
}

void GPIO10_IRQHandler(void)
{

	
	if(GPIO_PinGetInterruptFlag(GPIO1,23))
	{
	  
    /* Clear external interrupt flag. */
    GPIO_GpioClearInterruptFlags(GPIO1, 1U << 23);
    
    /* Change state of button. */
    g_ButtonPress2 = true;
	
	}

    SDK_ISR_EXIT_BARRIER;
}

 

 

 

4.主函数实现:

/*!
 * @brief Main function
 */
int main(void)
{
    /* Define the init structure for the output LED pin*/
    gpio_pin_config_t led_config = {
        kGPIO_DigitalOutput,
        0,
    };
		
		    /* Define the init structure for the input switch pin */
    gpio_pin_config_t sw_config = {
        kGPIO_DigitalInput,
        0,
    };

    /* Board pin, clock, debug console init */
    /* attach FRO 12M to FLEXCOMM4 (debug console) */
    CLOCK_SetClkDiv(kCLOCK_DivFlexcom4Clk, 1u);
    CLOCK_AttachClk(BOARD_DEBUG_UART_CLK_ATTACH);

    /* enable clock for GPIO*/
    CLOCK_EnableClock(kCLOCK_Gpio0);
		CLOCK_EnableClock(kCLOCK_Gpio1);

    BOARD_InitPins();
    BOARD_InitBootClocks();
    BOARD_InitDebugConsole();

    /* Print a note to terminal. */
    PRINTF("\r\n GPIO Driver example\r\n");
    PRINTF("\r\n The LED is blinking.\r\n");
    
		GPIO_SetPinInterruptConfig(BOARD_SW_GPIO, BOARD_SW_GPIO_PIN, kGPIO_InterruptFallingEdge);
		GPIO_SetPinInterruptConfig(GPIO0, 29, kGPIO_InterruptFallingEdge);
		GPIO_SetPinInterruptChannel(GPIO0, 29,kGPIO_InterruptOutput0);
		
		GPIO_SetPinInterruptConfig(GPIO1, 23, kGPIO_InterruptFallingEdge);
		GPIO_SetPinInterruptChannel(GPIO1, 23,kGPIO_InterruptOutput0);
		
		
		EnableIRQ(BOARD_SW_IRQ);
		EnableIRQ(GPIO10_IRQn);
    GPIO_PinInit(BOARD_SW_GPIO, BOARD_SW_GPIO_PIN, &sw_config);
    GPIO_PinInit(GPIO0, 29, &sw_config);
		GPIO_PinInit(GPIO1, 23, &sw_config);
		GPIO_PinInit(BOARD_LED_GPIO, BOARD_LED_GPIO_PIN, &led_config);
		GPIO_PinInit(GPIO0, 25, &led_config);
    GPIO_PinInit(GPIO0, 26, &led_config);


    while (1)
    {
//        delay();
//       GPIO_PortToggle(BOARD_LED_GPIO, 1u << BOARD_LED_GPIO_PIN);
//			 GPIO_PortToggle(GPIO0, 1u << 25);
//			 GPIO_PortToggle(GPIO0, 1u << 26);
			
			 if (g_ButtonPress)
        {
            PRINTF(" %s is pressed \r\n", BOARD_SW_NAME);
            /* Toggle LED. */
            GPIO_PortToggle(BOARD_LED_GPIO, 1U << BOARD_LED_GPIO_PIN);
            /* Reset state of button. */
            g_ButtonPress = false;
        }
				
				 if (g_ButtonPress1)
        {
            PRINTF(" %s is pressed \r\n", "GPIO0_29");
            /* Toggle LED. */
            GPIO_PortToggle(GPIO0, 1u << 25);
            /* Reset state of button. */
            g_ButtonPress1 = false;
        }
				
				if (g_ButtonPress2)
        {
            PRINTF(" %s is pressed \r\n", "GPIO0_23");
            /* Toggle LED. */
            GPIO_PortToggle(GPIO0, 1u << 26);
            /* Reset state of button. */
            g_ButtonPress2 = false;
        }
    }
}

附:源文件

inpot interrupt MY.zip (507.2 KB, 下载次数: 0)
此帖出自NXP MCU论坛

最新回复

不同的IDE其实用的解释器都是一样的,只不过写法不同,这个是需要适应的地方   详情 回复 发表于 2025-1-8 09:13
点赞 关注
 

回复
举报

6534

帖子

9

TA的资源

版主

沙发
 

不同的IDE其实用的解释器都是一样的,只不过写法不同,这个是需要适应的地方

此帖出自NXP MCU论坛
 
个人签名

在爱好的道路上不断前进,在生活的迷雾中播撒光引

 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/7 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表