IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 嵌入式 -> MSP432P401R学习:GPIO(输入、输出、中断) -> 正文阅读

[嵌入式]MSP432P401R学习:GPIO(输入、输出、中断)

  开发环境搭建完成后,就可以开始学习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的话,学习这个学起来会可能轻松一些。

  嵌入式 最新文章
基于高精度单片机开发红外测温仪方案
89C51单片机与DAC0832
基于51单片机宠物自动投料喂食器控制系统仿
《痞子衡嵌入式半月刊》 第 68 期
多思计组实验实验七 简单模型机实验
CSC7720
启明智显分享| ESP32学习笔记参考--PWM(脉冲
STM32初探
STM32 总结
【STM32】CubeMX例程四---定时器中断(附工
上一篇文章      下一篇文章      查看所有文章
加:2021-09-03 12:04:50  更:2021-09-03 12:05:09 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 0:23:35-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码