这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 活动中心 » 板卡试用 » 【FRDM-MCXW71测评】3、GPIO与基本定时

共1条 1/1 1 跳转至

【FRDM-MCXW71测评】3、GPIO与基本定时

高工
2025-05-22 12:57:38     打赏

        我们在此进行GPIO(通用输入输出端口)与定时器的综合测试,旨在通过二者的融合展现其协同工作能力。定时器作为内部核心模块,在仅执行定时功能时,理论上无需依赖外部实际端口。同时,定时器与其他外设的集成度较高,易于实现多功能融合。例如,开发板上的初始演示程序——LED翻转效果,传统上采用延时方法实现,现可通过定时器实现非阻塞模式的LED闪烁,从而提升系统效率与响应速度。

        GPIO的功能专注于特定引脚,涵盖输入与输出两大方面。输入功能用于采集外部器件的状态信息,而输出功能则实现对外部器件的控制操作。本开发板集成了两个可控LED作为外部器件实例(一个RGB),以及多个用户按键以进行输入状态检测。

        LED的输出控制就比较简单了,输出的电平不是高电平就是低电平,这个要和LED的状态相关联,我们看一下LED的原理图:

image.png

        上图可以查看出,基本上都是低电平导通的控制,不够在这里我们还不能完全定位到控制引脚,需要进一步挖一下:

image.png

        这里可以看到每一个LED的控制引脚对应的引脚名,RGB_G ——PTA19,RGB_B ——PTA20,RGB_R ——PTA21,LED_B ——PTC1.用户按键作为输入检测,原理图如下:image.png

        有一些引脚是专用功能的,这里用户按键咱们选择SW2进行控制:

image.png

        按键引脚连接的是PTC6,如果我们配置为普通输入,采集的状态会随着按键的状态时时变化,我们操作一次按键实际上希望获取一次操作的信号就好了,这就涉及到了一种外部中断的采集方式,通过上升沿或者下降沿会触发一次,不然一直进行扫描会比较占资源。按键外部上拉,另一端是地,我们就需要配置成下降沿触发外部中断。

        MCUXpresso IDE是可以进行代码初始化配置我们,我们接下来就进行四个LED引脚和按键引脚以及定时器的基本配置。

        添加LED的引脚:

image.png

        使用配置工具添加外设——LPTMR,并配置为基础定时器功能(10ms):


image.png

        加下来就是中断的处理了:

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"。

        上面的程序都是中断处理,按键切换闪烁的灯,效果如下:

image.png

        可以看到通过按键的控制进行不同的灯进行切换,说实话这个RGB的灯着实有点晃人。





关键词: FRDM-MCXW71     定时     测评    

共1条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]