博主会用STM32进行开发,也用STM32做了项目。之前一般用是stm32cubeMX来开发,对stm32的底层知识了解甚浅。因此参加一次蓝桥杯来好好学习,提升一下。
(一)STM32的八种输出模式
在官方库文件stm32f10x_gpio.h中对I/O口模式使用枚举定义八种模式:
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;
(二)八种输出模式的区别
1. 四种输入模式
GPIO_Mode_AIN
(Aanalog Input):模拟输入,是指传统方式的输入。数字输入是输入PCM数字信号,即0,1的二进制数字信号,通过数模转换,转换成模拟信号,经前级放大进入功率放大器,功率放大器还是模拟的。GPIO_Mode_IN_FLOATING
(Floating input):浮空输入,浮空就是逻辑器件的输入引脚即不接高电平,也不接低电平。由于逻辑器件的内部结构,当它输入引脚悬空时,相当于该引脚接了高电平。一般实际运用时,引脚不建议悬空,易受干扰。 通俗讲就是让管脚什么都不接,浮空着。GPIO_Mode_IPU
(Input Up):上拉输入,上拉就是把电位拉高,比如拉到Vcc。上拉就是将不确定的信号通过一个电阻嵌位在高电平!电阻同时起限流作用!弱强只是上拉电阻的阻值不同,没有什么严格区分。GPIO_Mode_IPD
(Input Down):下拉输入,就是把电压拉低,拉到GND。原理同上。
2.四种输出模式
GPIO_Mode_Out_OD
(Open Drain Output):开漏输出,输出端相当于三极管的集电极,要得到高电平状态需要使用上拉电阻才行,适用于做电流型的驱动,其吸收能力相对较强(一般20ma以内)。GPIO_Mode_Out_PP
(Push-Pull Output):推挽输出,可以输出高电平,也可以输出低电平,结构是两个三极管分别受两个互补信号的控制,总是在一个三极管导通的时候另一个截止,高电平由IC电源确定。GPIO_Mode_AF_OD
、GPIO_Mode_AF_PP
:复用端口,可以理解为GPIO口被用作第二功能时的配置情况(即并非作为通用IO口使用)。
在对复用端口解释时,存在几种解释,网上还有这种:
- 复用功能的推挽输出_AF_PP ——片内外设功能(I2C的SCL,SDA)。
- 复用功能的开漏输出_AF_OD——片内外设功能(TX1,MOSI,MISO.SCK.SS)
针对多个解释,下面这种应该更加好理解
- 复用推挽输出,此时IO受内部外设控制,比如定时器的PWM,比如SPI的MOSI,MISO等。 而普通的推挽输出,则IO受ODR控制。
- 设置为复用推挽输出,那么IO就不受ODR控制了,这里应该是与PE5这个IO口复用的外设产生的低电平导致的
- 复用推挽表示引脚的io的操作由相应的功能模块来完成,普通推挽表示你需要通过gpio寄存器来操作引脚。
ODR是输出寄存器,当IO口在输出状态下时,ODR值为0则输出低电平,为1则输出高电平。