MSP432P401R学习:GPIO(输入、输出、中断)

本文介绍了MSP432P401R单片机的开发环境搭建及基本操作,包括如何使用库函数控制GPIO点亮LED,实现LED闪烁和RGB三色LED的混合颜色。接着,文章讲解了通过按键输入和中断处理来控制LED的亮灭,解决了按键抖动问题,并展示了中断在单片机程序设计中的应用。整个过程由浅入深,适合初学者入门。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  开发环境搭建完成后,就可以开始学习MSP432401R的开发使用了。在开始学习之前最好将芯片手册、开发板手册、SDK手册下载好,想看的时候就可以随时打开来看,快速上手。CCS里的Resource Explorer也是比较方便的工具,把所有相关的文档、例程都整合在了一起,比较方便查看。

输出(OUTPUT)

  和学习其他的单片机一样,就从点亮LED开始。MSP432P401R launchpad板子上自带了一个红色LED和一个RGB LED,分别接在P1.0和P2.0、P2.1、P2.2口,如果想单独使用这几个GPIO的话,可以将跳线帽拿掉,使之不与LED相连。

    接下来就尝试用代码来点亮这几个LED。之前也在网上看过寄存器版的编程,但是在不是很熟悉而且英语不太好的情况下,还是选择库函数来进行编程,相对而言比较简单而且比较好理解。

  库函数的GPIO相关函数也并不是很多,一些看函数名就能够知道相应的功能,点亮LED只需要用到几个函数,下面是相关代码。

#include "msp.h"
#include <ti/devices/msp432p4xx/driverlib/driverlib.h>

void main(void)
{
    volatile uint32_t i;
	WDT_A->CTL = WDT_A_CTL_PW | WDT_A_CTL_HOLD;		// 关闭看门狗定时器
	GPIO_setAsOutputPin(GPIO_PORT_P1, GPIO_PIN0);   // 将引脚P1.0设置为输出模式
	while(1)
	{
	    // 翻转P1.0引脚电平
	    GPIO_toggleOutputOnPin(GPIO_PORT_P1, GPIO_PIN0);
	    // Delay
	    for(i=100000; i>0; i--);
	    }
}

   以上代码实现的效果是LED每隔一定时间闪烁,通过GPIO_toggleOutputOnPin(GPIO_PORT_P1, GPIO_PIN0);来实现。下面用电平设定函数来进行实现。

#include "msp.h"
#include <ti/devices/msp432p4xx/driverlib/driverlib.h>

void main(void)
{
    volatile uint32_t i;
	WDT_A->CTL = WDT_A_CTL_PW | WDT_A_CTL_HOLD;		
	GPIO_setAsOutputPin(GPIO_PORT_P1, GPIO_PIN0);
	while(1)
	{
	    GPIO_setOutputHighOnPin(GPIO_PORT_P1, GPIO_PIN0);  //引脚P1.0电平拉高
	    for(i=100000; i>0; i--);
	    GPIO_setOutputLowOnPin(GPIO_PORT_P1, GPIO_PIN0);   //引脚P1.0电平拉低
	    for(i=100000; i>0; i--);
	    }
}

  以上代码依旧可以实现让LED闪烁的功能。

   接下来尝试点亮RGB三色LED,原理和点亮红色LED相同,但是可以混合出来不同的颜色。

#include "msp.h"
#include <ti/devices/msp432p4xx/driverlib/driverlib.h>

void main(void)
{
    volatile uint32_t i;
	WDT_A->CTL = WDT_A_CTL_PW | WDT_A_CTL_HOLD;		// stop watchdog timer
	GPIO_setAsOutputPin(GPIO_PORT_P2, GPIO_PIN0);
	GPIO_setAsOutputPin(GPIO_PORT_P2, GPIO_PIN1);
	GPIO_setAsOutputPin(GPIO_PORT_P2, GPIO_PIN2);
	while(1)
	{
	    GPIO_setOutputHighOnPin(GPIO_PORT_P2, GPIO_PIN0);
	    for(i=100000; i>0; i--);
	    GPIO_setOutputLowOnPin(GPIO_PORT_P2, GPIO_PIN0);
	    for(i=100000; i>0; i--);
	    GPIO_setOutputHighOnPin(GPIO_PORT_P2, GPIO_PIN1);
	    for(i=100000; i>0; i--);
	    GPIO_setOutputLowOnPin(GPIO_PORT_P2, GPIO_PIN1);
	    for(i=100000; i>0; i--);
	    GPIO_setOutputHighOnPin(GPIO_PORT_P2, GPIO_PIN2);
	    for(i=100000; i>0; i--);
	    GPIO_setOutputLowOnPin(GPIO_PORT_P2, GPIO_PIN2);
	    for(i=100000; i>0; i--);
	    GPIO_setOutputHighOnPin(GPIO_PORT_P2, GPIO_PIN0);
	    for(i=100000; i>0; i--);
	    GPIO_setOutputHighOnPin(GPIO_PORT_P2, GPIO_PIN1);
	    for(i=100000; i>0; i--);
	    GPIO_setOutputHighOnPin(GPIO_PORT_P2, GPIO_PIN2);
	    for(i=100000; i>0; i--);
	}
}

 输入(INPUT)

  这里使用按键来实现引脚输入功能,通过判断按键的输入来控制LED的亮灭。根据原理图可以得知两个按键一个连接在P1.1上,另一个连接在P1.4上。但是外部的连接电路只有孤零零的一个按键,显然这是不够的,需要一个上拉电阻来保持初始的高电平状态,不然引脚会处于一个不确定的状态,不便判断按键是否按下,这就需要使用芯片的内部上拉电阻。

#include "msp.h"
#include <ti/devices/msp432p4xx/driverlib/driverlib.h>

void main(void)
{
    volatile uint32_t i;
    uint8_t keyvalue = 1;
	WDT_A->CTL = WDT_A_CTL_PW | WDT_A_CTL_HOLD;		// stop watchdog timer
	GPIO_setAsOutputPin(GPIO_PORT_P1, GPIO_PIN0);   // 设置引脚P1.0为输出模式
	GPIO_setAsInputPinWithPullUpResistor(GPIO_PORT_P1, GPIO_PIN1);  // 设置引脚P1.1为上拉输入模式

	while(1)
	{
	    keyvalue = GPIO_getInputPinValue(GPIO_PORT_P1, GPIO_PIN1);
	    if(keyvalue == 0)
	        GPIO_setOutputHighOnPin(GPIO_PORT_P1, GPIO_PIN0);
	    else
	        GPIO_setOutputLowOnPin(GPIO_PORT_P1, GPIO_PIN0);
	}
}

  按下按键LED亮起,松开即熄灭。但是按键或多或少都会存在抖动的问题,按键消抖就不再赘述了。加上延时即可,自行修改代码。

中断(INTERRUPT)

   由于一直判断引脚输入电平会使得单片机无法运行其他的程序,因此需要使用中断的方式来进行。以下代码实现的功能是按下按键,红色LED状态变化一次,相比与之前的按键控制LED,单片机可以执行其他的任务,而不是一直在等待按键被按下。

#include "msp.h"
#include <ti/devices/msp432p4xx/driverlib/driverlib.h>
void PORT1_IRQHandler(void);    // 中断函数声明
void main(void)
{
	WDT_A->CTL = WDT_A_CTL_PW | WDT_A_CTL_HOLD;		// stop watchdog timer
	GPIO_setAsOutputPin(GPIO_PORT_P1, GPIO_PIN0);   // 设置引脚P1.0为输出模式
	GPIO_setAsInputPinWithPullUpResistor(GPIO_PORT_P1, GPIO_PIN1);  // 设置引脚P1.1为上拉输入模式
	GPIO_interruptEdgeSelect(GPIO_PORT_P1, GPIO_PIN1,GPIO_HIGH_TO_LOW_TRANSITION);  //中断跳变沿选择,由于按键没有按下时为高电平,所以是高电平变为低电平
	GPIO_clearInterruptFlag(GPIO_PORT_P1,GPIO_PIN1);  // 清除中断标志
	GPIO_registerInterrupt(GPIO_PORT_P1,PORT1_IRQHandler);  // 注册中断函数
	GPIO_enableInterrupt(GPIO_PORT_P1, GPIO_PIN1);   // 中断使能

	while(1)
	{
	    ;
	}

}

void PORT1_IRQHandler(void)    // 中断函数
{
    int i = 0;
    if(GPIO_getInterruptStatus(GPIO_PORT_P1, GPIO_PIN1) == GPIO_PIN1)    // 判断中端口
    {
        GPIO_clearInterruptFlag(GPIO_PORT_P1, GPIO_PIN1);
        for(i=0;i<100;i++);    //消抖
        if(GPIO_getInputPinValue(GPIO_PORT_P1, GPIO_PIN1) == 0)
        {
            GPIO_toggleOutputOnPin(GPIO_PORT_P1, GPIO_PIN0);
        }

    }
}

总结

  GPIO的使用是每款单片机最基础而且最重要的功能,这些库函数为我们编写代码提供了很大的便利,不需要再去艰难地查找芯片手册查看寄存器的每个位的功能。初步学下来发现MSP432的编程方式和STM32的非常的相似,如果之前学习过SMT32的话,学习这个学起来会可能轻松一些。

<think>我们正在讨论的是TI(德州仪器)的Code Composer Studio(CCS)中关于GPIO配置的一个术语:'5V Tolerant Open Drain'。这个术语实际上与微控制器的GPIO(通用输入输出)引脚配置有关,而不是CCS特有的功能。CCS作为开发环境,允许开发者配置这些引脚特性。下面我将详细解释: 1. **开漏输出(Open Drain)**: - 开漏输出是一种输出模式,在这种模式下,输出级晶体管(通常是MOSFET)的漏极(drain)是开路的,即没有内部上拉电阻连接到电源。 - 当晶体管导通时,引脚被拉低到地(低电平);当晶体管关闭时,引脚处于高阻态(悬空)。因此,为了输出电平,必须外接一个上拉电阻连接到所需的电源电压。 - 开漏输出常用于以下场景: - 实现电平转换(例如,3.3V器件与5V器件通信)。 - 总线通信(如I2C、1-Wire等),允许多个设备共享同一根线而不发生冲突。 2. **5V耐受(5V Tolerant)**: - 5V耐受是指即使引脚上被施加5V电压,也不会损坏器件。这对于工作电压为3.3V的微控制器非常重要,因为其I/O电压通常不能超过其电源电压(如3.3V+10%)。 - 5V耐受的引脚内部有保护电路(如二极管钳位或专用结构),允许在输入模式下承受5V电压而不被损坏。 3. **组合:5V耐受开漏输出(5V Tolerant Open Drain)**: - 这种配置意味着: - 引脚被配置为开漏输出模式(需要外接上拉电阻)。 - 同时,该引脚具有5V耐受能力,即当外接上拉电阻连接到5V电源时,即使微控制器工作在3.3V,该引脚也能安全地输出电平(内部MOSFET拉低)和高电平(由外部5V上拉电阻提供5V高电平),并且不会损坏芯片。 - 典型应用:一个3.3V的微控制器需要与5V器件进行通信(如驱动5V逻辑的器件或与5V系统连接),此时就可以使用5V耐受开漏输出模式,并通过一个上拉电阻连接到5V电源。这样,当输出电平时,引脚被拉低到0V(由微控制器内部完成);当输出电平时,引脚被外部上拉电阻拉到5V(微控制器内部MOSFET关闭,引脚悬空)。由于引脚具有5V耐受能力,所以5V电压不会损坏微控制器。 4. **在CCS中的配置**: - 在CCS中,当你配置GPIO引脚时,可能会看到这个选项。它通常出现在引脚配置工具(如PinMux工具)或驱动库的配置函数中。例如,在TI的驱动库中,可能会有类似`GPIO_setConfig()`的函数,其中可以设置引脚为开漏输出模式,并启用5V耐受(如果硬件支持)。 5. **电气特性**: - 在开漏输出模式下,输出电平时,电流从外部电路流入引脚(灌电流),此时微控制器内部MOSFET导通,引脚电压接近0V。 - 输出电平时,内部MOSFET关闭,引脚电压由外部上拉电阻连接的电源电压决定(如5V)。 - 5V耐受能力保证了当引脚电压被外部拉高到5V时,不会损坏微控制器内部电路。 6. **注意事项**: - 必须外接上拉电阻,否则无法输出电平。 - 上拉电阻的阻值需要根据通信速率和负载电流来选择(通常为1kΩ到10kΩ)。 - 5V耐受通常只针对输入模式,但在开漏输出模式下,当输出电平时,引脚实际上处于输入模式(因为内部MOSFET关闭,引脚由外部电路控制),所以5V耐受能力此时保护了引脚。 7. **应用实例**: - I2C总线:I2C总线要求开漏输出,并且常常需要电平转换(例如,主控3.3V,从设备5V)。 - 与5V TTL逻辑器件通信。 总结:在TI的CCS中配置GPIO为'5V Tolerant Open Drain',意味着你设置了一个具有5V电压承受能力的开漏输出引脚,它允许你在3.3V微控制器系统中安全地与5V器件通信。 相关问题: 1. 开漏输出和推挽输出有什么区别? 2. 如何为开漏输出选择合适的上拉电阻值? 3. 5V耐受引脚在输入模式下如何工作? 4. 在TI的CCS中如何配置一个GPIO引脚为5V耐受开漏输出?</think>### 5V耐受开漏输出(5V Tolerant Open Drain)技术解析 在TI Code Composer Studio(CCS)的GPIO配置中,"5V耐受开漏输出"是一种特殊的引脚工作模式,结合了**电压容错能力**和**开漏电路结构**两大特性。其技术含义如下: #### 1. 开漏输出(Open Drain)特性 - **电路结构**:输出级仅包含下拉MOS管(无上拉管),形成"漏极开路"结构: ```mermaid graph LR A[MCU内部] --> B[MOSFET栅极] B --> C[漏极开路] C --> D[外部上拉电阻] D --> E[Vcc_ext] ``` - **工作方式**: - 输出0:MOS管导通,引脚拉低至GND - 输出1:MOS管关断,引脚呈高阻态(需外部上拉) - **优势**: - 支持**电压域转换**(如3.3V MCU驱动5V设备) - 实现**总线仲裁**(多设备共享总线) - 减少**电平冲突**风险 #### 2. 5V耐受(5V Tolerant)特性 - **保护机制**: - 内置高压保护二极管 - 特殊栅氧层设计(厚氧化层) - **电气参数**: | 参数 | 典型值 | 意义 | |------|--------|------| | 最大耐受电压 | 5.5V | 引脚可承受的瞬时峰值 | | 输入电平阈值 | 0.7×VDD | 识别逻辑1的门限 | | 钳位电流 | 20mA | ESD保护能力 | - **应用场景**: $$V_{in\_max} = V_{DD} + 0.3V + \Delta V_{tolerance}$$ 其中$\Delta V_{tolerance}$是设计裕量(通常≥2V) #### 3. 组合优势:5V耐受开漏输出 1. **电平转换实例**: ```mermaid graph LR MCU[3.3V MCU] -- 5V耐受开漏 -->|SDA/SCL| 5V[5V I2C设备] MCU -- 外部上拉到5V --> PU[上拉电阻] ``` - 当MCU输出0时:MOS导通,总线拉低 - 当MCU输出1时:MOS关断,总线被外部5V上拉 - 保护机制确保5V电压不会损坏3.3V芯片 2. **设计要点**: - **必须外接上拉电阻**:阻值计算: $$R_{pullup} = \frac{V_{DD\_ext} - V_{OL}}{I_{OL}}$$ (典型值1.5-10kΩ) - **总线电容限制**:上升时间: $$t_r = 2.2 \times R_{pullup} \times C_{bus}$$ - **ESD保护**:耐受8kV HBM(人体模型)静电 #### 4. CCS中的配置方法 1. **PinMux工具配置**: - 选择引脚功能为GPIO - 设置"I/O Type"为**Open Drain** - 勾选**5V Tolerant**选项 ```c // 生成的配置代码示例 GPIO_setConfig(CONFIG_GPIO_0, GPIO_CFG_OUT_OD_NOPULL | GPIO_CFG_5VT); ``` 2. **寄存器级配置**: ```c // 以TI C2000系列为例 GPIO_SetupPinOptions(12, GPIO_OUTPUT, GPIO_OPENDRAIN); // 开漏模式 GPIO_Enable5V(12, true); // 使能5V耐受 ``` #### 5. 典型应用场景 1. **混合电压系统**:3.3V MCU与5V传感器通信 2. **I2C/SMBus总线**:支持多主设备仲裁 3. **热插拔接口**:防止电源序列异常损坏 4. **工业控制**:抗高压干扰场景 > 在调试时,可通过CCS的GPIO寄存器视图验证配置状态[^3],或使用逻辑分析仪捕获实际波形。 --- ### 相关问题 1. 开漏输出与推挽输出的功耗有何差异? 2. 如何计算I2C总线的最大允许电容值? 3. 5V耐受引脚能否直接输入5V信号? 4. 在CCS中如何动态切换GPIO输出模式? [^1]: 该模式特别适用于需要跨电压域通信的嵌入式系统设计。 [^2]: 在复杂电磁环境中,5V耐受设计可显著提升系统鲁棒性。 [^3]: CCS的寄存器视图可实时监控GPIO状态寄存器值。
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值