在线时间175 小时
UID3472105
注册时间2018-6-26
NXP金币4948
TA的每日心情 | 开心 2025-1-21 10:02 |
---|
签到天数: 9 天 连续签到: 1 天 [LV.3]偶尔看看II
金牌会员
 
- 积分
- 2939
- 最后登录
- 2025-8-6
|
我们实现了基本的开发环境的配置,并导入了blink的程序,实际控制的是RGB的绿灯,接下来我们进一步的了解一下GPIO的控制,我们都知道blink实际上就是GPIO的开关,我们将通过实际的应用去熟悉GPIO的输出和输出控制。
这里我们徐亚看一下相关硬件外设有哪些?
其一就是LED:
这里我们能够进行控制的是RGB-LED和D14,都是通过拉低来进行点亮,拉高对应的就是熄灭,对应的实际引脚如下:
输入方面对应就是按键:
去除专用功能的按键,我们可以使用SW1和SW2,对应的引脚是:
这些引脚也都有着一些特殊的功能,这个就要根据咱们自己的取舍了。
接下来我们一起看看MCUXpresso IDE中我们如何进行控制,我们还是已上面的blink程序为基础,首先打开外设备配置或者引脚配置可以看到:
下面也可以看到实施的路由信息:
简单的GPIO配置实际上就是引脚的配置,这些都是相通的,配置完成之后就都可以了,使用同样的方法我们把其他部分也都配置一下输出模式,输出没有问题,我们在按键输入配置成外部中断的时候出现了问题,使用自动生成的有一个错误,如下:
<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中的输入中断的方法了,这里面之使用了引脚的配置,二外设的配置都没有用,通过直接代码编码的方式进行配置,我们在进行如下的引脚配置:
- 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;
- }
复制代码 效果如下:
|
|