我们实现了基本的开发环境的配置,并导入了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;
}效果如下:

我要赚赏金
