stm32的GPIO学习笔记
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
I/O口工作模式:
1.高阻输入
输入模式的结构比较简单,就是一个带有施密特触发输入(Schmitt-triggered input)的三态缓冲器(U1),并具有很高的阻抗。
施密特触发输入的作用是能将缓慢变化的或者是畸变的输入脉冲信号整形成比较理想的矩形脉冲信号。
执行GPIO管脚读操作时,在读脉冲(Read Pulse)的作用下会把管脚(Pin)的当前电平状态读到内部总线上(Internal Bus)。
2.推挽输出
推挽电路是两个参数相同的三极管或MOSFET,以推挽方式存在于电路中,各负责正负半周的波形放大任务,电路工作时,两只对称的功率开关管每次只有一个导通,所以导通损耗小、效率高.
在推挽输出模式下,GPIO还具有回读功能,实现回读功能的是一个简单的三态门U2。
注意:执行回读功能时,读到的是管脚的输出锁存状态,而不是外部管脚Pin的状态。
3.开漏输出
开漏是用来连接不同电平的器件,匹配电平用的,因为开漏引脚不连接外部的上拉电阻时,只能输出低电平,如果需要同时具备输出高电平的功能,则需要接上拉电阻,很好的一个优点是通过改变上拉电源的电压,便可以改变传输电平,比如加上上拉电阻就可以提供TTL/CMOS电平输出等。
开漏输出和推挽输出相比结构基本相同,但只有下拉晶体管T1而没有上拉晶体管。
同样,T1实际上也是多组可编程选择的晶体管。
开漏输出的实际作用就是一个开关,输出“1”时断开、输出“0”时连接到GND(有一定内阻)
开漏输出和推挽输出相比结构基本相同,但只有下拉晶体管T1而没有上拉晶体管。
同样,T1实际上也是多组可编程选择的晶体管。
开漏输出的实际作用就是一个开关,输出“1”时断开、输出“0”时连接到GND(有一定内阻).
4.钳位二级管
其作用是防止从外部管脚Pin输入的电压过高或者过低。
提高输出电压一种简单的做法:是先在GPIO管脚上串联一只二极管(如1N4148),然后再接上拉电阻。
////////////////////////////////////////////////////////////////////////////////////////////////////// ///
STM32的GPIO管脚深入分析:
概述:STM23的每个GPIO引脚都可以由软件配置成输出(推挽或开漏),输入(带或不带
上拉或下拉)或复用的外设功能端口。
多数GPIO引脚与数字或模拟的复用外设共用;除了具有模拟输入(ADC)功能的管脚之外,其他的GPIO引脚都有大电流通过能力。
tip:每个IO口可以自由编程,单IO口寄存器必须要按32位bit被访问。
STM32的每个IO端口都有7个寄存器来控制
一.具体如下8种模式:
1)输入浮空(这个输入模式,输入电平必须由外部电路确定,要根据具体电路,加外部上拉电阻或下拉电阻,可以做按键识别)
2)输入上拉(打开IO内部上拉电阻)
3)输入下拉(打开IO内部下拉电阻)
4)模拟输入(应用ADC模拟输入)
5)开漏输出(输出端相当于三极管的集电极. 要得到高电平状态需要上拉电阻才行. 适合于做电流型的驱动,其吸收电流的能力相对强(一般20ma以内).能驱动大电流和大电压,LED就使用这种模式。
)
6)推挽式输出(可以输出高,低电平,连接数字器件。
推挽式输出输出电阻小,带负载能力强)7)推挽式复用功能(复用是指该引脚打开remap功能)
8)开漏复用功能(复用是指该引脚打开remap功能)
tip:
上拉输入模式:区别在于没有输入信号的时候默认输入高电平(因为有弱上拉)。
下拉输入模式:区别在于没有输入信号的时候默认输入低电平(因为有弱下拉)。
(上拉就是使IO口接上拉电阻到VCC了,跟51一样,下拉就是使IO口接下拉电阻到GND 了,
浮空就是即不接上拉,也不接下拉,这样的话IO默认输入电平不确定)
浮空输入模式:顾名思义也就是输入什么信号才是什么信号,对于浮空输入要保证有明确的输入信号。
库函数:
GPIO_Mode_AIN 模拟输入
GPIO_Mode_IN_FLOATING 浮空输入
GPIO_Mode_IPD 下拉输入
GPIO_Mode_IPU 上拉输入
GPIO_Mode_Out_OD 开漏输出
GPIO_Mode_Out_PP 推挽输出
GPIO_Mode_AF_OD 复用开漏输出
GPIO_Mode_AF_PP 复用推挽输出
二.TM32的每个IO端口都有7个寄存器来控制,具体七个寄存器如下:CRL 端口配置低寄存器
CRH 端口配置高寄存器
IDR 端口输入数据寄存器
ODR 端口输出数据寄存器
BSRR 端口位设置/复位寄存器
BRR 端口位复位寄存器
LCKR 端口配置锁定寄存器
EVCR 事件控制寄存器
MAPR 复用重映射和调试I/O配置寄存器
EXTICR 外部中断线路0-15配置寄存器
tip:
******************************************************************************* *********************
CRL(端口配置低寄存器):复位值为0X4444 4444(4化成二进制为0100),从上图可以看到,复位值其实就是配置端口为浮空输入模式
得出:STM32的CRL控制着每个IO端口(A~G)的低8位的模式。
每个IO端口的位占用CRL 的4个位,高两位为CNF,低两位为MODE。
CRL控制的是低8位输出口,而CRH控制的是高8位输出口
在输入模式(MODE[1:0]=00):
00:模拟输入模式
01:浮空输入模式(复位后的状态)
10:上拉/下拉输入模式
11:保留
在输出模式(MODE[1:0]>00):
00:通用推挽输出模式
01:通用开漏输出模式
10:复用功能推挽输出模式
11:复用功能开漏输出模式
MODEy[1:0]:端口x的模式位:
00:输入模式(复位后的状态)
01:输出模式,最大速度10MHz
10:输出模式,最大速度2MHz
11:输出模式,最大速度50MHz
******************************************************************************* *******************************
端口输入数据寄存器(GPIOx_IDR):
tip:
IDR是一个GPIOx_IDR的端口输入数据寄存器的简称(ODR是输入数据寄存器的简称),要想知道某个IO口的状态,就要读这个寄存器,
再从读出的寄存器值分析出某个管脚位的状态,就可以知道这个管脚的状态了;IDR寄存器只用了低16位。
该寄存器为只读寄存器,并且只
能以16位的形式读出。
端口输出数据寄存器(GPIOx_ODR):
ODR是一个端口输出数据寄存器,其作用就是控制端口的输出,对ODR对应寄存器位置1即对应的GPIO管脚就会输出高电平。
该寄存器也只
用了低16位,并且该寄存器可读可写,如果读的话,从该寄存器读出来的数据都是0,所以读是没有意义的;只有写是有效的。
总结:GPIOx_IDR是端口的输入数据寄存器,GPIOx_ODR是端口的输出寄存器,我们配置引脚的输入输出模式是通过GPIOx_CRL和GPIOx_CRH两
个寄存器来配置的,但是每个端口的16个引脚它们有的可能是输出模式,有的是输入模式,甚至一会输出一会输入,而GPIOx_IDR和
GPIOx_ODR两个寄存器是以字模式(读一次就是访问2个字节,一个字等于2个字节)访问而不能以bit模式(bit模式表示一次访问一个bit
位,一个字节等于8个bit,一个字等于16个bit)访问,GPIOx_IDR只能读,而GPIOx_ODR 可以读写。
三.总结一下STM32的IO控制寄存器的作用:
1)STM32的CRL和CRH寄存器主要是用来IO管脚的方向和速率以及何种驱动模式
2)STM32的ODR寄存器是用来控制IO口的输出高电平还是低电平
3)STM32的IDR寄存器主要是用来存储IO口当前的输入状态(高低电平)的。
4)STM32的BSRR寄存器主要是用来直接对IO端某一位直接进行设置和清除操作,通过这个寄存器可以方便的直接修改一个引脚的高低电平
5)STM32的BRR寄存器用来清除某端口的某一位位0,如果该寄存器某位为0,那么它所对应的那个引脚位不产生影响;如果该寄存器某位
为1 ,则清除对应的引脚位。
6)STM32的LCKR用来锁定端口的配置,当对相应的端口位执行了LOCK序列后,在下次系统复位之前将不能再更改端口位的配置。
////////////////////////////////////////////////////////////////////////////////////////////////////// ////////////////////
GPIO的输出模式下几种速度的区别:
2MHz、10MHz、50MHz;这个又可以理解为输出驱动电路的不同响应速度(芯片内部在I/O口的输出部分安排了多个响应速
度不同的输出驱动电路,用户可以根据自己的需要选择合适的驱动电路,通过选择速度来选择不同的输出驱动电路模块,达到最佳的噪
声控制和降低功耗的目的)。
、
////////////////////////////////////////////////////////////////////////////////////////////////////// //////////////////
在STM32中如何配置片内外设使用的IO端口:
首先,一个外设在使用前,必须先配置和激活启动该外设的时钟,比如GPIO端口B,那么就要激活GPIOB的时钟,比如GPIOA,那么使用PA2
管脚前,必须要前激活GPIOA端口的时钟,只有启动时钟后,这个外设才变得激活可用。
到外设的输入输出功能基本有三种情况:
1)管脚输出:需要根据外围电路的配置选择对应的管脚为复用功能的推挽输出或复用功能的开漏输出。
2)管脚输入:则根据外围电路的配置可以选择浮空输入、带上拉输入或带下拉输入。
3)ADC对应的管脚:配置管脚为模拟输入。
值得注意的是:这里如果把端口配置成复用输出功能,则该引脚与它当前连的信号电路断开,和复用功能信号电路连接,所以将管脚配置成
复用输出功能后,如果只激活了该引脚的GPIO端口的时钟,而忘记把复用功能的时钟激活,那么它的输出将不确定,这样会产生异常的现。
////////////////////////////////////////////////////////////////////////////////////////////////////// ///////////////////
APB2ENR寄存器是APB2总线上的外设时钟使能寄存器
////////////////////////////////////////////////////////////////////////////////////////////////////// ///////////////////
端口位设置/清除寄存器(GPIOx_BSRR) (x=A..E):
位31:16 这些位只能写入并只能以字(16位)的形式操作。
0:对对应的ODRy位不产生影响
1:清除对应的ODRy位为0
注:如果同时设置了BSy和BRy的对应位,BSy位起作用。
位15:0 这些位只能写入并只能以字(16位)的形式操作。
0:对对应的ODRy位不产生影响
1:设置对应的ODRy位为1
////////////////////////////////////////////////////////////////////////////////////////////////////// ////////////////////
端口位清除寄存器(GPIOx_BRR) (x=A..E):
位31:16 保留。
BRy: 清除端口x的位y (y = 0…15) (Port x Reset bit y)
位15:0 这些位只能写入并只能以字(16位)的形式操作。
0:对对应的ODRy位不产生影响
1:清除对应的ODRy位为0
////////////////////////////////////////////////////////////////////////////////////////////////////// ////////////////////
端口配置锁定寄存器(GPIOx_LCKR) (x=A..E):
当执行正确的写序列设置了位16(LCKK)时,该寄存器用来锁定端口位的配置。
位[15:0]用于锁定GPIO端口的配置。
在规定的写入操作期间,
不能改变LCKP[15:0]。
当对相应的端口位执行了LOCK序列后,在下次系统复位之前将不能再更改端口位的配置。
每个锁定位锁定控制寄存
器(CRL, CRH)中相应的4个位。
位31:17 保留。
位16 LCKK:锁键(Lock key) 该位可随时读出,它只可通过锁键写入序列修改。
0:端口配置锁键位激活
1:端口配置锁键位被激活,下次系统复位前GPIOx_LCKR寄存器被锁住。
锁键的写入序列:写1 -> 写0 -> 写1 -> 读0 -> 读1 最后一个读可省略,但可以用来确认
锁键已被激活。
注:在操作锁键的写入序列时,不能改变LCK[15:0]的值。
操作锁键写入序列中的任何错误将不能激活锁键。
位15:0 LCKy: 端口x的锁位y (y = 0…15) (Port x Lock bit y) 这些位可读可写但只能在LCKK位为0时写入。
0:不锁定端口的配置
1:锁定端口的配置。