概述
一、通用和复用功能I/O(GPIO和AFIO)
1、GPIO_Mode
GPIO端口的每个位可以由软件分别配置 成多种模式。
─ 输入浮空 GPIO_Mode_IN_FLOATING
─ 输入上拉 GPIO_Mode_IPU
─ 输入下拉 GPIO_Mode_IPD
─ 模拟输入 GPIO_Mode_AIN
─ 开漏输出 GPIO_Mode_Out_OD
─ 推挽式输出 GPIO_Mode_Out_PP
─ 推挽式复用功能 GPIO_Mode_AF_PP
─ 开漏复用功能 GPIO_Mode_AF_OD
- 通用I/O(GPIO)
当作为输出配置时,写到输出数据寄存器上的值(GPIOx_ODR)输出到相应的I/O引脚。可以以推 挽模式或开漏模式(当输出0时,只有N-MOS被打开)使用输出驱动器。
输入数据寄存器(GPIOx_IDR)在每个APB2时钟周期捕捉I/O引脚上的数据。
所有GPIO引脚有一个内部弱上拉和弱下拉,当配置为输入时,它们可以被激活也可以被断开。
- 复用功能(AF)
对于复用的输入功能,端口必须配置成输入模式(浮空、上拉或下拉)且输入引脚必须由外部 驱动
对于复用输出功能,端口必须配置成复用功能输出模式(推挽或开漏)
对于双向复用功能,端口位必须配置复用功能输出模式(推挽或开漏)。这时,输入驱动器被 配置成浮空输入模式
2、GPIO_Speed
GPIO_Speed 用以设置选中管脚的速率。
二、GPIO固件库函数
1、开启GPIO时钟
RCC库函数 RCC_APB2PeriphClockCmd 使能或者失能 APB2 外设时钟
参数1:
RCC_AHB2Periph 描述
RCC_APB2Periph_AFIO 功能复用 IO 时钟
RCC_APB2Periph_GPIOA GPIOA 时钟
RCC_APB2Periph_GPIOB GPIOB 时钟
RCC_APB2Periph_GPIOC GPIOC 时钟
RCC_APB2Periph_GPIOD GPIOD 时钟
RCC_APB2Periph_GPIOE GPIOE 时钟
RCC_APB2Periph_ADC1 ADC1 时钟
RCC_APB2Periph_ADC2 ADC2 时钟
RCC_APB2Periph_TIM1 TIM1 时钟
RCC_APB2Periph_SPI1 SPI1 时钟
RCC_APB2Periph_USART1 USART1 时钟
RCC_APB2Periph_ALL 全部 APB2 外设时钟
输入参数2:
参数可以取: ENABLE 或者 DISABLE
以PC13为例:
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);
//函数原形:
void RCC_APB2PeriphClockCmd(uint32_t RCC_APB2Periph, FunctionalState NewState)
2、初始化函数
typedef enum
{
GPIO_Speed_10MHz = 1,
GPIO_Speed_2MHz,
GPIO_Speed_50MHz
}GPIOSpeed_TypeDef;//输出速率
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;//模式选择
typedef struct
{
uint16_t GPIO_Pin;
GPIOSpeed_TypeDef GPIO_Speed;
GPIOMode_TypeDef GPIO_Mode;
}GPIO_InitTypeDef;//结构体
#define PAout(n) BIT_ADDR(GPIOA_ODR_Addr,n) //输出
#define PAin(n) BIT_ADDR(GPIOA_IDR_Addr,n) //输入
#define PBout(n) BIT_ADDR(GPIOB_ODR_Addr,n) //输出
#define PBin(n) BIT_ADDR(GPIOB_IDR_Addr,n) //输入
#define PCout(n) BIT_ADDR(GPIOC_ODR_Addr,n) //输出
#define PCin(n) BIT_ADDR(GPIOC_IDR_Addr,n) //输入
#define PDout(n) BIT_ADDR(GPIOD_ODR_Addr,n) //输出
#define PDin(n) BIT_ADDR(GPIOD_IDR_Addr,n) //输入
#define PEout(n) BIT_ADDR(GPIOE_ODR_Addr,n) //输出
#define PEin(n) BIT_ADDR(GPIOE_IDR_Addr,n) //输入
#define PFout(n) BIT_ADDR(GPIOF_ODR_Addr,n) //输出
#define PFin(n) BIT_ADDR(GPIOF_IDR_Addr,n) //输入
#define PGout(n) BIT_ADDR(GPIOG_ODR_Addr,n) //输出
#define PGin(n) BIT_ADDR(GPIOG_IDR_Addr,n) //输入
void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct)//初始化参数GPIO端口和结构体指针变量
void GPIO_SetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)//设置高电平
void GPIO_ResetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)//设置地电平
3、实例
#include "led.h"
#include <stm32f10x_rcc.h>
void LED_Init()
{
GPIO_InitTypeDef GPIO_InitStruct;
//使能GPIOC时钟——>APB2
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_13;//GPIOC13
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;//推挽输出
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
//初始化GPIOC13引脚,设置输出模式
GPIO_Init(GPIOC,&GPIO_InitStruct);
GPIO_SetBits(GPIOC,GPIO_Pin_13);//设置为高电平
}
最后
以上就是开心乌龟为你收集整理的通用和复用功能I/O(GPIO和AFIO)的全部内容,希望文章能够帮你解决通用和复用功能I/O(GPIO和AFIO)所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复