我是靠谱客的博主 开心乌龟,最近开发中收集的这篇文章主要介绍通用和复用功能I/O(GPIO和AFIO),觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

一、通用和复用功能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

image-20220406173546435

  • 通用I/O(GPIO)

当作为输出配置时,写到输出数据寄存器上的值(GPIOx_ODR)输出到相应的I/O引脚。可以以推 挽模式或开漏模式(当输出0时,只有N-MOS被打开)使用输出驱动器。
输入数据寄存器(GPIOx_IDR)在每个APB2时钟周期捕捉I/O引脚上的数据。
所有GPIO引脚有一个内部弱上拉和弱下拉,当配置为输入时,它们可以被激活也可以被断开。

  • 复用功能(AF)

对于复用的输入功能,端口必须配置成输入模式(浮空、上拉或下拉)且输入引脚必须由外部 驱动

对于复用输出功能,端口必须配置成复用功能输出模式(推挽或开漏)

对于双向复用功能,端口位必须配置复用功能输出模式(推挽或开漏)。这时,输入驱动器被 配置成浮空输入模式

2、GPIO_Speed

GPIO_Speed 用以设置选中管脚的速率。

image-20220406173959298

二、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)所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(44)

评论列表共有 0 条评论

立即
投稿
返回
顶部