查看: 84|回复: 0

[分享] 【FRDM-MCXW71试用】第3辑:GPIO的应用

[复制链接]
  • TA的每日心情
    开心
    2025-1-21 10:02
  • 签到天数: 9 天

    连续签到: 1 天

    [LV.3]偶尔看看II

    15

    主题

    3625

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    2939
    最后登录
    2025-8-6
    发表于 4 天前 | 显示全部楼层 |阅读模式
           我们实现了基本的开发环境的配置,并导入了blink的程序,实际控制的是RGB的绿灯,接下来我们进一步的了解一下GPIO的控制,我们都知道blink实际上就是GPIO的开关,我们将通过实际的应用去熟悉GPIO的输出和输出控制。
           这里我们徐亚看一下相关硬件外设有哪些?
           其一就是LED:
    1.png

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

           输入方面对应就是按键:
    3.png

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

           这些引脚也都有着一些特殊的功能,这个就要根据咱们自己的取舍了。
           接下来我们一起看看MCUXpresso IDE中我们如何进行控制,我们还是已上面的blink程序为基础,首先打开外设备配置或者引脚配置可以看到:
    5.png

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

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

    <article data-content="[{"type":"block","id":"Y3OC-1743867966069","name":"paragraph","data":{"style":{"textIndent":28}},"nodes":[{"type":"text","id":"lCad-1743867966068","leaves":[{"text":"函数的输入参数类型不符,通过不断的尝试发现,如果输出相同的类型信息,就不能触发中断,如果通过初始化的代码,运行后就会报错,通过检错assert(portInd        函数的输入参数类型不符,通过不断的尝试发现,如果输出相同的类型信息,就不能触发中断,如果通过初始化的代码,运行后就会报错,通过检错assert(portInd < ARRAY_SIZE(s_gpioBases));直接失败,这就无解了。那么久只要能用demo中的输入中断的方法了,这里面之使用了引脚的配置,二外设的配置都没有用,通过直接代码编码的方式进行配置,我们在进行如下的引脚配置:
    1. gpio_pin_config_t SW2_config = {
    2.         .pinDirection = kGPIO_DigitalInput,
    3.         .outputLogic = 0U
    4.     };
    5.     /* Initialize GPIO functionality on pin PTC6 (pin 44)  */
    6.     GPIO_PinInit(BOARD_INITPINS_SW2_GPIO, BOARD_INITPINS_SW2_PIN, &SW2_config);
    7.    
    8. const port_pin_config_t SW2 = {/* Internal pull-up resistor is enabled */
    9.                                    .pullSelect = (uint16_t)kPORT_PullUp,
    10.                                    /* Low internal pull resistor value is selected. */
    11.                                    .pullValueSelect = (uint16_t)kPORT_LowPullResistor,
    12.                                    /* Fast slew rate is configured */
    13.                                    .slewRate = (uint16_t)kPORT_FastSlewRate,
    14.                                    /* Passive input filter is disabled */
    15.                                    .passiveFilterEnable = (uint16_t)kPORT_PassiveFilterDisable,
    16.                                    /* Open drain output is disabled */
    17.                                    .openDrainEnable = (uint16_t)kPORT_OpenDrainDisable,
    18.                                    /* Low drive strength is configured */
    19.                                    .driveStrength = (uint16_t)kPORT_LowDriveStrength,
    20.                                    /* Normal drive strength is configured */
    21.                                    .driveStrength1 = (uint16_t)kPORT_NormalDriveStrength,
    22.                                    /* Pin is configured as PTC6 */
    23.                                    .mux = (uint16_t)kPORT_MuxAsGpio,
    24.                                    /* Pin Control Register fields [15:0] are not locked */
    25.                                    .lockRegister = (uint16_t)kPORT_UnlockRegister};
    26.     /* PORTC6 (pin 44) is configured as PTC6 */
    27.     PORT_SetPinConfig(BOARD_INITPINS_SW2_PORT, BOARD_INITPINS_SW2_PIN, &SW2);
    复制代码
          之后再main中进行外部中断的配置:
    1. gpio_pin_config_t sw_config = {
    2.         kGPIO_DigitalInput,
    3.         0,
    4.     };
    5. /* Init input switch GPIO. */
    6. #if (defined(FSL_FEATURE_PORT_HAS_NO_INTERRUPT) && FSL_FEATURE_PORT_HAS_NO_INTERRUPT) || \
    7.     (!defined(FSL_FEATURE_SOC_PORT_COUNT))
    8.     GPIO_SetPinInterruptConfig(BOARD_SW_GPIO, BOARD_SW_GPIO_PIN, kGPIO_InterruptFallingEdge);
    9. #else
    10.     PORT_SetPinInterruptConfig(BOARD_SW_PORT, BOARD_SW_GPIO_PIN, kPORT_InterruptFallingEdge);
    11. #endif
    12.     EnableIRQ(BOARD_SW_IRQ);
    13.     GPIO_PinInit(BOARD_SW_GPIO, BOARD_SW_GPIO_PIN, &sw_config);
    复制代码
          最后我们实现的是通过按键控制不同的灯进行闪烁,初始状态是红灯闪烁,按一下按键变换成绿灯,在变成蓝灯闪烁,这样循环,主要的控制代码如下:
    1. if (g_ButtonPress)
    2.         {
    3.             PRINTF(" %s is pressed \r\n", BOARD_SW_NAME);
    4.             /* Reset state of button. */
    5.             LED_mode++;
    6.             LED_mode %= 3;
    7.             GPIO_PortSet(BOARD_INITPINS_LED_RED_GPIO, 1U << BOARD_INITPINS_LED_RED_PIN);
    8.             GPIO_PortSet(BOARD_INITPINS_LED_GREEN_GPIO, 1U << BOARD_INITPINS_LED_GREEN_PIN);
    9.             GPIO_PortSet(BOARD_INITPINS_LED_BLUE_GPIO, 1U << BOARD_INITPINS_LED_BLUE_PIN);
    10.             g_ButtonPress = false;
    11.         }
    12.         /* Delay 1000 ms */
    13.         SysTick_DelayTicks(1000U);
    14.         switch(LED_mode)
    15.         {
    16.             case 0:
    17.                 GPIO_PortToggle(BOARD_INITPINS_LED_RED_GPIO, 1u << BOARD_INITPINS_LED_RED_PIN);
    18.                 break;
    19.             case 1:
    20.                 GPIO_PortToggle(BOARD_INITPINS_LED_GREEN_GPIO, 1u << BOARD_INITPINS_LED_GREEN_PIN);
    21.                 break;
    22.             case 2:
    23.                 GPIO_PortToggle(BOARD_INITPINS_LED_BLUE_GPIO, 1u << BOARD_INITPINS_LED_BLUE_PIN);
    24.                 break;
    25.             default:
    26.                 break;
    27.         }
    复制代码
          效果如下:
    8.gif


    早上开心
    回复

    使用道具 举报

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

    本版积分规则

    关闭

    站长推荐上一条 /3 下一条

    Archiver|手机版|小黑屋|恩智浦技术社区

    GMT+8, 2025-8-6 14:55 , Processed in 0.079645 second(s), 20 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

    快速回复 返回顶部 返回列表