我们在此进行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"。
上面的程序都是中断处理,按键切换闪烁的灯,效果如下:

我要赚赏金
