前言
本文笔记总结stm32F1xx的GPIO的寄存器说明和标准库中的函数说明、用法,使用案例;
一、概念
GPIO为通用输入输出端口的简称,作为主控芯片的一个外设在芯片中是一个必要的外设,主控芯片与外接芯片通信离不开IO的操作;
gpio外设端口一般包括方向、驱动能力、复用模式等属性,可以通过芯片的寄存器进行配置,在不同的芯片中配置大同小异;
二、主要文件
头文件 stm32f10x_gpio.h
源文件 stm32f10x_gpio.c
三、库函数和寄存器
GPIO包括PA PB PC PD PD等几组端口,每组有16个引脚最多即pin0到pin15;
寄存器
typedef struct
{
__IO uint32_t CRL;//gpio配置低寄存器配置GPIO端口pin0到pin7号脚,每个脚的配置占4个bit为一组7个引脚占满这个32位寄存器, 4个bit中的低两位设置引脚为输入还是输出高两位对针对低两位的方向进行进一步设置具体看手册详细了解
__IO uint32_t CRH; //同CRL设置pin8到pin15引脚
__IO uint32_t IDR; //当设置引脚为普通IO(非复用)模式时,方向为输入时,读取此寄存器获取对应引脚的电平,低15bit有效对应pin0到pin15,只能以16bit读不能写
__IO uint32_t ODR; //当设置引脚为普通IO(非复用)模式时,方向为输出时,读取此寄存器获取对应引脚的电平,低15bit有效对应pin0到pin15
__IO uint32_t BSRR; //端口引脚对应bit位设置和清除寄存器,低16位用于设置pin0到pin15为高定平只有写入1才有效,高16位用于设置pin0到pin15为低电平只有写入1才有效,此寄存器只有对应为1才有效用于配置引脚为高还是低
__IO uint32_t BRR; //端口引脚对应bit位清除寄存器,低15位有效
__IO uint32_t LCKR; //端口锁定寄存器
} GPIO_TypeDef;
库函数
==void GPIO_DeInit(GPIO_TypeDef* GPIOx)==
对某个GPIO端口进行复位,实际操作RCC外设APB2RSTR寄存器,对应的位置1时复位相应外设,随后置0释放复位;
==void GPIO_AFIODeInit(void)==
对GPIO复用模块进行复位,对应的位置1时复位,不需要写0再去释放执行一次复位即可;
==void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct)==
对GPIO端口的某个脚或者某几个脚进行配置, 对引脚的具体配置见这个GPIO_InitTypeDef结构体的成员;
==void GPIO_StructInit(GPIO_InitTypeDef* GPIO_InitStruct)==
将GPIO_InitStruct这个结构体配置成默认模式,纯软件的配置
==uint8_t GPIO_ReadInputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)==
当引脚设置为普通gpio模式方向为输入时获取某个引脚的电平, 读取的IDR寄存器低15bin,并根据引脚号进行判断
==uint16_t GPIO_ReadInputData(GPIO_TypeDef* GPIOx)==
当引脚设置为普通gpio模式方向为输入时获取某个端口所有引脚的电平, 读取的IDR寄存器低15bit
==uint8_t GPIO_ReadOutputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)==
当引脚设置为普通gpio模式方向为输出时获取端口某个引脚的电平, 读取的ODR寄存器低15bit,并根据引脚号进行判断
==uint16_t GPIO_ReadOutputData(GPIO_TypeDef* GPIOx)==
当引脚设置为普通gpio模式方向为输出时获取端口所有引脚的电平, 读取的ODR寄存器低15bit
==void GPIO_SetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)==
设置端口的某个引脚为高, 实际操作的BSRR寄存器
==void GPIO_ResetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)==
复位端口的某个引脚为低, 实际操作的BRR寄存器
==void GPIO_WriteBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, BitAction BitVal)==
设置端口的某个引脚为高或者低,实际操作的BSRR 和 BRR 可以代替以上两个函数
==void GPIO_Write(GPIO_TypeDef* GPIOx, uint16_t PortVal)==
设置一个端口的所有引脚的电平,适用于端口设置为普通IO且为输出方向,实际调用的ODR寄存器
==void GPIO_PinLockConfig(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)==
操作端口锁定, 这个函数的用处在于,对gpio端口的某个引脚的配置更加严谨,防止不该操作引脚的流程去操作引脚
==void GPIO_EventOutputConfig(uint8_t GPIO_PortSource, uint8_t GPIO_PinSource)==
配置端口的某个脚为作为事件输出
==void GPIO_EventOutputCmd(FunctionalState NewState)==
触发这个脚的事件输出,事件输出的波形是一个脉冲,如果按平常的方式操作io的电平需要先写高延时一段再写低或者反之,使用此方式调用一次即可
==void GPIO_PinRemapConfig(uint32_t GPIO_Remap, FunctionalState NewState)==
设置引脚的复用功能, 实际操作AFIO外设的MAPR2或MAPR寄存器
==void GPIO_EXTILineConfig(uint8_t GPIO_PortSource, uint8_t GPIO_PinSource)==
设置某个端口的某个脚为外部中断的中断输入源
==void GPIO_ETH_MediaInterfaceConfig(uint32_t GPIO_ETH_MediaInterface)==
设置ETH接口为MII或者RMII
四、几个数据结构
gpio配置结构体:
typedef struct
{
uint16_t GPIO_Pin; /*!< Specifies the GPIO pins to be configured.
This parameter can be any value of @ref GPIO_pins_define */
GPIOSpeed_TypeDef GPIO_Speed; /*!< Specifies the speed for the selected pins.
This parameter can be a value of @ref GPIOSpeed_TypeDef */
GPIOMode_TypeDef GPIO_Mode; /*!< Specifies the operating mode for the selected pins.
This parameter can be a value of @ref GPIOMode_TypeDef */
}GPIO_InitTypeDef;
gpio模式枚举:
typedef enum
{ GPIO_Mode_AIN = 0x0, //配置io进行ad输入采集时的模式
GPIO_Mode_IN_FLOATING = 0x04, //当配置io为双边沿中断触发时
GPIO_Mode_IPD = 0x28, //配置io为普通io方向为输入时
GPIO_Mode_IPU = 0x48, //配置io为普通io方向为输入时
GPIO_Mode_Out_OD = 0x14, //配置io为普通io方向为输出时
GPIO_Mode_Out_PP = 0x10, //配置io为普通io方向为输出时
GPIO_Mode_AF_OD = 0x1C, //配置io为复用io时
GPIO_Mode_AF_PP = 0x18 //配置io为复用io时
}GPIOMode_TypeDef;
五、使用方式
基本用法编程序列
1、使能某个端口
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
2、进行GPIO配置
GPIO_Init(GPIOA, &GPIO_InitStructure);
对引脚的模式、方向、速率进行设置;
3、操作读写
可以读写某个引脚或者端口中所有引脚;
扩展用法编程序列
当使用其作为某个复用功能时,如SPI、I2C、CAN等时,需要使用
GPIO_Init(GPIOA, &GPIO_InitStructure)配置复用,GPIO_PinRemapConfig配置具体复用为什么引脚;
当使用其作为中断时,需要GPIO_EXTILineConfig配置中断线,并调用NVIC相关的函数NVIC_Init 配置优先级、中断触发类型,编辑中断处理函数处理中断清除和中断中具体处理的业务;