7 通用数字量输入输出GPIO

文章目录

  • 7.0 GPIO概念
  • 7.1 GPIO工作原理
  • 7.2 GPIO寄存器以及编程
    • 7.2.5 GPIO寄存器编程设置与应用
  • 7.3 GPIO跑马灯
    • 7.3.1 LED 输出初始化
    • 7.3.2 跑马灯输出实验
    • 7.3.3 按键输入实验

7.0 GPIO概念

GPIO(general purpose intput output)是通用输入输出端口的简称,可以通过软件来控制其输入和输出。

  • F28335有88个GPIO口,对应着芯片的88个引脚
  • 88个引脚多是复用的,既可作为输入引脚也可作为输出引脚,即可作为通用IO引脚,也可作为特殊功能口(外设)
  • 可以通过GPIO MUX(输入输出多路选择器)寄存器进行相关配置。

7.1 GPIO工作原理

F28335的88个GPIO分为3组,分为A、B、C。

  • A组包括GPIO0-GPIO31
  • B组包括GPIO32-GPIO63
  • C组包括GPIO64-GPIO87

每个引脚都复用了多个功能,GPIO MUX寄存器用来配置每个引脚的具体功能。

  • 00 为通用IO引脚
  • 01 10 11分别为外设1 2 3引脚

如果某个引脚选择了数字量IO模式

  • 可以通过方向寄存器GPxDIR配置IO方向,既可作为输入引脚也可以作为输出引脚。
  • 可以通过量化寄存器GPxQUAL对输入信号进行量化限制,从而消除数字量IO引脚的早上干扰。

有以下四种方式对GPIO引脚进行读写操作:

  • 可以通过GPxDAT寄存器独立读写IO
  • 可以通过GPxSET寄存器写1对IO进行置位
  • 可以通过GPxCLEAR寄存器写1对IO进行清除
  • 可以通过GPxTOGGLE寄存器写1翻转IO的输出电平
    在这里插入图片描述

如7.1图所示,最左侧为GPIO0-27,上方有个PU,代表是否上拉。

  • 控制寄存器为GPAPUD,0的时候上拉有效,反之无效。

两个三角形控制GPIO作为输入还是输出,上边输入,下边输出。

  • GPIO输入后经过滤波电路。

GPIO输入

  • 数据进入GPADAT寄存器,此时该寄存器为读寄存器,对其进行置位是无效的。
  • GPADAT上方为PIE中断。

GPIO输出

  • 下方三角为输出通道,输出值为GPADAT内的值。
  • GPA-SET可以设置GPADAT的值

GPIO输入受到可编程滤波器的限制。用户可以通过配置GPAQSEL1、GPAQSEL2、GPBQSEL2寄存器选择GPIO引脚的输入限制类型。

7.2 GPIO寄存器以及编程

7.2.5 GPIO寄存器编程设置与应用

GPIO的数据寄存器一共有4类,分别是GPIODAT、GPIOSET、GPIOCLEAR、GPIOTOGGLE。
如果某个GPIO输出设置为输出状态,那么通过GPIODAT相应位写0或者1,此时GPIO就会输出相应的状态。
F28335的88个GPIO分为3组,分为A、B、C。

  • A组GPIO可以通过软件配置为外部中断1、2以及NMI功能。
  • B组GPIO可以通过软件配置为外部中断3、4、5、6、7功能。
  • C组GPIO不可以配置为中断功能。

如果要将某GPIO配置为外部中断功能,下面是设置步骤。

7.3 GPIO跑马灯

7.3.1 LED 输出初始化

void LED_Init(void)
{EALLOW;//关闭写保护SysCtrlRegs.PCLKCR3.bit.GPIOINENCLK = 1;    // 开启GPIO时钟//LED1端口配置GpioCtrlRegs.GPCMUX1.bit.GPIO68=0;//设置为通用GPIO功能    0-通用输出 1-外设1输出 2-外设2输出 3-外设3输出GpioCtrlRegs.GPCDIR.bit.GPIO68=1;//设置GPIO方向为输出    1-输出 0-输入GpioCtrlRegs.GPCPUD.bit.GPIO68=0;//使能GPIO上拉电阻    0-使能上拉 1-禁止上拉GpioDataRegs.GPCSET.bit.GPIO68=1;//设置GPIO输出高电平//GpioDataRegs.GPCCLEAR.bit.GPIO68 = 1; //设置GPIO输出为低电平EDIS;//开启写保护
}

7.3.2 跑马灯输出实验

使用DSP的引脚GPIO0-GPIO5,共阴极连接,当高电平时,LED被点亮;当为低电平时,LED熄灭。
初始化代码:

void LED_GPIO_Config(void)
{EALLOW;GpioCtrlRegs.GPAMUX1.bit.GPIO0=0;//普通IO模式GpioCtrlRegs.GPAPUD.bit.GPIO0=0;//使能内部上拉GpioCtrlRegs.GPADIR.bit.GPIO0=1;//配置成输出GpioCtrlRegs.GPAMUX1.bit.GPIO1=0;//普通IO模式GpioCtrlRegs.GPAPUD.bit.GPIO1=0;//使能内部上拉GpioCtrlRegs.GPADIR.bit.GPIO1=1;//配置成输出GpioCtrlRegs.GPAMUX1.bit.GPIO2=0;//普通IO模式GpioCtrlRegs.GPAPUD.bit.GPIO2=0;//使能内部上拉GpioCtrlRegs.GPADIR.bit.GPIO2=1;//配置成输出GpioCtrlRegs.GPAMUX1.bit.GPIO3=0;//普通IO模式GpioCtrlRegs.GPAPUD.bit.GPIO3=0;//使能内部上拉GpioCtrlRegs.GPADIR.bit.GPIO3=1;//配置成输出GpioCtrlRegs.GPAMUX1.bit.GPIO4=0;//普通IO模式GpioCtrlRegs.GPAPUD.bit.GPIO4=0;//使能内部上拉GpioCtrlRegs.GPADIR.bit.GPIO4=1;//配置成输出GpioDataRegs. GPASET.bit.GPIO0=1; //输出高电平GpioDataRegs. GPASET.bit.GPIO1=1; //输出高电平GpioDataRegs. GPASET.bit.GPIO2=1;GpioDataRegs. GPASET.bit.GPIO3=1;GpioDataRegs. GPASET.bit.GPIO4=1;EDIS;
}

7.3.3 按键输入实验

DSP GPIO作为输入时,硬件自带滤波功能,通过设置指定寄存器达到3次或6次采样滤波
在这里插入图片描述

#define KEY_L1_SetL			(GpioDataRegs.GPBCLEAR.bit.GPIO48=1)
#define KEY_L2_SetL			(GpioDataRegs.GPBCLEAR.bit.GPIO49=1)
#define KEY_L3_SetL			(GpioDataRegs.GPBCLEAR.bit.GPIO50=1)#define KEY_L1_SetH			(GpioDataRegs.GPBSET.bit.GPIO48=1)
#define KEY_L2_SetH			(GpioDataRegs.GPBSET.bit.GPIO49=1)
#define KEY_L3_SetH			(GpioDataRegs.GPBSET.bit.GPIO50=1)#define KEY_H1			(GpioDataRegs.GPADAT.bit.GPIO12)
#define KEY_H2			(GpioDataRegs.GPADAT.bit.GPIO13)
#define KEY_H3			(GpioDataRegs.GPADAT.bit.GPIO14)#define KEY1_PRESS		1
#define KEY2_PRESS		2
#define KEY3_PRESS		3
#define KEY4_PRESS		4
#define KEY5_PRESS		5
#define KEY6_PRESS		6
#define KEY7_PRESS		7
#define KEY8_PRESS		8
#define KEY9_PRESS		9
#define KEY_UNPRESS		0void KEY_Init(void)
{EALLOW;SysCtrlRegs.PCLKCR3.bit.GPIOINENCLK = 1;// 开启GPIO时钟//KEY端口配置/*GPIO输入端*/GpioCtrlRegs.GPAMUX1.bit.GPIO12=0;GpioCtrlRegs.GPADIR.bit.GPIO12=0;    // GPIO设置为输入GpioCtrlRegs.GPAPUD.bit.GPIO12=0;GpioCtrlRegs.GPAMUX1.bit.GPIO13=0;GpioCtrlRegs.GPADIR.bit.GPIO13=0;    // GPIO设置为输入GpioCtrlRegs.GPAPUD.bit.GPIO13=0;GpioCtrlRegs.GPAMUX1.bit.GPIO14=0;GpioCtrlRegs.GPADIR.bit.GPIO14=0;    // GPIO设置为输入GpioCtrlRegs.GPAPUD.bit.GPIO14=0;/*GPIO输出端*/GpioCtrlRegs.GPBMUX2.bit.GPIO48=0;GpioCtrlRegs.GPBDIR.bit.GPIO48=1;    // GPIO设置为输出GpioCtrlRegs.GPBPUD.bit.GPIO48=0;GpioCtrlRegs.GPBMUX2.bit.GPIO49=0;GpioCtrlRegs.GPBDIR.bit.GPIO49=1;    // GPIO设置为输出GpioCtrlRegs.GPBPUD.bit.GPIO49=0;GpioCtrlRegs.GPBMUX2.bit.GPIO50=0;GpioCtrlRegs.GPBDIR.bit.GPIO50=1;    // GPIO设置为输出GpioCtrlRegs.GPBPUD.bit.GPIO50=0;GpioDataRegs.GPBSET.bit.GPIO48=1;GpioDataRegs.GPBSET.bit.GPIO49=1;GpioDataRegs.GPBSET.bit.GPIO50=1;EDIS;
}char KEY_Scan(char mode)    //mode=0 单次扫描    mode=1 循环扫描
{static char keyl1=1;static char keyl2=1;static char keyl3=1;//第1列扫描KEY_L1_SetL;KEY_L2_SetH;KEY_L3_SetH;if(keyl1==1&&(KEY_H1==0||KEY_H2==0||KEY_H3==0)){DELAY_US(10000);    //消抖keyl1=0;if(KEY_H1==0){return KEY1_PRESS;}else if(KEY_H2==0){return KEY4_PRESS;}else if(KEY_H3==0){return KEY7_PRESS;}}else if(KEY_H1==1&&KEY_H2==1&&KEY_H3==1){keyl1=1;}if(mode)keyl1=1;//第2列扫描KEY_L2_SetL;KEY_L1_SetH;KEY_L3_SetH;if(keyl2==1&&(KEY_H1==0||KEY_H2==0||KEY_H3==0)){DELAY_US(10000);//消抖keyl2=0;if(KEY_H1==0){return KEY2_PRESS;}else if(KEY_H2==0){return KEY5_PRESS;}else if(KEY_H3==0){return KEY8_PRESS;}}else if(KEY_H1==1&&KEY_H2==1&&KEY_H3==1){keyl2=1;}if(mode)keyl2=1;//第3列扫描KEY_L3_SetL;KEY_L1_SetH;KEY_L2_SetH;if(keyl3==1&&(KEY_H1==0||KEY_H2==0||KEY_H3==0)){DELAY_US(10000);//消抖keyl3=0;if(KEY_H1==0){return KEY3_PRESS;}else if(KEY_H2==0){return KEY6_PRESS;}else if(KEY_H3==0){return KEY9_PRESS;}}else if(KEY_H1==1&&KEY_H2==1&&KEY_H3==1){keyl3=1;}if(mode)keyl3=1;return KEY_UNPRESS;
}void main()
{int i=0;char key=0;InitSysCtrl();LED_Init();KEY_Init();while(1){key=KEY_Scan(0);switch(key){case KEY1_PRESS: LED2_TOGGLE;break;case KEY2_PRESS: LED3_TOGGLE;break;case KEY3_PRESS: LED4_TOGGLE;break;case KEY4_PRESS: LED5_TOGGLE;break;case KEY5_PRESS: LED6_TOGGLE;break;case KEY6_PRESS: LED7_TOGGLE;break;}i++;if(i%2000==0){LED1_TOGGLE;}DELAY_US(100);}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/173075.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

最火web大屏可视化编辑器

前言: 乐吾乐Le5le大屏可视化设计器,零代码实现物联网、工业智能制造等领域的可视化大屏、触摸屏端UI以及工控可视化的解决方案。同时也是一个Web组态工具,支持2D、3D等多种形式,用于构建具有实时数据展示、监控预警、丰富交互的组…

2009年iMac装64位windows7及win10

2009年iMac装64位windows7及win10 Boot Camp没有“创建 Windows7 或更高版本的安装磁盘”选项 安装完Mac OS系统后,要制作Windows7安装U盘时才发现,Boot Camp没有“创建 Windows7 或更高版本的安装磁盘”选项,搜索到文章:修改Boo…

laravel框架学习

一、文件上传 在控制器中按下面所示书写 public function upload(){$this->domain $_SERVER[HTTP_HOST]; //获取当前域我, 其实这个是不应该写在这儿(应该是一个全局),我只是做个例子。$file $this->require->file(fi…

blender 3D眼球结构

角膜(Cornea):眼球的前部,透明的曲面,负责折射光线。虹膜(Iris):眼睛的颜色部分,控制瞳孔大小以调整进入眼睛的光量。瞳孔(Pupil):虹膜…

Mycat实现读写分离

Mycat实现读写分离 Mycat支持MySQL主从复制状态绑定的读写分离机制。这里实现的也是基于MySQL主从复制的读写分离。 MySQL主从复制配置 首先要配置MySQL的主从复制,这里配置的是一主一次从。可以参考下面的文章。 https://blog.csdn.net/wsb_2526/article/detail…

Zookeeper分布式锁实现Curator十一问

前面我们通过Redis分布式锁实现Redisson 15问文章剖析了Redisson的源码,理清了Redisson是如何实现的分布式锁和一些其它的特性。这篇文章就来接着剖析Zookeeper分布式锁的实现框架Curator的源码,看看Curator是如何实现Zookeeper分布式锁的,以…

OpenMMlab导出yolox模型并用onnxruntime和tensorrt推理

导出onnx文件 直接使用脚本 import torch from mmdet.apis import init_detector, inference_detectorconfig_file ./configs/yolox/yolox_tiny_8xb8-300e_coco.py checkpoint_file yolox_tiny_8x8_300e_coco_20211124_171234-b4047906.pth model init_detector(config_fi…

ARM - AArch64 - 通用寄存器

说明 在深入一点了解了系统调用以及非安全world(REE)/安全world(TEE)切换时参数传递和结果返回的实现原理(通过通用寄存器实现),对通用寄存器的使用有了一个全新的认识,对知识做个总…

MATLAB中corrcoef函数用法

目录 语法 说明 示例 矩阵的随机列 两个随机变量 矩阵的 P 值 相关性边界 NaN 值 corrcoef函数的功能是返回数据的相关系数。 语法 R corrcoef(A) R corrcoef(A,B) [R,P] corrcoef(___) [R,P,RL,RU] corrcoef(___) ___ corrcoef(___,Name,Value) 说明 R corrc…

【海德教育】唐山成人高考艺术类包括哪些专业?

成人高校开设的艺术类招生专业主要有:艺术设计、装饰、装潢、书法、绘画、音乐、美术、戏剧表演、播音、服装设计、摄影等专业。

sebp/elk镜像历史版本

最近因为之前sebp/elk的镜像和容器出现问题而误删了. 新版本随便功能全, 但是配置较为繁琐. 因此想要根据之前的截图找到之前的版本. 但是查看版本需要科学. 因此在花时间研究出来科学的方法之后, 还是决定将历史的版本信息留存下来, 以供后续开发需要 相关官网(需科学上网): s…

1. 图的广度优先遍历

当一道题的AC变成了找不同的时候,一切就开始失去意义。 到底是谁?把Search写成Seacrh,害我一直找不同。 本实验实现邻接表表示下无向图的广度优先遍历。 程序的输入是图的顶点序列和边序列(顶点序列以*为结束标志,边序列以-1,-1…

【洛谷算法题】P5715-三位数排序【入门2分支结构】

👨‍💻博客主页:花无缺 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅! 本文由 花无缺 原创 收录于专栏 【洛谷算法题】 文章目录 【洛谷算法题】P5715-三位数排序【入门2分支结构】🌏题目描述🌏输入格式…

代码随想录-刷题第九天

28. 找出字符串中第一个匹配项的下标 题目链接&#xff1a;28. 找出字符串中第一个匹配项的下标 思路1&#xff1a;先来写一下暴力解法。 时间复杂度O(n*m) class Solution {public int strStr(String haystack, String needle) {// 暴力解法先来一遍for (int i 0; i <…

【Seata源码学习 】篇五 注册分支事务

【Seata源码学习 】篇五 分支事务注册 1.远程服务调用绑定XID 回到事务模版方法类TransactionalTemplate中 beginTransaction(txInfo, tx);Object rs;try {// Do Your Business// 执行执行拦截器链路rs business.execute();} catch (Throwable ex) {// 3. The needed busine…

基于数据挖掘的智能停车场运营数据分析系统(毕业论文)

点击完整下载 基于数据挖掘的智能停车场运营数据分析系统 "A Data Mining-Based Intelligent Parking Lot Operational Data Analysis System" 目录 目录 2 摘要 3 关键词 4 第一章 绪论 4 1.1 研究背景 4 1.2 研究意义 5 1.3 主要研究内容 7 1.4 研究方法与流程 8 1…

基于Java SSM框架+Vue留学生交流互动论坛网站项目【项目源码+论文说明】计算机毕业设计

基于java的SSM框架Vue实现学生交流互动论坛网站演示 摘要 21世纪的今天&#xff0c;随着社会的不断发展与进步&#xff0c;人们对于信息科学化的认识&#xff0c;已由低层次向高层次发展&#xff0c;由原来的感性认识向理性认识提高&#xff0c;管理工作的重要性已逐渐被人们所…

再学Blazor——组件建造者

使用 RenderTreeBuilder 创建组件是 Blazor 的一种高级方案。前几篇文中有这样创建组件的示例 builder.Component<MyComponent>().Build(); &#xff0c;本文主要介绍该高级方案的具体实现&#xff0c;我们采用测试驱动开发&#xff08;TDD&#xff09;方法&#xff0c;大…

Java面试题10

1.MyBatis 中 #{}和 ${}的区别是什么&#xff1f; #{} 是预编译的占位符&#xff0c;MyBatis会将其转化为一个占位符参数&#xff0c;安全性较高&#xff0c;可以防止 SQL注入&#xff1b; ${} 是字符串替换&#xff0c;直接将内容替换到SQL语句中&#xff0c;不会进行参数处理…

【腾讯云 HAI域探秘】基于高性能应用服务器HAI部署的 ChatGLM2-6B模型,我开发了AI办公助手,公司行政小姐姐用了都说好!

目录 前言 一、腾讯云HAI介绍&#xff1a; 1、即插即用 轻松上手 2、横向对比 青出于蓝 3、多种高性能应用部署场景 二、腾讯云HAI一键部署并使用ChatGLM2-6B快速实现开发者所需的相关API服务 1、登录 高性能应用服务 HAI 控制台 2、点击 新建 选择 AI模型&#xff0c;…