1.STM32中GPIO基本结构为
2.STM32共有4种输入,4种输出模式
2.1输入
2.1.1输入浮空模式
浮空输入下,Vdd和Vss都断开,施密特触发器打开,数据直接送入“输入数据寄存器”,然后cpu就可以都寄存器中的数据
2.2.2输入上拉模式&输入下拉模式
与2.2.1输入浮空模式相区别的是,此时上拉开关Vdd闭合,下拉开关仍断开。输入下拉模式与之正好相反。
2.2.3模拟输入
此时,Vdd和Vss都断开,施密特触发器也关闭。数据从I/O口进入后将会送至模拟输入端口,
2.2输出
2.2.1.开漏输出模式
case1、若此时由CPU发送1给位设置/清除寄存器,同时映射给输出数据寄存器,再到输出控制电路,此时N-MOS管截止,I/O端口由与上拉电阻所连Vdd控制输出1,此时输出的电平可以由输入电路读入CPU。所以,此时CPU都到的电平并不是CPU送出的电平,而是由外部电路所决定的。
case2、若此时由CPU发送0给位设置/清除寄存器,同时映射给输出数据寄存器,再到输出控制电路,此时N-MOS管导通,输出低电平给I/O口,并且此时输出的电平也可以由输入电路读入CPU
适合于做电流型的驱动,其吸收电流的能力相对强(一般20ma以内).
2.2.2开漏复用输出模式
类似于2.2.1.开漏输出模式,只是输出不再是CPU,而是外设。
2.2.3推挽输出模式(常用)
其数据输出寄存器部分等同于2.2.1,不同之处在于输出控制电路之后的部分,在推挽模式下,两个MOS管都会用到,当输出为1时,N-MOS管截止,P-MOS管导通,反之输出为0时, P-MOS管截止,N-MOS管导通,有助于增大输出功率。
2.2.4复用推挽输出模式
略,可以参考2.2.1--2.2.3不难总结出其作用
具体可以参考这篇帖子:STM32的I/O口的8种工作模式
3. 一些引脚存在着复用的情况
这里举一些常用的例子,如串口USART1,详情可以查阅对应的芯片手册
特别的,“FT”表示该引脚能够容忍5V输入
4.一些推荐的输出/输入模式
4.1定时器
4.2.串口
4.3.I2C
(寄存器相关的说明此处省略。。。)
5.打开stm32f10x_gpio.h文件,下拉到最底部,可以看到有如下几个函数
void GPIO_DeInit(GPIO_TypeDef* GPIOx);
void GPIO_AFIODeInit(void);
void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct);
void GPIO_StructInit(GPIO_InitTypeDef* GPIO_InitStruct);
uint8_t GPIO_ReadInputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
uint16_t GPIO_ReadInputData(GPIO_TypeDef* GPIOx);
uint8_t GPIO_ReadOutputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
uint16_t GPIO_ReadOutputData(GPIO_TypeDef* GPIOx);
void GPIO_SetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
void GPIO_ResetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
void GPIO_WriteBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, BitAction BitVal);
void GPIO_Write(GPIO_TypeDef* GPIOx, uint16_t PortVal);
void GPIO_PinLockConfig(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
void GPIO_EventOutputConfig(uint8_t GPIO_PortSource, uint8_t GPIO_PinSource);
void GPIO_EventOutputCmd(FunctionalState NewState);
void GPIO_PinRemapConfig(uint32_t GPIO_Remap, FunctionalState NewState);
void GPIO_EXTILineConfig(uint8_t GPIO_PortSource, uint8_t GPIO_PinSource);
void GPIO_ETH_MediaInterfaceConfig(uint32_t GPIO_ETH_MediaInterface);
原子哥的视频中把这几个函数归类如下: