一、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寄存器原理与操作相关推荐

  1. stm32 关于GPIO寄存器操作

    在使用I2C时偶尔看别人写的程序有如下操作 //PB9 #define SDA_IN() {GPIOB->CRH&=0XFFFFFF0F;GPIOB->CRH|=(u32)8< ...

  2. 计算机组成原理寄存器的实验原理,计算机组成原理实验报告_寄存器的原理及操作课案.docx...

    <计算机组成原理实验报告_寄存器的原理及操作课案.docx>由会员分享,提供在线免费全文阅读可下载,此文档格式为docx,更多相关<计算机组成原理实验报告_寄存器的原理及操作课案.d ...

  3. 计算机组成原理实验写入怎么,计算机组成原理实验报告_寄存器的原理及操作...

    <计算机组成原理实验报告_寄存器的原理及操作>由会员分享,可在线阅读,更多相关<计算机组成原理实验报告_寄存器的原理及操作(10页珍藏版)>请在人人文库网上搜索. 1.成绩:实 ...

  4. 计算机组成原理r3寄存器,计算机组成原理实验报告-寄存器的原理及操作

    <计算机组成原理实验报告-寄存器的原理及操作>由会员分享,可在线阅读,更多相关<计算机组成原理实验报告-寄存器的原理及操作(10页珍藏版)>请在装配图网上搜索. 1.成绩:实 ...

  5. zynq文档学习之GPIO寄存器基本操作

    ug585的ch14.2介绍了GPIO具体的对器件引脚的操作,即对寄存器操作,寄存器又被直接封装成库函数,zynq一般是调用库函数进行操作.但了解寄存器可以大概了解底层驱动的原理. 首先介绍Bank0 ...

  6. STM32学习--GPIO(寄存器)

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 一.GPIO是什么? 二.引脚 GPIO的输入 输入框图 输入模式 作用 GPIO的输入 输入框图 输入模式 作用 GPIO ...

  7. 4412 GPIO读 和 ioremap控制GPIO寄存器

    一.配置GPIO读 在视频14的基础上做 1.利用拨码开关来实现GPIO输入 所以AP_SLEEP对应GPC0_3,然后在drivers/gpio/gpio-exynos4.c中对应EXYNOS4_G ...

  8. 调试寄存器 原理与使用:DR0-DR7

    调试寄存器 原理与使用:DR0-DR7 下面介绍的知识性信息来自intel IA-32手册(可以在intel的开发手册或者官方网站查到),提示和补充来自学习调试器实现时的总结. 希望能给你带去有用的信 ...

  9. 树莓派GPIO驱动原理

    1.前言 最近认真学习了树莓派,从浅到深认真分析了wiringPi实现代码,借助树莓派学习linux收获颇丰.深入学习linux一段时间后发现它非常有魅力,一个简单的IO口输出操作尽有那么多的&quo ...

最新文章

  1. 突然开掉CEO!通用电气时隔一年再换帅,金融和工业互联网都救不了GE?
  2. 跟风 Python 的人,后来都怎样了?
  3. [POI2007]ZAP-Queries [HAOI2011]Problem b 莫比乌斯反演
  4. HDU 4741 Save Labman No.004 计算几何 数学
  5. wxWidgets:wxStringTokenizer类用法
  6. IT是产品、IT是服务、IT是能力
  7. 银屑病与肠道菌群(调研手稿二)
  8. ab压力测试_Apache ab压力测试的知识点
  9. HTML5怎样设置站点,我是怎样让网站用上HTML5 Manifest
  10. openfeign调用 HttpServletRequest作为参数 报错..
  11. 蚂蚁金服自研数据库OceanBase如何登顶TPC-C
  12. A7x linux游戏,oppoa7x中将游戏空间开启的具体操作流程
  13. Py西游攻关之面向对象(二)
  14. 用计算机遥感技术图片,遥感图像处理
  15. c++ primer plus第六版复习题及答案
  16. 统计学计算机实验教程,清华大学出版社-图书详情-《统计学计算机实验教程——基于Excel软件》...
  17. OpenCV 直方图计算
  18. QQ微信可以上网,但是浏览器上不了网怎么办?
  19. java 短信_java实现发送手机短信
  20. 常量(Constant)

热门文章

  1. 服务器开通网站来宾帐户,IIS 增加Internet来宾用户权限
  2. “神一般存在”的印度理工学院到底有多牛?
  3. Unity3D学习:结合Kinect进行游戏开发 | 孤舟博客
  4. pdf文件删除空白页技巧介绍
  5. html进度条倒计时代码,html5+css3进度条倒计时动画特效代码【推荐】_html5教程技巧...
  6. 设置jupyter notebook文件保存位置
  7. PS学习笔记------运用脚本及自动化批量处理
  8. ultrascale学习笔记之remoteproc启动R5
  9. QGIS加载在线地图:高德、天地图等
  10. 容器云平台No.10~通过gogs+drone+kubernetes实现CI/CD