目录
结构图:
我们从上往下看:
我们先看最上面的虚框:
一、输入
1模拟输入:
I/O口走上路,此时上拉下拉电阻都未打开,直接走自己专属线路。它不过肖特基触发器,就代表他不能用简单的0,1表示。所以它是专属于AD的接口。
2输入上拉:
我们接通上拉电阻的开关,通过肖特基触发器。那么这个口由于上拉电阻那一路电路就默认高电平。
3输入下拉
同输入入上拉相同,我们只需稍作改动。将上拉改为下拉。那他就默认了低电平。
4模拟输入
我们想想我们不上拉,不下拉,不模拟输入。这个电路必然会很容易受到外界影响。
二、输出
我们先看一个细节,输入输出殊途同归最后到了一条线。也就是说,我们输出的同时一些输入点路的寄存器也可以用。
1开漏输出
2推挽式输出
3推挽式复用功能
4开漏复用功能
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;
日常使用我们只需调用即可。
例如:
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP
三、GPIO端口初始化
模板:
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOx, ENABLE);//打开时钟,选择挂载总线,端口//使能Px 端口时钟
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_x;//PA15端口配置
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;//选择输出模式
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//选择IO口速度
GPIO_Init(GPIOA,&GPIO_InitStructure);//写入
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOx, ENABLE);//使能Px 端口时钟
代码注解:
STM32Fxx内部集成了很多的外设控制器,比如USART、SPI、bxCAN等等,这些外设控制器,也需要通过引脚与外设连接。复用功能是相对于单片机的引脚而言的。所谓“复用功能”,是指单片机的引脚既可以做普通GPIO使用,也可以作为内部外设控制器的引脚来使用。
复用时需要函数
GPIO_PinRemapConfig
函数GPIO_PinRemapConfig(u32GPIO_Remap, FunctionalState NewState);改变指定管脚的映射,很多复用功能的引出脚可以通过重映射,从不同的I/O管脚引出,即复用功能的引出脚位是可通过程序改变的。
举例GPIO_PinRemapConfig(GPIO_Remap_SWJ_Disable, ENABLE); // 改变指定管脚的映射 GPIO_Remap_SWJ_Disable,SWJ 完全禁用(JTAG+SW-DP),而且管脚映射函数,需要在GPIO配置函数GPIO_Configuration()中
失能函数:
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, DISABLE);
输出模式:
浮空输入_IN_FLOATING 上拉输入_IPU 下拉输入_IPD 模拟输入_AIN 开漏输出_OUT_OD 推挽输出_OUT_PP 开漏 复用输出_AF_OD 推挽复用输出_AF_PP
推挽输出:可以输出强高低电平,连接数字器件
开漏输出:只可以输出强低电平,高电平得靠外部电阻拉高。输出端相当于三极管的集电极.要得到高电平状态需要上拉电阻才行.适合于做电流型的驱动,其吸收电流的能力相对强(一般20ma以内);
四、相关配置函数stm32f10x_gpio.h
设置输出电平函数:
GPIO_SetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);//对应引脚输出高电平
GPIO_ResetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);//对应引脚输出低电平
读取输出电平函数:
uint8_t GPIO_ReadOutputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);//读取一个
uint16_t GPIO_ReadOutputData(GPIO_TypeDef* GPIOx);//读取一组
读取输入电平:
uint8_t GPIO_ReadInputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
uint16_t GPIO_ReadInputData(GPIO_TypeDef* GPIOx);