我们在此进行GPIO(通用输入输出端口)与定时器的综合测试,旨在通过二者的融合展现其协同工作能力。定时器作为内部核心模块,在仅执行定时功能时,理论上无需依赖外部实际端口。同时,定时器与其他外设的集成度较高,易于实现多功能融合。例如,开发板上的初始演示程序——LED翻转效果,传统上采用延时方法实现,现可通过定时器实现非阻塞模式的LED闪烁,从而提升系统效率与响应速度。
GPIO的功能专注于特定引脚,涵盖输入与输出两大方面。输入功能用于采集外部器件的状态信息,而输出功能则实现对外部器件的控制操作。本开发板集成了两个可控LED作为外部器件实例(一个RGB),以及多个用户按键以进行输入状态检测。
LED的输出控制就比较简单了,输出的电平不是高电平就是低电平,这个要和LED的状态相关联,我们看一下LED的原理图:
上图可以查看出,基本上都是低电平导通的控制,不够在这里我们还不能完全定位到控制引脚,需要进一步挖一下:
这里可以看到每一个LED的控制引脚对应的引脚名,RGB_G ——PTA19,RGB_B ——PTA20,RGB_R ——PTA21,LED_B ——PTC1.用户按键作为输入检测,原理图如下:
有一些引脚是专用功能的,这里用户按键咱们选择SW2进行控制:
按键引脚连接的是PTC6,如果我们配置为普通输入,采集的状态会随着按键的状态时时变化,我们操作一次按键实际上希望获取一次操作的信号就好了,这就涉及到了一种外部中断的采集方式,通过上升沿或者下降沿会触发一次,不然一直进行扫描会比较占资源。按键外部上拉,另一端是地,我们就需要配置成下降沿触发外部中断。
MCUXpresso IDE是可以进行代码初始化配置我们,我们接下来就进行四个LED引脚和按键引脚以及定时器的基本配置。
添加LED的引脚:
使用配置工具添加外设——LPTMR,并配置为基础定时器功能(10ms):
加下来就是中断的处理了:
void BOARD_SW_IRQ_HANDLER(void) { #if (defined(FSL_FEATURE_PORT_HAS_NO_INTERRUPT) && FSL_FEATURE_PORT_HAS_NO_INTERRUPT) || \ (!defined(FSL_FEATURE_SOC_PORT_COUNT)) /* Clear external interrupt flag. */ GPIO_GpioClearInterruptFlags(BOARD_SW_GPIO, 1U << BOARD_SW_GPIO_PIN); #else /* Clear external interrupt flag. */ GPIO_PortClearInterruptFlags(BOARD_SW_GPIO, 1U << BOARD_SW_GPIO_PIN); #endif /* Change state of button. */ LED_Mode++; if(LED_Mode >= 4) LED_Mode = 0; g_ButtonPress = true; SDK_ISR_EXIT_BARRIER; } void LPTMR0_IRQHANDLER(void) { uint32_t intStatus; /* Reading all interrupt flags of status register */ intStatus = LPTMR_GetStatusFlags(LPTMR0_PERIPHERAL); LPTMR_ClearStatusFlags(LPTMR0_PERIPHERAL, intStatus); /* Place your code here */ LED_TimeCnt++; if(LED_TimeCnt >= 50) { LED_TimeCnt = 0; if(LED_Mode != LED_Modeing){ 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); GPIO_PortSet(BOARD_INITPINS_LED_RED_GPIO, 1U << BOARD_INITPINS_LED_RED_PIN); GPIO_PortSet(BOARD_INITPINS_LED_B_GPIO, 1U << BOARD_INITPINS_LED_B_PIN); LED_Modeing = LED_Mode; } switch(LED_Modeing){ case 0: GPIO_PortToggle(BOARD_INITPINS_LED_GREEN_GPIO, 1U << BOARD_INITPINS_LED_GREEN_PIN); break; case 1: GPIO_PortToggle(BOARD_INITPINS_LED_BLUE_GPIO, 1U << BOARD_INITPINS_LED_BLUE_PIN); break; case 2: GPIO_PortToggle(BOARD_INITPINS_LED_RED_GPIO, 1U << BOARD_INITPINS_LED_RED_PIN); break; case 3: GPIO_PortToggle(BOARD_INITPINS_LED_B_GPIO, 1U << BOARD_INITPINS_LED_B_PIN); break; default: break; } } /* Add for ARM errata 838869, affects Cortex-M4, Cortex-M4F Store immediate overlapping exception return operation might vector to incorrect interrupt. */ #if defined __CORTEX_M && (__CORTEX_M == 4U) __DSB(); #endif }
这里需要注意一下,我们通过外设配置工具生成代码后,需要在主代码添加外设头文件#include "peripherals.h"。
上面的程序都是中断处理,按键切换闪烁的灯,效果如下: