这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » DIY与开源设计 » 电子DIY » 【FRDMRW612系列】3、按键中断

共1条 1/1 1 跳转至

【FRDMRW612系列】3、按键中断

高工
2026-07-17 15:16:46     打赏

【软件环境】

MCUXPresso IDE 25.6

【工程配置】

从数据手册中,可以得到可以供用的是wakeup按键。为了增加可观性,我再添加另一个LED:

image.png

图形化配置后如下:

image.png

更新源代码后,可以看到如下代码:

void BOARD_InitPins(void)
{
/* Enables the clock for the GPIO0 module */
GPIO_PortInit(GPIO, 0);

gpio_pin_config_t gpio0_pinM2_config = {
.pinDirection = kGPIO_DigitalInput,
.outputLogic = 0U
};
gpio_interrupt_config_t gpio0_pinM2_int_config = {
.mode = kGPIO_PinIntEnableEdge,
.polarity = kGPIO_PinIntEnableLowOrFall
};
/* Initialize GPIO functionality on pin PIO0_11 (pin M2)  */
GPIO_PinInit(GPIO, 0U, 11U, &gpio0_pinM2_config);
GPIO_SetPinInterruptConfig(GPIO, 0U, 11U, &gpio0_pinM2_int_config);
GPIO_PinEnableInterrupt(GPIO, 0U, 11U, (uint32_t)kGPIO_InterruptA);
/* Initialize FC3_USART_DATA functionality on pin GPIO_24 (pin E5) */
IO_MUX_SetPinMux(IO_MUX_FC3_USART_DATA);
/* Initialize GPIO11 functionality on pin GPIO_11 (pin M2) */
IO_MUX_SetPinMux(IO_MUX_GPIO11);
}

可以看到对GPIO_0、GPIO_1已经初始化输出模式。GPIO_11为输入模式。

2、rw612的GPIO输出操作

/*!
 * @brief Sets the output level of the one GPIO pin to the logic 1 or 0.
 *
 * @param base    GPIO peripheral base pointer(Typically GPIO)
 * @param port   GPIO port number
 * @param pin    GPIO pin number
 * @param output  GPIO pin output logic level.
 *        - 0: corresponding pin output low-logic level.
 *        - 1: corresponding pin output high-logic level.
 */
static inline void GPIO_PinWrite(GPIO_Type *base, uint32_t port, uint32_t pin, uint8_t output)
{
base->B[port][pin] = output;
}

根据sdk中示例,我添加测试代码如下:

/*
 * Copyright (c) 2013 - 2015, Freescale Semiconductor, Inc.
 * Copyright 2016-2017, 2024 NXP
 * All rights reserved.
 *
 * SPDX-License-Identifier: BSD-3-Clause
 */

#include "fsl_device_registers.h"
#include "fsl_debug_console.h"
#include "board.h"
#include "app.h"

/*******************************************************************************
 * Definitions
 ******************************************************************************/

/*******************************************************************************
 * Prototypes
 ******************************************************************************/

/*******************************************************************************
 * Variables
 ******************************************************************************/
volatile uint32_t g_systickCounter;
volatile bool g_InputSignal = false;

/*******************************************************************************
 * Code
 ******************************************************************************/
/*!
 * @brief Interrupt service fuction of switch.
 */
void GPIO_INTA_IRQHandler(void)
{
    /* clear the interrupt status */
    GPIO_PinClearInterruptFlag(GPIO, 0, 11, 0);
    /* Change state of switch. */

    g_InputSignal = true;
    SDK_ISR_EXIT_BARRIER;
}

void SysTick_Handler(void)
{
    if (g_systickCounter != 0U)
    {
        g_systickCounter--;
    }
}

void SysTick_DelayTicks(uint32_t n)
{
    g_systickCounter = n;
    while (g_systickCounter != 0U)
    {
    }
}

/*!
 * @brief Main function
 */
int main(void)
{
    char ch;

    /* Init board hardware. */
    BOARD_InitHardware();

    PRINTF("MCUX SDK version: %s\r\n", MCUXSDK_VERSION_FULL_STR);


    GPIO_PinEnableInterrupt(GPIO, 0, 11, 0);
    EnableIRQ(GPIO_INTA_IRQn);
    PRINTF("hello world.\r\n");
    /* Set systick reload value to generate 1ms interrupt */
    if (SysTick_Config(SystemCoreClock / 1000U))
    {
        while (1)
        {
        }
    }
    while (1)
    {
        SysTick_DelayTicks(100U);
        GPIO_PinWrite(GPIO, 0, 0, 1);
        SysTick_DelayTicks(100U);
        GPIO_PinWrite(GPIO, 0, 0, 0);
        if(g_InputSignal)
        {
            GPIO_PortToggle(GPIO, 0, (1U << 1));
            g_InputSignal = false;

        }
    }
}

这里我们需要注意,虽然在初始化了按键GPIO_11,但还是需要使用:

GPIO_PinEnableInterrupt(GPIO, 0, 11, 0);
EnableIRQ(GPIO_INTA_IRQn);

来打开GPIO_11的中断,并使能GPIO_INTA_IRQn。

【下载验证】

下载好到开发板后,可以看到开板上的蓝色RGB灯以100ms的频率闪烁了。

同时按下wake按键后可以转另一个RGB灯。

【总结】

通过mcuxpresso ide的图形化配置,可以快速实现对GPIO output、OUTPUT的操作。





关键词: FRDMRW612     按键     中断    

共1条 1/1 1 跳转至

回复

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