这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 活动中心 » 板卡试用 » 【FRDM-MCXW71试用】第3辑:GPIO的应用

共2条 1/1 1 跳转至

【FRDM-MCXW71试用】第3辑:GPIO的应用

高工
2025-04-06 14:25:08     打赏

        我们实现了基本的开发环境的配置,并导入了blink的程序,实际控制的是RGB的绿灯,接下来我们进一步的了解一下GPIO的控制,我们都知道blink实际上就是GPIO的开关,我们将通过实际的应用去熟悉GPIO的输出和输出控制。

        这里我们徐亚看一下相关硬件外设有哪些?

        其一就是LED:

image.png

        这里我们能够进行控制的是RGB-LED和D14,都是通过拉低来进行点亮,拉高对应的就是熄灭,对应的实际引脚如下:

image.png

        输入方面对应就是按键:

image.png

        去除专用功能的按键,我们可以使用SW1和SW2,对应的引脚是:

image.png

        这些引脚也都有着一些特殊的功能,这个就要根据咱们自己的取舍了。

        接下来我们一起看看MCUXpresso IDE中我们如何进行控制,我们还是已上面的blink程序为基础,首先打开外设备配置或者引脚配置可以看到:

image.png

        下面也可以看到实施的路由信息:

image.png

        简单的GPIO配置实际上就是引脚的配置,这些都是相通的,配置完成之后就都可以了,使用同样的方法我们把其他部分也都配置一下输出模式,输出没有问题,我们在按键输入配置成外部中断的时候出现了问题,使用自动生成的有一个错误,如下:

image.png

        函数的输入参数类型不符,通过不断的尝试发现,如果输出相同的类型信息,就不能触发中断,如果通过初始化的代码,运行后就会报错,通过检错assert(portInd < ARRAY_SIZE(s_gpioBases));直接失败,这就无解了。那么久只要能用demo中的输入中断的方法了,这里面之使用了引脚的配置,二外设的配置都没有用,通过直接代码编码的方式进行配置,我们在进行如下的引脚配置:

gpio_pin_config_t SW2_config = {
        .pinDirection = kGPIO_DigitalInput,
        .outputLogic = 0U
    };
    /* Initialize GPIO functionality on pin PTC6 (pin 44)  */
    GPIO_PinInit(BOARD_INITPINS_SW2_GPIO, BOARD_INITPINS_SW2_PIN, &SW2_config);
    
const port_pin_config_t SW2 = {/* Internal pull-up resistor is enabled */
                                   .pullSelect = (uint16_t)kPORT_PullUp,
                                   /* Low internal pull resistor value is selected. */
                                   .pullValueSelect = (uint16_t)kPORT_LowPullResistor,
                                   /* Fast slew rate is configured */
                                   .slewRate = (uint16_t)kPORT_FastSlewRate,
                                   /* Passive input filter is disabled */
                                   .passiveFilterEnable = (uint16_t)kPORT_PassiveFilterDisable,
                                   /* Open drain output is disabled */
                                   .openDrainEnable = (uint16_t)kPORT_OpenDrainDisable,
                                   /* Low drive strength is configured */
                                   .driveStrength = (uint16_t)kPORT_LowDriveStrength,
                                   /* Normal drive strength is configured */
                                   .driveStrength1 = (uint16_t)kPORT_NormalDriveStrength,
                                   /* Pin is configured as PTC6 */
                                   .mux = (uint16_t)kPORT_MuxAsGpio,
                                   /* Pin Control Register fields [15:0] are not locked */
                                   .lockRegister = (uint16_t)kPORT_UnlockRegister};
    /* PORTC6 (pin 44) is configured as PTC6 */
    PORT_SetPinConfig(BOARD_INITPINS_SW2_PORT, BOARD_INITPINS_SW2_PIN, &SW2);

        之后再main中进行外部中断的配置:

gpio_pin_config_t sw_config = {
        kGPIO_DigitalInput,
        0,
    };
/* Init input switch GPIO. */
#if (defined(FSL_FEATURE_PORT_HAS_NO_INTERRUPT) && FSL_FEATURE_PORT_HAS_NO_INTERRUPT) || \
    (!defined(FSL_FEATURE_SOC_PORT_COUNT))
    GPIO_SetPinInterruptConfig(BOARD_SW_GPIO, BOARD_SW_GPIO_PIN, kGPIO_InterruptFallingEdge);
#else
    PORT_SetPinInterruptConfig(BOARD_SW_PORT, BOARD_SW_GPIO_PIN, kPORT_InterruptFallingEdge);
#endif
    EnableIRQ(BOARD_SW_IRQ);
    GPIO_PinInit(BOARD_SW_GPIO, BOARD_SW_GPIO_PIN, &sw_config);

        最后我们实现的是通过按键控制不同的灯进行闪烁,初始状态是红灯闪烁,按一下按键变换成绿灯,在变成蓝灯闪烁,这样循环,主要的控制代码如下:

if (g_ButtonPress)
        {
            PRINTF(" %s is pressed \r\n", BOARD_SW_NAME);
            /* Reset state of button. */
            LED_mode++;
            LED_mode %= 3;
            GPIO_PortSet(BOARD_INITPINS_LED_RED_GPIO, 1U << BOARD_INITPINS_LED_RED_PIN);
            GPIO_PortSet(BOARD_INITPINS_LED_GREEN_GPIO, 1U << BOARD_INITPINS_LED_GREEN_PIN);
            GPIO_PortSet(BOARD_INITPINS_LED_BLUE_GPIO, 1U << BOARD_INITPINS_LED_BLUE_PIN);
            g_ButtonPress = false;
        }
        /* Delay 1000 ms */
        SysTick_DelayTicks(1000U);
        switch(LED_mode)
        {
            case 0:
                GPIO_PortToggle(BOARD_INITPINS_LED_RED_GPIO, 1u << BOARD_INITPINS_LED_RED_PIN);
                break;
            case 1:
                GPIO_PortToggle(BOARD_INITPINS_LED_GREEN_GPIO, 1u << BOARD_INITPINS_LED_GREEN_PIN);
                break;
            case 2:
                GPIO_PortToggle(BOARD_INITPINS_LED_BLUE_GPIO, 1u << BOARD_INITPINS_LED_BLUE_PIN);
                break;
            default:
                break;
        }

        效果如下:

1 (1).gif



专家
2025-04-06 22:39:01     打赏
2楼

感谢分享


共2条 1/1 1 跳转至

回复

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