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为低电平
因篇幅问题不能全部显示,请点此查看更多更全内容