我们实现了基本的开发环境的配置,并导入了blink的程序,实际控制的是RGB的绿灯,接下来我们进一步的了解一下GPIO的控制,我们都知道blink实际上就是GPIO的开关,我们将通过实际的应用去熟悉GPIO的输出和输出控制。
这里我们徐亚看一下相关硬件外设有哪些?
其一就是LED:
这里我们能够进行控制的是RGB-LED和D14,都是通过拉低来进行点亮,拉高对应的就是熄灭,对应的实际引脚如下:
去除专用功能的按键,我们可以使用SW1和SW2,对应的引脚是:
这些引脚也都有着一些特殊的功能,这个就要根据咱们自己的取舍了。
接下来我们一起看看MCUXpresso IDE中我们如何进行控制,我们还是已上面的blink程序为基础,首先打开外设备配置或者引脚配置可以看到:
下面也可以看到实施的路由信息:
简单的GPIO配置实际上就是引脚的配置,这些都是相通的,配置完成之后就都可以了,使用同样的方法我们把其他部分也都配置一下输出模式,输出没有问题,我们在按键输入配置成外部中断的时候出现了问题,使用自动生成的有一个错误,如下:
函数的输入参数类型不符,通过不断的尝试发现,如果输出相同的类型信息,就不能触发中断,如果通过初始化的代码,运行后就会报错,通过检错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; }
效果如下: