您的当前位置:首页正文

STM32——GPIO原理及库函数应用

来源:华佗健康网


STM32引脚说明

STM32F103RCT6 

  • 共有4组IO口
  • 前三组IO每组16个IO,最后一组3个IO
  •  一共 16x3+3=51个IO口
  •  GPIOA0~A15 GPIOB0~B15 GPIOC0~C15 GPIOD0~D2

 注:STM32大部分引脚除了当GPIO使用外,还可以复用为外设功能引脚(比如串口)

GPIO基本结构

四种输入模式四种输出模式最大翻转速度
输入浮空(开关全开)开漏输出(N-MOS决定)2MHZ
输入上拉(上开关闭合)开漏复用式输出(复用功能决定)10MHZ
输入下拉(下开关闭合)推挽式输出(P-MOS决定)50MHZ
模拟输入(AD转换)推挽式复用输出(复用功能决定)

 GPIO工作方式

  • 上电后,GPIO默认为浮空状态
  • 推挽输出:可以输出强高低电平,连接数字器件
  • 开漏输出:只可以输出强低电平,强高电平得靠外部高电平拉高

GPIO相关配置寄存器

每组GPIO端口的寄存器包括:

  • 两个32位配置寄存器(GPIOx_CRL和GPIOx_CRH)
  • 两个32位数据寄存器 (GPIOx_IDR和GPIOx_ODR)
  • 一个32位置位/复位寄存器(GPIOx_BSRR)
  • 一个16位复位寄存器(GPIOx_BRR)
  • 一个32位锁定寄存器(GPIOx_LCKR)
  • 注:每个IO可以自由编程,但必须按32位字被访问(不允许半字节或字节访问)

 端口配置低寄存器(GPIOx_CRL)

 端口配置高寄存器(GPIOx_CRH)

 

 注:因一组GPIO有16个IO口,故需要高寄存器和低寄存器,前八个IO由低寄存器控制,后八个IO由高寄存器控制

 端口输入数据寄存器(GPIOx_IDR)

 端口输出数据寄存器(GPIOx_ODR)

 端口位设置/清除寄存器(GPIOx_BSRR)

 端口位清除寄存器(GPIOx_BRR)

库函数介绍

库函数位置:

  • 头文件:stm32f10x_gpio.h
  • 源文件:stm32f10x_gpio.c

初始化函数

实现函数:void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct);

作用:初始化一个或者多个IO口(同一组)的工作方式和速度。

注:主要完成GPIO_CRL(CRH)配置寄存器的操作

使用实例:

 GPIO_InitTypeDef  GPIO_InitStructure;
	
 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; //LED0-->PB.5 端口配置
 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;  //推挽输出
 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度为50MHz
 GPIO_Init(GPIOB, &GPIO_InitStructure);	 //根据设定参数初始化GPIOB.5

 读输入电平函数:

实现函数:uint8_t GPIO_ReadInputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);

作用: 读取某个GPIO的输入电平

注:主要完成GPIOx_IDR寄存器的配置。

使用实例:

  GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_5);//读取GPIOA.5的输入电平

实现函数:uint16_t GPIO_ReadInputData(GPIO_TypeDef* GPIOx);

作用:读取某组GPIO的输入电平。

注:主要完成GPIOx_IDR寄存器的配置。

使用实例:

GPIO_ReadInputData(GPIOA);//读取GPIOA组中所有io口输入电平

读输出电平函数:

实现函数:uint8_t GPIO_ReadOutputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);

作用: 读取某个GPIO的输出电平

注:主要完成GPIOx_ODR寄存器的配置。

使用实例:

  GPIO_ReadOutputDataBit(GPIOA, GPIO_Pin_5);//读取GPIOA.5的输出电平

实现函数:uint16_t GPIO_ReadOnputData(GPIO_TypeDef* GPIOx);

作用:读取某组GPIO的输出电平。

注:主要完成GPIOx_ODR寄存器的配置。

使用实例:

GPIO_ReadOutputData(GPIOA);//读取GPIOA组中所有io口输出电平

设置输出电平函数:

实现函数:void GPIO_SetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);

作用:设置某个IO口输出位高电平

注:实际操作BSSR寄存器

使用实例:

void GPIO_SetBits(GPIOA, GPIO_Pin_5);//设置GPIOA.5的输出高电平

实现函数:void GPIO_ResetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);

作用:设置某个IO口输出位低电平

注:实现操作BRR寄存器

使用实例:

void GPIO_ResetBits(GPIOA, uint16_t GPIO_Pin_5);//设置GPIOA.5为低电平

因篇幅问题不能全部显示,请点此查看更多更全内容