[MSPM0开发]MSPM0G3507之GPIO输入、输出、中断使用(基于driverlib库)
[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库例程
四、操作示例
硬件原理图
配置使用内部高速时钟,MCLK=32MHZ
序号 | 输入/输出 | 引脚 | 功能 |
---|---|---|---|
1 | 输出 | PB22 | LED |
2 | 输入 | PB21 | BUTTON1 |
3 | 输入 | PB20 | BUTTON2 |
4.1 输出控制库函数操作
sysconfig配置:
GPIO配置:
测试代码:
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得到。
引脚配置为输入中断过程如下:
//仅保留输入中断引脚部分
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;}
}