[MSPM0开发]之六MSPM0G3507的GPIO输入、输出、中断使用

  • 一、MSPM0G3507 GPIO外设概述
  • 二、 MSPM0G3507 GPIO结构框图
  • 三、driverLib库例程
  • 四、操作示例
    • 4.1 输出控制库函数操作
    • 4.2 输入查询方式操作
    • 4.3 输入中断方式操作

一、MSPM0G3507 GPIO外设概述

GPIO提供了一种通过芯片引脚读写数字信号(0/1即低电平/高电平)的方法
同时还提供了一种芯片在低功耗模式时用于唤醒芯片的方法
GPIO 模块的特性包括:
• 从 CPU 访问 MMR 的零等待状态
• 无需在软件中使用“读取、修改、写入”结构, 即可设置/清零/切换多个位
• 无需在软件中使用“读取、修改、写入”结构, 即可直接写入到各个 GPIO 输出位 (DOUT)
• 无需在软件中使用屏蔽, 即可直接读取各个 GPIO 输入位 (DIN) 的比较结果
DOUT 可供 DMA 用于在指定引脚上生成预定义的输出序列
快速唤醒功能支持通过任意 GPIO 端口从 STOP 和 STANDBY 模式进行低功耗唤醒
• 用户控制的输入滤波( 可按 IO 配置)
• 通过事件发布者事件订阅者与设备事件结构互连( 仅限 GPIOA 实例

二、 MSPM0G3507 GPIO结构框图

结构框图

三、driverLib库例程

例程

四、操作示例

硬件原理图
按键
LED
配置使用内部高速时钟,MCLK=32MHZ

序号 输入/输出 引脚 功能
1 输出 PB22 LED
2 输入 PB21 BUTTON1
3 输入 PB20 BUTTON2

4.1 输出控制库函数操作

sysconfig配置:
时钟2
时钟
GPIO配置:
配置
按键1

测试代码:

int main(void) {
  SYSCFG_DL_init();
  systick_init(32000); // systick从sysconfig中分离,使用自定义函数实现其初始化、计数、延时等操作。 可以参考此链接:[https://blog.csdn.net/wo4fisher/article/details/147166352?spm=1011.2415.3001.5331](https://blog.csdn.net/wo4fisher/article/details/147166352?spm=1011.2415.3001.5331)

  DL_GPIO_setPins(GPIO_GRP_LED_PORT, GPIO_GRP_LED_PIN_LED_PIN);
  delay_ms((2000));
  DL_GPIO_clearPins(GPIO_GRP_LED_PORT, GPIO_GRP_LED_PIN_LED_PIN);
  delay_ms((2000));
  DL_GPIO_setPins(GPIO_GRP_LED_PORT, GPIO_GRP_LED_PIN_LED_PIN);
  delay_ms((2000));
  DL_GPIO_clearPins(GPIO_GRP_LED_PORT, GPIO_GRP_LED_PIN_LED_PIN);
  delay_ms((2000));
  for (int i = 0; i < 5; i++) {
    DL_GPIO_togglePins(GPIO_GRP_LED_PORT, GPIO_GRP_LED_PIN_LED_PIN);
    delay_ms((1000));
  }

  while (1) {
  }
}

4.2 输入查询方式操作

在4.1基础上添加轮训检测按键代码,检测到按键按下后,LED翻转:

int main(void) {
  SYSCFG_DL_init();
  systick_init(32000);

  DL_GPIO_setPins(GPIO_GRP_LED_PORT, GPIO_GRP_LED_PIN_LED_PIN);
  delay_ms((2000));
  DL_GPIO_clearPins(GPIO_GRP_LED_PORT, GPIO_GRP_LED_PIN_LED_PIN);
  delay_ms((2000));
  DL_GPIO_setPins(GPIO_GRP_LED_PORT, GPIO_GRP_LED_PIN_LED_PIN);
  delay_ms((2000));
  DL_GPIO_clearPins(GPIO_GRP_LED_PORT, GPIO_GRP_LED_PIN_LED_PIN);
  delay_ms((2000));
  for (int i = 0; i < 5; i++) {
    DL_GPIO_togglePins(GPIO_GRP_LED_PORT, GPIO_GRP_LED_PIN_LED_PIN);
    delay_ms((1000));
  }

  while (1) {
    if (!DL_GPIO_readPins(GPIO_GRP_SW_PORT, GPIO_GRP_SW_PIN_SW1_PIN)) {
      DL_GPIO_togglePins(GPIO_GRP_LED_PORT, GPIO_GRP_LED_PIN_LED_PIN);
      while (!DL_GPIO_readPins(GPIO_GRP_SW_PORT, GPIO_GRP_SW_PIN_SW1_PIN))
        ;
    }
  }
}

4.3 输入中断方式操作

这里按键用外接按键,连接到PB20.
通过查询手册"cpu和中断",可知,gpio外设中断属于INT_GROUP1中断,其中断服务函数通过查询例程gpio_input_capture得到。
GPIO中断
sysconfig

引脚配置为输入中断过程如下:

//仅保留输入中断引脚部分
SYSCONFIG_WEAK void SYSCFG_DL_GPIO_init(void)
{
    DL_GPIO_initDigitalInputFeatures(GPIO_GRP_SW_PIN_SW2_IOMUX,
		 DL_GPIO_INVERSION_DISABLE, DL_GPIO_RESISTOR_NONE,
		 DL_GPIO_HYSTERESIS_DISABLE, DL_GPIO_WAKEUP_DISABLE);

    DL_GPIO_setUpperPinsPolarity(GPIOB, DL_GPIO_PIN_21_EDGE_FALL |
		DL_GPIO_PIN_20_EDGE_FALL);
    DL_GPIO_clearInterruptStatus(GPIOB, GPIO_GRP_SW_PIN_SW1_PIN |
		GPIO_GRP_SW_PIN_SW2_PIN);
    DL_GPIO_enableInterrupt(GPIOB, GPIO_GRP_SW_PIN_SW1_PIN |
		GPIO_GRP_SW_PIN_SW2_PIN);

}

在main.c中硬件初始化完成后,开启gpio输入中断

NVIC_EnableIRQ(GPIO_GRP_SW_INT_IRQN);

编写输入中断服务函数:
通过上文中的表格,GROUP1_IRQ是一组中断请求事件的共用中断服务函数入口,因此,进入中断后,要进一步判断是哪一个中断源,如果是GPIO,如果有多个GPIO中断,还要进一步判断对应引脚状态。

void GROUP1_IRQHandler(void) {
  switch (DL_Interrupt_getPendingGroup(DL_INTERRUPT_GROUP_1)) {
  case GPIO_GRP_SW_INT_IIDX:
    DL_GPIO_togglePins(GPIO_GRP_LED_PORT, GPIO_GRP_LED_PIN_LED_PIN);
    break;
  }
}
Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐