GPIO寄存器原理与操作
一、GPIO内部结构
输出数据:从芯片内部到芯片I/O端口
方式一:通过写操作直接控制位设置/清除寄存器而后到输出数据寄存器
方式二:通过读写操作直接到达输出数据寄存器
两种方式到达输出数据寄存器后到达输出控制(即一个锁存器),通过输出控制,可改变输出信号值。
eg:输出数据寄存器向输出控制(锁存器)输出信号1,则P-MOS处信号为1,N-MOS处信号为0,则输出Vdd高电平(3.3V),反之,输出数据寄存器向输出控制(锁存器)输出信号0,则P-MOS处信号为0,N-MOS处信号为1,则输出Vss低电平。
输入数据:从芯片I/O端口到芯片内部(保护二极管可防止输入电平过高或过低对芯片内部电路造成损坏)
通用功能I/O(GPIO)和复用功能I/O(APIO)
GPIO功能描述:每个GPIO端口有两个32位配置寄存器(GPIOx_CRL,GPIOx
_CRH,即上文所说的控制寄存器),两个32位数据寄存器(GPIOx_IDR,GPIOx_ODR),一个32位置位/复位寄存器(GPIOx_BSRR),一个16位复位寄存器(GPIOx_BRR)和一个32位锁定寄存器(GPIOx_LCKR)。
根据数据手册中列出的每个I/O端口的特定硬件特征,GPIO端口的每个位可以由软件分别配置完成多种模式。
输入浮空、输入上拉、输入下拉、模拟输入、
开漏输出、推挽输出(P-MOS、N-MOS均正常工作)、推挽式复用功能、开漏式复用功能
每个I/O端口位可以自由编程,然而I/O端口寄存器必需按32位字被访问(不允许半字或者字节访问),GPIOx_BSRR和GPIOx_BRR允许对任何GPIO寄存器的读/更改的独立访问,这样,在读和更改访问之间产生IRQ时不会发生危险。
(CNF0最后一行应为1、0)
通用I/O(GPIO)
复位期间和刚复位后,复用功能未开启,I/O端口被配制成浮空输入模式(CNFx[1:0] = 01b,MODE[1:0] = 00b)
复位后,JTAG引脚被置于输入上拉或下拉模式
PA15:JTD1置于上拉模式
PA14:JTCK置于下拉模式
PA13:JTMS置于上拉模式
PB4:JNTRST置于上拉模式
当作为配置输出时,写到输出数据寄存器上的值(GPIOx_ODR)输出到相应的I/O引脚。可以以推挽模式或者开漏模式(当输出0时,只有N-MOS被打开)使用输出驱动器。
输入数据寄存器(GPIOx_IDR)在每个APB2时钟周期捕捉I/O引脚上的数据)
所有GPIO引脚有一个内部弱上拉和弱下拉,当配置为输入时,它们可以被激活也可以不被激活.
单独的未设置或者位清除
当对GPIOx_ODR的个别位编程时,软件不需要禁止中断,在单次APB2写操作里,可以只更改一个或者多个位。
这是通过对“置位/复位寄存器”(GPIOx_BSRR)中想要该写位写1来实现的,没被选择的位则不被更改。
所有的端口都有外部中断能力,为了使用外部中断线,端口必须配置成输入模式。
输入配置:
当I/O端口配置为输入时:
输出缓冲器被禁止,施密特触发输入被激活,根据输入配置(上拉、下拉、浮空)的不同,弱上拉和下拉电阻被连接
出现在I/O引脚上的数据在每个APB2时钟被采样到输入数据寄存器,对输入数据寄存器的读访问可得到I/O口的状态
输出配置:
当I/O端口被配置为输出时:
输出缓冲寄存器被激活
—开漏模式:输出寄存器上的0激活N-MOS,而输出寄存器上的1将端口置于高阻状态(P-MOS从不被激活)
—推挽模式:输出寄存器上的0激活N-MOS,而输出寄存器上的1将激活P-MOS
施密特触发输入被激活,弱上拉和下拉电阻被禁止,出现在I/O引脚上的数据在在每个APB2时钟被采样到输入数据寄存器,在开漏模式时,对输入数据寄存器的读即可得到I/O状态,在推挽模式时,对输入数据寄存器的读访问的得到最后一次写的值。
eg:x = A;则CRL控制GPIOA的0 —15引脚的工作模式
eg:x = A;则CRL控制GPIOA的8—15引脚的工作模式
编程:一、
1、设置GPIOA引脚的工作模式,GPIOA.0,GPIO.1,推挽输出,速度50MHz
GPIOA->CRL = 0x33;
2、在相应的引脚输出一个电平
GPIOA->ODR = 0x0; //00
GPIOA->DDR = 0x3; //11
二、
int main(void)
{
// 1、GPIOA.0口输出 PA.8口输入
GPIOA->CRL = 0x03; //50MHz推挽式输出
GPIOA->CRH = 0x04; //浮空输入
//2、PA.0 == PA.8
while(1)
{
if((GPIOA->IDR & 0x0100) == 0x0100)
GPIOA->ODR = 0x01;
else
GPIOA->ODR = 0x00;
}
return (1);
}
三、
&:与运算,隐藏,清零
GPIOA->CRL & 0x01(起到隐藏作用,只与部分位进行运算)
GPIOA->CRL & ~(0x01) (起到对最低一位清零的作用)
| :或运算,置一
GPIOA->CRL = GPIOA->CRL | 0x01(起到对最低一位置一的作用)
GPIOA->CRH高八位输入控制低八位CRL输出
//1、PA.0-PA.7 50MHz推挽输出 PA.8-PA.15浮空输入
GPIOA->CRL = 0x33333333;
GPIOA->CRH = 0x44444444;
//2、输入状态反应到对应引脚的输出
while(1)
{
if((GPIOA->IDR) & 0x0100) == 0x0100) GPIOA->ODR = GPIOA->ODR | 0x01;
else GPIOA->ODR = GPIOA->ODR & (~0x01);
if((GPIOA->IDR) & 0x0100) == 0x0200) GPIOA->ODR = GPIOA->ODR | 0x02;
else GPIOA->ODR = GPIOA->ODR & (~0x02);
if((GPIOA->IDR) & 0x0100) == 0x0400) GPIOA->ODR = GPIOA->ODR | 0x04;
else GPIOA->ODR = GPIOA->ODR & (~0x04);
if((GPIOA->IDR) & 0x0100) == 0x0800) GPIOA->ODR = GPIOA->ODR | 0x08;
else GPIOA->ODR = GPIOA->ODR & (~0x08);
if((GPIOA->IDR) & 0x0100) == 0x1000) GPIOA->ODR = GPIOA->ODR | 0x01;
else GPIOA->ODR = GPIOA->ODR & (~0x10);
if((GPIOA->IDR) & 0x0100) == 0x2000) GPIOA->ODR = GPIOA->ODR | 0x01;
else GPIOA->ODR = GPIOA->ODR & (~0x20);
if((GPIOA->IDR) & 0x0100) == 0x4000) GPIOA->ODR = GPIOA->ODR | 0x01;
else GPIOA->ODR = GPIOA->ODR & (~0x40);
if((GPIOA->IDR) & 0x0100) == 0x8000) GPIOA->ODR = GPIOA->ODR | 0x01;
else GPIOA->ODR = GPIOA->ODR & (~0x80);}
方法二:
端口位设置/复位寄存器(GPIOx_BSRR)(x=A……E)
端口复位寄存器(GPIOx_BRR)(x = A……E)
GPIOA->BSRR = 0x01;
GPIOA->BRR = 0x01;
方法三:
#define PA1 GPIOA->BSRR
#define PA0 GPIOA->BRR
PA1 = 0x01;
PA0 = 0x01;
根据硬件所提供的BSRR及BRR寄存器即可实现功能。
GPIO寄存器原理与操作相关推荐
- stm32 关于GPIO寄存器操作
在使用I2C时偶尔看别人写的程序有如下操作 //PB9 #define SDA_IN() {GPIOB->CRH&=0XFFFFFF0F;GPIOB->CRH|=(u32)8< ...
- 计算机组成原理寄存器的实验原理,计算机组成原理实验报告_寄存器的原理及操作课案.docx...
<计算机组成原理实验报告_寄存器的原理及操作课案.docx>由会员分享,提供在线免费全文阅读可下载,此文档格式为docx,更多相关<计算机组成原理实验报告_寄存器的原理及操作课案.d ...
- 计算机组成原理实验写入怎么,计算机组成原理实验报告_寄存器的原理及操作...
<计算机组成原理实验报告_寄存器的原理及操作>由会员分享,可在线阅读,更多相关<计算机组成原理实验报告_寄存器的原理及操作(10页珍藏版)>请在人人文库网上搜索. 1.成绩:实 ...
- 计算机组成原理r3寄存器,计算机组成原理实验报告-寄存器的原理及操作
<计算机组成原理实验报告-寄存器的原理及操作>由会员分享,可在线阅读,更多相关<计算机组成原理实验报告-寄存器的原理及操作(10页珍藏版)>请在装配图网上搜索. 1.成绩:实 ...
- zynq文档学习之GPIO寄存器基本操作
ug585的ch14.2介绍了GPIO具体的对器件引脚的操作,即对寄存器操作,寄存器又被直接封装成库函数,zynq一般是调用库函数进行操作.但了解寄存器可以大概了解底层驱动的原理. 首先介绍Bank0 ...
- STM32学习--GPIO(寄存器)
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 一.GPIO是什么? 二.引脚 GPIO的输入 输入框图 输入模式 作用 GPIO的输入 输入框图 输入模式 作用 GPIO ...
- 4412 GPIO读 和 ioremap控制GPIO寄存器
一.配置GPIO读 在视频14的基础上做 1.利用拨码开关来实现GPIO输入 所以AP_SLEEP对应GPC0_3,然后在drivers/gpio/gpio-exynos4.c中对应EXYNOS4_G ...
- 调试寄存器 原理与使用:DR0-DR7
调试寄存器 原理与使用:DR0-DR7 下面介绍的知识性信息来自intel IA-32手册(可以在intel的开发手册或者官方网站查到),提示和补充来自学习调试器实现时的总结. 希望能给你带去有用的信 ...
- 树莓派GPIO驱动原理
1.前言 最近认真学习了树莓派,从浅到深认真分析了wiringPi实现代码,借助树莓派学习linux收获颇丰.深入学习linux一段时间后发现它非常有魅力,一个简单的IO口输出操作尽有那么多的&quo ...
最新文章
- 突然开掉CEO!通用电气时隔一年再换帅,金融和工业互联网都救不了GE?
- 跟风 Python 的人,后来都怎样了?
- [POI2007]ZAP-Queries [HAOI2011]Problem b 莫比乌斯反演
- HDU 4741 Save Labman No.004 计算几何 数学
- wxWidgets:wxStringTokenizer类用法
- IT是产品、IT是服务、IT是能力
- 银屑病与肠道菌群(调研手稿二)
- ab压力测试_Apache ab压力测试的知识点
- HTML5怎样设置站点,我是怎样让网站用上HTML5 Manifest
- openfeign调用 HttpServletRequest作为参数 报错..
- 蚂蚁金服自研数据库OceanBase如何登顶TPC-C
- A7x linux游戏,oppoa7x中将游戏空间开启的具体操作流程
- Py西游攻关之面向对象(二)
- 用计算机遥感技术图片,遥感图像处理
- c++ primer plus第六版复习题及答案
- 统计学计算机实验教程,清华大学出版社-图书详情-《统计学计算机实验教程——基于Excel软件》...
- OpenCV 直方图计算
- QQ微信可以上网,但是浏览器上不了网怎么办?
- java 短信_java实现发送手机短信
- 常量(Constant)
热门文章
- 服务器开通网站来宾帐户,IIS 增加Internet来宾用户权限
- “神一般存在”的印度理工学院到底有多牛?
- Unity3D学习:结合Kinect进行游戏开发 | 孤舟博客
- pdf文件删除空白页技巧介绍
- html进度条倒计时代码,html5+css3进度条倒计时动画特效代码【推荐】_html5教程技巧...
- 设置jupyter notebook文件保存位置
- PS学习笔记------运用脚本及自动化批量处理
- ultrascale学习笔记之remoteproc启动R5
- QGIS加载在线地图:高德、天地图等
- 容器云平台No.10~通过gogs+drone+kubernetes实现CI/CD