通用和复用功能I/O(GPIO和AFIO)的使用

通用GPIO的使用

一.GPIO简介

1.可配置为8种输入输出模式(输入浮空、输入上拉、输入下拉、模拟输入、开漏输出、推挽式输出、推挽式复用功能、开漏复用功能)

2.引脚电平:0V~3.3V(CMOS端口),部分引脚可容忍5V(STM32引脚定义中I/O口带FT就是可以容忍5V),TTL端口兼容5.5v。

3.输出模式下可控制端口输出高低电平,用以驱动LED、控制蜂鸣器、模拟通信协议输出时序等

4.输入模式下可读取端口的高低电平或电压,用于读取按键输入、外接模块电平信号输入、ADC电压采集、模拟通信协议接收数据等

5.所有的GPIO都是挂载在APB2总线上的,每一个GPIO总共有16个引脚,编号0-15(PA0-PA15)

6.快速翻转,每次翻转最快只需要两个时钟周期(F1最高速度可以到50Mhz)

7.每个IO口都可以做中断

通用和复用功能I/O(GPIO和AFIO)的使用_第1张图片

二.GPIO电路结构介绍

F1芯片

通用和复用功能I/O(GPIO和AFIO)的使用_第2张图片

通用和复用功能I/O(GPIO和AFIO)的使用_第3张图片

如果输入电压比3.3V还要高上方的二极管就会导通,输入电压产生的电流就会直接流入VDD,如果输入电压比0V还要低,相对于VSS就会产生负电压,下方二极管导通,电流会从VSS流出,不会从内部电路汲取电流

通用和复用功能I/O(GPIO和AFIO)的使用_第4张图片通用和复用功能I/O(GPIO和AFIO)的使用_第5张图片

其他芯片

通用和复用功能I/O(GPIO和AFIO)的使用_第6张图片

三.GPIO模式 

一个端口可以有多个输入,但是只能有一个输出,配置成输出模式,也是可以读取引脚的高低电平

复用开漏输出:例如IIC它要配置成开漏输出模式,其次要将GPIO的引脚控制权给外设所以是复用

通用和复用功能I/O(GPIO和AFIO)的使用_第7张图片 通用和复用功能I/O(GPIO和AFIO)的使用_第8张图片

四.寄存器

通用和复用功能I/O(GPIO和AFIO)的使用_第9张图片

五.LED、蜂鸣器、按键开关介绍

1.基本介绍

1.LED:发光二极管,正向通电点亮,反向通电不亮(长脚是正极,短脚是负极,内部小的是正极,大的是负极)

2.有源蜂鸣器:内部自带振荡源,将正负极接上直流电压即可持续发声,频率固定

3.无源蜂鸣器:内部不带振荡源,需要控制器提供振荡脉冲才可发声,调整提供振荡脉冲的频率,可发出不同频率的声音

通用和复用功能I/O(GPIO和AFIO)的使用_第10张图片      通用和复用功能I/O(GPIO和AFIO)的使用_第11张图片

 4.按键:常见的输入设备,按下导通,松手断开,由于按键内部使用的是机械式弹簧片来进行通断的,所以在按下和松手的瞬间会伴随有一连串的抖动(按键消抖)

通用和复用功能I/O(GPIO和AFIO)的使用_第12张图片

通用和复用功能I/O(GPIO和AFIO)的使用_第13张图片

六.RCC和GPIO函数介绍

void RCC_AHBPeriphClockCmd(uint32_t RCC_AHBPeriph, FunctionalState NewState);
void RCC_APB2PeriphClockCmd(uint32_t RCC_APB2Periph, FunctionalState NewState);
void RCC_APB1PeriphClockCmd(uint32_t RCC_APB1Periph, FunctionalState NewState)

主要是上面的三个函数分别对应的使能和失能不同的外设,可以在函数功能查看

void GPIO_DeInit(GPIO_TypeDef* GPIOx);//复位GPIOx
void GPIO_AFIODeInit(void);
void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct);//用结构体初始化GPIO
void GPIO_StructInit(GPIO_InitTypeDef* GPIO_InitStruct);//给GPIO赋一个默认值

//GPIO读取函数
//读取输入电平
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);

//GPIO写入函数
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);//可以对16个端口进行输入输出

例程1.GPIO输出使用

//点灯
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//使能时钟
GPIO_InitTypeDef GPIO_InitStructure;
   
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&GPIO_InitStructure);//初始化PA0
GPIO_ResetBits(GPIOA,GPIO_Pin_0); //将PA0处的电平置低,点亮LED0

GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_1;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&GPIO_InitStructure);
GPIO_WriteBit(GPIOA,GPIO_Pin_1,Bit_RESET);//将PA1处的电平置低,点亮LED1

例程2.GPIO输出使用

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
    GPIO_InitTypeDef GPIO_InitStructure;
   
    GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
    GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4;
    GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
    GPIO_Init(GPIOA,&GPIO_InitStructure);
    
	while (1)
	{
        for(int i=0;i<=4;i++)
        {
            GPIO_Write(GPIOA,~(0x0001<

AFIO时钟

void GPIO_AFIODeInit(void);//复位AFIO外设
void GPIO_PinLockConfig(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);//锁定GPIO配置,防止意外更改

//配置AFIO事件功能
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);//配置AFIO
void GPIO_ETH_MediaInterfaceConfig(uint32_t GPIO_ETH_MediaInterface);//以太网

HAL库复用

IO端口的输入输出是由GPIO外设控制,我们称之为通用。

O端口的输入或输出是由其它非GPIO外设控制,我们称之为复用

你可能感兴趣的:(STM32F103,单片机,嵌入式硬件)