历史上的今天
返回首页

历史上的今天

今天是:2024年12月21日(星期六)

2018年12月21日 | STM32的GPIO内部结构及相关寄存器

2018-12-21 来源:eefocus

学完大二上学期51单片机课程的寒假,在家我就开始捣鼓STM32了,记得那时候接触STM32感觉它很难,20多天下来就学习了RCC时钟体系和GPIO控制模块,开学后又开始忙一些有的没的,STM32的学习也搁置了,以至于后来跟学校当时在念博的老师交流时,我是这样描述我的STM32开发水平的:“我只会用GPIO写流水灯程序”,说来汗颜。


最近一阵子又回归STM32学习之旅,对于GPIO模块其实很不想写文章,感觉在炒冷饭,不过,认真考虑后还是敲起了键盘,对于概念性的东西还是做一下笔记吧,编程方面的,挺简单,相关资料很多,就不记录了。


1. GPIO简介


GPIO是通用输入/输出端口的简称,是STM32可控制的引脚。GPIO的引脚与外部硬件设备连接,可实现与外部通讯、控制外部硬件或者采集外部硬件数据的功能。最简单的helloworld级别的例子: 将GPIO引脚接到LED灯,通过控制引脚的输出高、低电平试下开关控制LED;将按键接到GPIO引脚,通过读取GPIO引脚区分按键是按下还是松开。


接下来干嘛?肯定是上那副经典的GPIO内部结构图了:


这里写图片描述


1.1 保护二极管


IO引脚上下两边两个二极管用于防止引脚外部过高/过低的电压输入,当引脚电压高于VDD时,上方的二极管导通,当引脚电压低于VSS时,下方的二极管导通,防止不正常电压引入芯片导致芯片烧毁。但是尽管如此,还是不能直接外接大功率器件,须加大功率及隔离电路驱动,防止烧坏芯片或者外接器件无法正常工作。


1.2 P-MOS管和N-MOS管


图中红色箭头2方向为输出模式的GPIO,由P-MOS管和N-MOS管组成的单元电路使得GPIO具有“推挽输出”和“开漏输出”的模式。这两个MOS管接管电路的输入信号是由GPIO的输出数据寄存器GPIOx_ODR提供的,也就是我们可以通过编程修改GPIOx_ODR寄存器的值从而影响该单元电路的输出。 


常用的还用置位/复位寄存器GPIOx_BSRR和复位寄存器GPIOx_BRR,设置这两个寄存器后也能影响GPIOx_ODR,进而影响单元电路输出。 


除此,还有复用功能输出,意思是指STM32的其它片上外设对GPIO引脚进行控制,此时该引脚作为外设功能的一部分。片上外设数据信号作为双MOS管接管的输入,进而输出到GPIO引脚中。例如USART串口通讯,要用到某个GPIO 引脚作为通讯发送引脚,就可以把该GPIO 引脚配置成USART 串口复用功能,由串口外设控制该引脚,发送数据。


1.3 TTL肖特基触发器


图中红色箭头1方向为输入模式的GPIO,GPIO引脚经过内部上/下拉电阻配置成上/下拉、或者浮空输入,然后连接到触发器。信号经过触发器后,模拟信号转化为0和1的数字信号,然后存储在输入寄存器GPIOx_IDR中,通过读取GPIOx_IDR寄存器就可以知道GPIO的电平状态。 


同理,与复用功能输出类似,这里也有复用功能输入,GPIO引脚的输入信号会传输到STM32的其他片上外设,由外设去读取该引脚状态。例如使用USART串口通讯,用某个GPIO引脚作为通讯的接收引脚。 


另外,当GPIO引脚作为ADC采集电压的输入通道时,用其“模拟输入”功能,此时信号不再经过触发器进行TTL电平转换。ADC外设要采集到的原始的模拟信号。类似的,当GPIO引脚用于DAC模拟电压输出通道时,此时作为“模拟输出”功能,DAC信号输出不经过双MOS管。


2. GPIO的工作模式

GPIO的硬件结构,决定了GPIO可以配置成的工作模式有:


typedef enum

{ GPIO_Mode_AIN = 0x0,              //模拟输入

  GPIO_Mode_IN_FLOATING = 0x04, //浮空输入

  GPIO_Mode_IPD = 0x28,             //下拉输入

  GPIO_Mode_IPU = 0x48,             //上拉输入

  GPIO_Mode_Out_OD = 0x14,          //开漏输入


  GPIO_Mode_Out_PP = 0x10,          //推挽输出

  GPIO_Mode_AF_OD = 0x1C,           //复用开漏输出

  GPIO_Mode_AF_PP = 0x18            //复用推挽输出

}GPIOMode_TypeDef;


2.1 输入模式(上拉/下拉/浮空/模拟)


GPIO在输入模式中,肖特基触发器被打开,输出被禁止,通过GPIOx_IDR读取I/O状态。上拉/下拉输入,其默认电平由上拉/下拉决定,浮空输入的电平则是不确定的,完全由外部决定,一般按键就是采用浮空输入;模拟输入用于ADC采样。


2.2 输出模式(推挽/开漏)


GPIO在输出模式中,肖特基触发器同样被打开着的,即输入可用,这样通过输入数据寄存器GPIOx_IDR可以读取到IO实际状态。推挽模式时,双MOS以轮流方式工作,开漏模式下,只有N-MOS管工作。输出寄存器GPIOx_ODR可控制是输出高低电平;输出的速率可配,有2MHz/10MHz/50MHz。频率越高,功耗越大,效率也越高。


2.3 复用功能


复用功能中,输出输入都使能,可工作与开漏或推挽模式,但是输出信号源于片上外设,输出数据寄存器GPIOx_ODR无效,输入寄存器GPIOx_IDR仍然有效,可通过它获取IO实际状态,片上外设相关寄存器也是通过GPIOx_IDR获取该数据信号。


控制GPIO端口工作模式寄存器是GPIOx_CRL和GPIOx_CRH,它们都是32位的寄存器,分别管控GPIO的低8位IO和高8位IO。另外涉及到的寄存器还有: 


GPIOx_ODR: 设置输出数据 

GPIOx_IDR:读取输入数据 

GPIOx_BSRR:置1/清零GPIO的相应引脚 

GPIOx_BRR:清零GPIO的相应引脚 


这些寄存器的设置参照STM32中文参考手册即可,很简单,不赘述。另外,要让GPIO正常工作,记得打开GPIO的时钟。


推荐阅读

史海拾趣

ANOVA公司的发展小趣事

ANOVA公司的故事始于2018年,当时四个在物联网领域颇具影响力的品牌——Dataonline、Wikon、Wesroc和Itank,看到了工业远程监控领域的巨大潜力和商机,于是决定联手共创未来。这四个品牌都拥有超过一个世纪的工业监控经验,它们的联合不仅仅是资源的整合,更是技术与智慧的融合。ANOVA的创立,标志着电子行业中一个新的力量正在崛起。

得力(deli)公司的发展小趣事

随着科技的不断发展,得力公司意识到智能化是未来办公的重要趋势。于是,得力开始研发智能办公产品,如智能会议设备、云考勤、智能摄像头等。这些产品不仅提高了办公效率,也为用户带来了更加便捷、智能的办公体验。得力通过整合全球资源,不断创新和优化产品,逐渐在智能办公领域树立了领先地位。

固驰(GUERTE)公司的发展小趣事

固驰电子深知产品质量是企业生存之本,因此始终将品质控制放在首位。公司不仅建立了完善的质量管理体系,还通过了ISO9001:2015质量管理体系认证和美国UL产品认证,这标志着固驰电子的产品质量达到了国际先进水平。此外,公司还积极申请专利,目前已拥有50项国家专利,进一步巩固了其在行业内的技术领先地位。

e2v technologies公司的发展小趣事

2016年,e2v被Teledyne Technologies公司收购,成为Teledyne e2v。这一合并不仅为e2v带来了更多的资源和支持,也为其开启了新的发展篇章。Teledyne e2v在继续保持其在图像传感器领域的领先地位的同时,也积极拓展新的市场和应用领域,为电子行业的发展贡献更多的力量。

Custom Electronics Inc公司的发展小趣事

在电子行业的早期阶段,CEI凭借其卓越的研发团队和创新能力,成功开发出一款具有革命性的新型电容器。这款电容器以其高效能、长寿命和稳定性强的特点,迅速在市场中获得认可。CEI借此机会,进一步扩大了生产规模,提高了产品质量,逐渐确立了其在电子行业中的领先地位。

Advanced Detector Corp公司的发展小趣事

ADC始终坚持以技术创新为核心竞争力,不断投入研发资源,探索新的技术领域。目前,公司正积极研发应用于物联网、人工智能等前沿领域的探测器技术,并计划推出更多具有创新性的产品。展望未来,ADC将继续致力于技术创新和市场拓展,努力成为电子行业的领军企业。

这五个故事展示了Advanced Detector Corp公司从创立初期到逐渐发展壮大的过程,体现了公司在技术创新、市场扩张、战略合作等方面的努力和成就。同时,这些故事也揭示了ADC在电子行业中的重要地位和影响力。

问答坊 | AI 解惑

长虹SF2115彩电伴音小,将音量开至最大位置(数码100)也只能听见微弱的声音

对于伴音小的故障快速的修理方法是AV输入法,即输入AV信号确认故障范围,若输入AV信号声音正常说明故障在中放电路(包括图像中放和伴音解调电路),若输入AV信号声音还是不正常,说明故障在功放电路或TV/AV切 换电路。 基于以上的检修思路,首先输 ...…

查看全部问答>

解说Solder Mask 和Paste Mask

对于Solder Mask Layers 和Paste Mask layers这个两个概念,有很多初学者不太理解这两个层的概念,因为它们的确有一些相似的地方,就自己的看法说说,贡大家参考: Solder Mask Layers:即阻焊层,就是PCB板上焊盘(表面贴焊盘、插件焊盘、过孔) ...…

查看全部问答>

wince下如何编译iesimple并编译进内核!

如题, 大家别拿contents里面的内容截过来一贴就结束了。那里面我也看过了,就是不不知道怎么编译进去。 我现在是照着contents里面的内容做的 里面提到 in the %_WINCEROOT%\\Public\\Ie\\Oak\\Lib\\ folders. To add the IESimple application ...…

查看全部问答>

如何在IRP_MJ_CREATE中修改创建文件的路径???急急!

在文件系统过滤驱动中,过滤RIP_MJ_CREATE得到文件的创建路径(PFILE_OBJECT file = irpsp->FileObject 取得),我想更改这个路径,如C:\\a.txt 改为D:\\myDirectory\\b.txt。我试了很多方法都不成功.请高手指点指点啊,小弟不胜感激!!!!…

查看全部问答>

学习和应用单片机的各位同人,请加单片机学习交流群:10651014

学习和应用单片机的各位同人,请加单片机学习交流群:10651014…

查看全部问答>

s3c2410的问题

在s3c2410下程序是一定要下到0x30200000这里么?我自己修改了一个ucos的程序,下到芯片,但是指定的地址是从0开始,结果跑错了,然后就一直不能再下载其他程序了,请问应该怎么修正这个错误。    原因可能是:我查了下,下载程序时总是 ...…

查看全部问答>

出售稳定MIPS板卡及设计图

芯片AU1500系列 64-128内存 时钟模块 IDE硬盘接口 带J调试 外围接口 双10-100M网卡   USB1.0一个 打印口 四层板 BOM成本在700以内 板卡面积:很小,巴掌大 支持板载闪存,最大32M 可用于:路由,NAS等产品 全套LINUX系统,WEB,F ...…

查看全部问答>

问个有关ADS中main函数的问题

看到很多C语言的例子程序都是采用的所谓的裸机C程序,即要在调用Main()(采用其他名字也行)前用汇编代码进行一些搬移的工作,然后B Main; 我想问下如何使用ADS库中的main()函数写程序 我写了个简单的C语言程序,用到了main()函数,调试的时候能 ...…

查看全部问答>