赞
踩
STM32全部教程
:【STM32】标准库与HAL库对照学习系列教程大全
本篇内容是的STM32GPIO的详讲,是为库函数配置做铺垫,本篇以STM32F103ZE为例,详细对GPIO进行讲解。
GPIO英文全称general purpose intput output,是通用输入输出端口的简称,可以通过软件来控制其输入和输出。STM32芯片的GPIO引脚与外部设备连接起来,从而实现与外部通讯、控制以及数据采集的功能。
STM32芯片有很多的内置外设,些外设的外部引脚都是与GPIO共用的,也就是说,一个引脚除了输入输出电平,还可以使用别的功能,但默认功能是电平的输入输出,要使用其他功能的时候,就需要GPIO的复用。例如:IIC通信就是GPIO引脚的复用。
GPIO其内部结构图,如下:
图片在STN32F1xx中文参考手册的105页
注释: VDD_FT 代表IO口,兼容3.3V和5V,如果没有标注“FT”,就代表着不兼容5V
图片在数据手册34页
注:当GPIO用于模拟功能时,引脚的上、下拉电阻是不起作用的,这个时候即使配置了上拉或下拉模式,也不会影响到模拟信号的输入输出。
除了 ADC 和 DAC 要将 IO 配置为模拟通道之外其他外设功能一律 要配置为复用功能模式。
注:此时输入是可用,通过输入数据寄存器GPIOx_IDR可读取I/O的实际状态。I/O口的电平是输出的电平。
typedef struct
{
uint16_t GPIO_Pin; //要配置的GPIO管脚
GPIOSpeed_TypeDef GPIO_Speed; //GPIO管脚输出速度的配置
GPIOMode_TypeDef GPIO_Mode; //GPIO管脚模式配置
}GPIO_InitTypeDef;
结构体第一个元素可配置的引脚
#define GPIO_Pin_0 ((uint16_t)0x0001)
#define GPIO_Pin_1 ((uint16_t)0x0002)
#define GPIO_Pin_2 ((uint16_t)0x0004)
#define GPIO_Pin_3 ((uint16_t)0x0008)
#define GPIO_Pin_4 ((uint16_t)0x0010)
#define GPIO_Pin_5 ((uint16_t)0x0020)
#define GPIO_Pin_6 ((uint16_t)0x0040)
#define GPIO_Pin_7 ((uint16_t)0x0080)
#define GPIO_Pin_8 ((uint16_t)0x0100)
#define GPIO_Pin_9 ((uint16_t)0x0200)
#define GPIO_Pin_10 ((uint16_t)0x0400)
#define GPIO_Pin_11 ((uint16_t)0x0800)
#define GPIO_Pin_12 ((uint16_t)0x1000)
#define GPIO_Pin_13 ((uint16_t)0x2000)
#define GPIO_Pin_14 ((uint16_t)0x4000)
#define GPIO_Pin_15 ((uint16_t)0x8000)
#define GPIO_Pin_All ((uint16_t)0xFFFF)
结构体第二个元素配置的速度
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;
定义文件在stm32f10x.gpio.h中
typedef struct
{
uint32_t Pin; //要配置的GPIO管脚
uint32_t Mode; //GPIO管脚模式配置
uint32_t Pull; //GPIO管脚上拉、下拉配置
uint32_t Speed; //GPIO管脚输出速度的配置
} GPIO_InitTypeDef;
结构体第一个元素可配置的引脚
#define GPIO_PIN_0 ((uint16_t)0x0001)
#define GPIO_PIN_1 ((uint16_t)0x0002)
#define GPIO_PIN_2 ((uint16_t)0x0004)
#define GPIO_PIN_3 ((uint16_t)0x0008)
#define GPIO_PIN_4 ((uint16_t)0x0010)
#define GPIO_PIN_5 ((uint16_t)0x0020)
#define GPIO_PIN_6 ((uint16_t)0x0040)
#define GPIO_PIN_7 ((uint16_t)0x0080)
#define GPIO_PIN_8 ((uint16_t)0x0100)
#define GPIO_PIN_9 ((uint16_t)0x0200)
#define GPIO_PIN_10 ((uint16_t)0x0400)
#define GPIO_PIN_11 ((uint16_t)0x0800)
#define GPIO_PIN_12 ((uint16_t)0x1000)
#define GPIO_PIN_13 ((uint16_t)0x2000)
#define GPIO_PIN_14 ((uint16_t)0x4000)
#define GPIO_PIN_15 ((uint16_t)0x8000)
#define GPIO_PIN_All ((uint16_t)0xFFFF)
结构体第二个元素配置的模式
#define GPIO_MODE_INPUT 0x00000000u //输入模式
#define GPIO_MODE_OUTPUT_PP 0x00000001u //推挽输出模式
#define GPIO_MODE_OUTPUT_OD 0x00000011u //开漏输出模式
#define GPIO_MODE_AF_PP 0x00000002u //复用推挽输出模式
#define GPIO_MODE_AF_OD 0x00000012u //复用开漏输出模式
#define GPIO_MODE_AF_INPUT GPIO_MODE_INPUT //模拟输入模式
结构体第三个元素上拉下拉的配置模式
#define GPIO_NOPULL 0x00000000u //没有上拉下拉
#define GPIO_PULLUP 0x00000001u //上拉
#define GPIO_PULLDOWN 0x00000002u //下拉
结构体第四个元素输出速度配置
#define GPIO_SPEED_FREQ_LOW (GPIO_CRL_MODE0_1) //低速
#define GPIO_SPEED_FREQ_MEDIUM (GPIO_CRL_MODE0_0) //中速
#define GPIO_SPEED_FREQ_HIGH (GPIO_CRL_MODE0) //高速
#define GPIO_CRL_MODE_Pos (0U)
#define GPIO_CRL_MODE_Msk (0x33333333UL << GPIO_CRL_MODE_Pos) /*!< 0x33333333 */
#define GPIO_CRL_MODE GPIO_CRL_MODE_Msk /*!< Port x mode bits */
#define GPIO_CRL_MODE0_Pos (0U)
#define GPIO_CRL_MODE0_Msk (0x3UL << GPIO_CRL_MODE0_Pos) /*!< 0x00000003 */
#define GPIO_CRL_MODE0 GPIO_CRL_MODE0_Msk /*!< MODE0[1:0] bits (Port x mode bits, pin 0) */
#define GPIO_CRL_MODE0_0 (0x1UL << GPIO_CRL_MODE0_Pos) /*!< 0x00000001 */
#define GPIO_CRL_MODE0_1 (0x2UL << GPIO_CRL_MODE0_Pos) /*!< 0x00000002 */
定义在stm32f1xx_hal_gpio.h文件内
到这里,STM32GPIO的介绍就结束啦!
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。