stm32F1xx外设GPIO的用法总结

目录

前言

本文笔记总结stm32F1xx的GPIO的寄存器说明和库函数说明、用法,使用案例;

一、概念

GPIO为通用输入输出端口的简称,作为主控芯片的一个外设在芯片中是一个必要的外设,主控芯片与外接芯片通信离不开IO的操作;

gpio外设端口一般包括方向、驱动能力、复用模式等属性,可以通过芯片的寄存器进行配置,在不同的芯片中配置大同小异;

二、主要文件

头文件 stm32f10x_gpio.h

源文件 stm32f10x_gpio.c

三、库函数和寄存器

GPIO包括PA PB PC PD PD等几组端口,每组有16个引脚最多即pin0到pin15;
寄存器

c 复制代码
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;

库函数

c 复制代码
==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配置结构体:

c 复制代码
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模式枚举:

c 复制代码
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 配置优先级、中断触发类型,编辑中断处理函数处理中断清除和中断中具体处理的业务;

相关推荐
嵌入式小白牙2 小时前
ARM-I2C硬实现
arm开发·单片机·嵌入式硬件
knight_20244 小时前
嵌入式学习日志————对射式红外传感器计次
stm32·单片机·嵌入式硬件·学习
忆和熙4 小时前
【模电笔记】—— 波形发生电路(波形振荡器)
嵌入式硬件·模电笔记·波形发生电路
文火冰糖的硅基工坊4 小时前
[硬件电路-97]:模拟器件 - 如何通过外部的闭环负反馈,让运算放大器从“暴脾气”、“愣头青”、情绪容易失控者变成“沉着”、“冷静”的精密调控者的?
嵌入式硬件·架构·电路·跨学科融合
Ronin-Lotus4 小时前
嵌入式硬件篇---驱动板
单片机·嵌入式硬件·esp32·驱动板
##echo5 小时前
嵌入式Linux裸机开发笔记9(IMX6ULL)GPIO 中断实验(1)
linux·c语言·笔记·单片机·嵌入式硬件
Ronin-Lotus5 小时前
嵌入式硬件篇---ESP32拓展板
stm32·单片机·嵌入式硬件
弄曲幽篁11 小时前
精密全波整流电路(四)
嵌入式硬件·硬件工程
邹诗钰-电子信息工程12 小时前
bmp280的压力数据采集(i2c设备驱动+设备树编写)
stm32·单片机·嵌入式硬件
Ronin-Lotus15 小时前
嵌入式硬件篇---有线串口通信问题解决
单片机·嵌入式硬件·ttl·rs232·rs485·有线串口