本笔记是根据STM32F429单片机的,其他STM32单片机与此类似,基本上都一样的,会一款,其他的基本上没啥问题。本人也是刚学,有不足之处请下方评论。
目录
笔记1 GPIO操作
1.1 读-修改-写操作
常用操作:
位与,&:可实现目标字段的清零,而不影响其他字段。
一般格式:操作对象&=屏蔽字。
屏蔽字的目标字段设置为0,其他设置为1.
例如:将GPIOA端口的3号、10号引脚输出低电平,使用位与操作将GPIOA的ODR的3位和10位清零实现。
GPIOA->ODR&=~(1<<3 |1<<10);
其中,~(1<<3 |1<<10)是操作需要的屏蔽字,将1左移3位和1左移10位合并在一起,然后取反得到。
位或,|:可实现目标字段的置位,而不影响其他字段。
一般格式:操作对象 | =屏蔽字。
屏蔽字的目标字段设置为1,其他设置为0。
例如:将GPIOA端口的2号、8号引脚输出高电平,使用位或操作将GPIOA的ODR的2位和8位置位实现。
GPIOA->ODR|=(1<<2 |1<<8);
其中,(1<<2 |1<<8)是操作需要的屏蔽字,将1左移2位和1左移8位合并在一起得到。
异或,^:可实现目标字段的取反,而不影响其他字段。
一般格式:操作对象^=屏蔽字。
屏蔽字的目标字段设置为1,其他设置为0.
例如:将GPIOA端口的1号、11号和13号引脚的电平反转,使用异或操作将GPIOA的ODR的1位、11位和13位取反实现。
GPIOA->ODR^=(1<<1)| (1<<11) | (1<<13);
其中,(1<<1)| (1<<11) | (1<<13);是操作需要的屏蔽字,将1左移1位、1左移11位和1左移13位合并在一起得到。
1.2 GPIO结构原理
GPIO引脚的内部构造图如图所示,每个GPIO相互独立,包括输入驱动器、输出驱动器、上拉/下拉控制电路和5V耐压保护电路
每个通用 I/O 端口包括以下寄存器 :
- 4 个 32 位配置寄存器(GPIOx_MODER、GPIOx_OTYPER、GPIOx_OSPEEDR 和 GPIOx_PUPDR)
- 2 个 32 位数据寄存器(GPIOx_IDR 和 GPIOx_ODR)、
- 1 个 32 位置位/复位寄存器 (GPIOx_BSRR)、
- 1 个 32 位锁定寄存器 (GPIOx_LCKR) 和
- 2 个 32 位复用功能选择寄存器(GPIOx_AFRH 和 GPIOx_AFRL)。
每个GPIO有16个引脚,每个引脚都可以单独配置。
GPIO功能描述
根据应用需求,可通过软件将通用 I/O (GPIO) 端口对应的各个引脚位分别配置为多种模式:
● 输入浮空-上电默认模式
● 输入上拉
● 输入下拉
● 模拟功能
● 具有上拉或下拉功能的开漏输出
● 具有上拉或下拉功能的推挽输出
● 具有上拉或下拉功能的复用功能推挽
● 具有上拉或下拉功能的复用功能开漏
GPIO 结构图
1.3 GPIO 输出配置
对 I/O 端口进行编程作为输出时:
●输出缓冲器被打开: 开漏模式和推挽模式
● 施密特触发器输入被打开
● 根据 GPIOx_PUPDR 寄存器中的值决定是否打开弱上拉电阻和下拉电阻
● 输入数据寄存器每隔 1 个 AHB1 时钟周期对 I/O 引脚上的数据进行一次采样
● 对输入数据寄存器的读访问可获取 I/O 状态
● 对输出数据寄存器的读访问可获取最后的写入值
推挽输出:
可以直接输出高电平和低电平。
开漏输出:
默认只可以输出低电平
输出高电平需要加上拉电阻拉高。
GPIO 复用功能配置
● 可将输出缓冲器配置为开漏或推挽
● 输出缓冲器由来自外设的信号驱 动(发送器使能和数据)
● 施密特触发器输入被打开
● 根据 GPIOx_PUPDR 寄存器中的值决定是否打开弱上拉电阻和下拉电阻
● 输入数据寄存器每隔 1 个 AHB1 时钟周期对 I/O 引脚上的数据进行一次采样
● 对输入数据寄存器的读访问可获取 I/O 状态
GPIO模拟配置
● 输出缓冲器被禁止。
● 施密特触发器输入停用,I/O 引脚的每个模拟输入的功耗变为零。施密特触发器的输出被 强制处理为恒定值 (0)。
● 弱上拉和下拉电阻被关闭。
● 对输入数据寄存器的读访问值为“0”。
注意:在模拟配置中,I/O 引脚不能为 5 V 容忍。
GPIO典型应用步骤
使用库函数实现GPIO的应用,一般需要以下几步:
(1)使能GPIO的时钟(非常重要),涉及以下文件:
头文件:stm32f4xx_rcc.h
源文件:stm32f4xx_rcc.c
使用的主要函数:
RCC_AHB1PeriphClockCmd(uint32_t RCC_AHB1Periph, FunctionalState NewState)
RCC_AHB2PeriphClockCmd(uint32_t RCC_AHB2Periph, FunctionalState NewState)
RCC_APB1PeriphClockCmd(uint32_t RCC_APB1Periph, FunctionalState NewState)
RCC_APB2PeriphClockCmd(uint32_t RCC_APB2Periph, FunctionalState NewState)
例如:RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE)
(2)设置对应于片上外设使用的GPIO工作模式。
确定GPIO输入模式
如果是输出要确定是推挽还是开漏输出
配置输出速度模式
输出时,内部上拉/下拉电阻要不要开
(3)如果使用复用功能,需要单独设置每一个GPIO引脚的复用功能。
(4)在应用程序中读取引脚状态、控制引脚输出状态或使用复用功能完成特定功能
1.4 GPIO 常用函数
1、读取电平函数:
1)、uint8_t GPIO_ReadInputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
参数1:GPIO操作对象,
参数2:操作引脚。
作用:读取某个GPIO的输入电平。实际操作的是GPIOx_IDR寄存器。该函数每次只能获取一个引脚状态。
例如:
GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_5);//读取GPIOA.5的输入电平
2)、 uint16_t GPIO_ReadInputData(GPIO_TypeDef* GPIOx);
作用:读取某组GPIO的输入电平。实际操作的是GPIOx_IDR寄存器。该函数获取GPIO的IO口状态
例如:
GPIO_ReadInputData(GPIOA);//读取GPIOA组中所有IO口输入电平
2、读取输出电平数
1)、uint8_t GPIO_ReadOutputDataBit (GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
作用:读取某个GPIO的输出电平。实际操作的是GPIO_ODR寄存器。
例如:
GPIO_ReadOutputDataBit(GPIOA, GPIO_Pin_5);//读取GPIOA.5的输出电平
2)、uint16_t GPIO_ReadOutputData(GPIO_TypeDef* GPIOx);
作用:读取某组GPIO的输出电平。实际操作的是GPIO_ODR寄存器。
例如:
GPIO_ReadOutputData(GPIOA);//读取GPIOA组中所有io口输出电平
3、设置输出电平
函数
1)、void GPIO_SetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
作用:设置某个IO口输出为高电平(1)。实际操作BSRRL寄存器。该函数可同时设置多个引脚。
例如:
GPIO_SetBits(GPIOA, GPIO_Pin_5);//设置GPIOA.5输出高电平
2)、void GPIO_ResetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
作用:设置某个IO口输出为低电平(0)。实际操作的BSRRH寄存器。该函数可同时设置多个引脚。
3)、void GPIO_WriteBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, BitAction BitVal);
作用:设置某个GPIO为特定电平,实际操作的是置位/复位寄存器。
例如:设置GPIOA 2号引脚为高电平。
GPIO_ WriteBit(GPIOA,GPIO_Pin_2,Bit_SET);
GPIOA 5号引脚为高电平。
GPIO_ WriteBit(GPIOA,GPIO_Pin_5,Bit_RESET);
该函数只能设置一个引脚状态。
4)、void GPIO_Write(GPIO_TypeDef* GPIOx, uint16_t PortVal);
作用:设置某个GPIO所有引脚为特定电平,实际操作的输出数据寄存器。
参数2:16位的无符号数据,此数据每一位队形控制一个引脚的输出状态,0代表低电平,1代表高电平。
例如:设置GPIOA所有引脚为高电平
GPIO_Write(GPIOA,0xffff)
这两个函数不常用,也是用来设置IO口输出电平。
4、反转引脚状态
1)void GPIO _ToggleBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
作用:将GPIO引脚状态反转。使用位异或操作输出数据寄存器。
例如:设置GPIOA的3、5号引脚状态反转。
GPIO _ToggleBits(GPIOA,GPIO_Pin_3| GPIO_Pin_5)
5、复用功能设置函数
void GPIO_PinAFConfig(GPIO_TypeDef* GPIOx, uint16_t GPIO_PinSource, uint8_t GPIO_AF);
作用:将GPIO的某个引脚设置为特定的复用功能。操作的是复用功能低位寄存器或复用功能高位寄存器。