STM32学习笔记(二)--GPIO通用输入输出口详解

(1)配置步骤
++++1.使用RCC开启GPIO时钟++++
++++2.使用GPIO_Init函数初始化GPIO++++
++++3.使用输入或输出的函数等来控制GPIO++++

其中涉及外设有RCC、GPIO

(2)代码示例

案例1(设置PA0为推挽输出)

cpp 复制代码
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);

案例2(设置PB1 PB11为上拉输入)

cpp 复制代码
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_11;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);

(3)函数分析

函数1:void RCC_APB2PeriphClockCmd(uint32_t RCC_APB2Periph, FunctionalState NewState)(stm32f10x_rcc.h)

这个APB2外设时钟控制的函数用于使能或者失能APB2外设时钟的。

|-----|----------------|---------------|----------------------|
| 序号 | 名称 | 参数解释 | 示例 |
| 参数1 | RCC_APB2Periph | 选择哪个外设,根据列表选择 | RCC_APB2Periph_GPIOA |
| 参数2 | NewState | 使能或者失能 | ENABLE、DISABLE |

同理RCC_AHBPeriphClockCmd RCC_APB1PeriphClockCmd只是总线上的外设不同

函数2:void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct);(stm32f10x_gpio.h) 用结构体的参数来初始化GPIO口,包含配置8种模式的选择、引脚号、引脚速度。

|-----|------------------------------------|--------------------------|----------------------|
| 序号 | 名称 | 参数解释 | 示例 |
| 参数1 | GPIO_TypeDef* GPIOx | 可以是A到G任何一个GPIO外设 | GPIOB |
| 参数2 | GPIO_InitTypeDef* GPIO_InitStruct | 结构体指针,该结构体包含了所有GPIO外设的信息 | &GPIO_InitStructure |

补充:注意GPIO_InitTypeDef结构体中的GPIO_InitStructure.GPIO_Mode,作用是八种模式的选择,如下所示;

|--------|------|------------------------------|---------------------------|
| 模式名称 | 性质 | 成员变量 | 特征 |
| 浮空输入 | 数字输入 | GPIO_Mode_IN_FLOATING = 0x04 | 读引脚电平,若悬空则电平不确定 |
| 上拉输入 | 数字输入 | GPIO_Mode_IPU = 0x48 | 可读取引脚电平,内部连接上拉电阻,悬空时默认高电平 |
| 下拉输入 | 数字输入 | GPIO_Mode_IPD = 0x28 | 可读取引脚电平,内部连接下拉电阻,悬空时默认低电平 |
| 模拟输入 | 模拟输入 | GPIO_Mode_AIN = 0x0 | GPIO无效,引脚进入内部ADC |
| 开漏输出 | 数字输出 | GPIO_Mode_Out_OD = 0x14 | 可输出引脚电平,高电平为高阻态,低电平接VSS |
| 推挽输出 | 数字输出 | GPIO_Mode_Out_PP = 0x10 | 可输出引脚电平,高电平接VDD,低电平接VSS |
| 复用开漏输出 | 数字输出 | GPIO_Mode_AF_OD = 0x1C | 由片上外设控制,高电平为高阻态,低电平接VSS |
| 服用推挽输出 | 数字输出 | GPIO_Mode_AF_PP = 0x18 | 由片上外设控制,高电平接VDD,低电平接VSS |

函数3:uint8_t GPIO_ReadInputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)(stm32f10x_gpio.h)

该函数主要是读取指定端口引脚电平状态的作用,返回引脚电平bitstatus。

|-----|----------------------|-------|------------|
| 序号 | 名称 | 参数解释 | 示例 |
| 参数1 | GPIO_TypeDef* GPIOx | 端口号选择 | GPIOB |
| 参数2 | uint16_t GPIO_Pin | 引脚号选择 | GPIO_Pin_1 |

函数4:void GPIO_WriteBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, BitAction BitVal)(stm32f10x_gpio.h)

该函数主要是写指定端口引脚的电平状态。

|-----|----------------------|-------|------------|
| 序号 | 名称 | 参数解释 | 示例 |
| 参数1 | GPIO_TypeDef* GPIOx | 端口号选择 | GPIOB |
| 参数2 | uint16_t GPIO_Pin | 引脚号选择 | GPIO_Pin_1 |
| 参数3 | BitVal | 电平状态 | 0或者1 |

相关推荐
落子摘星7 分钟前
suricata学习杂记(一)
学习·modbus·suricata·pdu
U***746918 分钟前
Linux(CentOS)安装 MySQL
linux·mysql·centos
3***g20519 分钟前
Linux系统离线部署MySQL详细教程(带每步骤图文教程)
linux·mysql·adb
charlie11451419126 分钟前
深入理解C/C++的编译链接技术6——A2:动态库设计基础之ABI设计接口
c语言·开发语言·c++·学习·动态库·函数
white-persist32 分钟前
【攻防世界】reverse | Reversing-x64Elf-100 详细题解 WP
c语言·开发语言·网络·python·学习·安全·php
love530love34 分钟前
【保姆级教程】Windows + Podman 从零部署 Duix-Avatar 数字人项目
人工智能·windows·笔记·python·数字人·podman·duix-avatar
Dovis(誓平步青云)35 分钟前
《内核视角下的 Linux 锁与普通生产消费模型:同步原语设计与性能优化思路》
linux·运维·性能优化
xu_yule1 小时前
Linux_13(多线程)页表详解+轻量级进程+pthread_create
linux·运维·服务器
Want5951 小时前
C/C++贪吃蛇小游戏
c语言·开发语言·c++
草莓熊Lotso2 小时前
《算法闯关指南:动态规划算法--斐波拉契数列模型》--01.第N个泰波拉契数,02.三步问题
开发语言·c++·经验分享·笔记·其他·算法·动态规划