学完大二上学期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的时钟。
上一篇:STM32标准外设库函数SetSysClockTo72(void)
下一篇:STM32L0 SysTick无法进入中断怎么处理
推荐阅读最新更新时间:2024-03-16 16:21