STM32-GPIO
一、GPIO简介
·GPIO(General Purpose Input Output)通用输入输出口
·可配置8种输入输出模式
·引脚电平:0V~3.3V,部分引脚可容忍5V
·输出模式下:可控制端口输出高低电平,用以驱动LED、控制蜂鸣器、模拟通信协议输出时序等
·输入模式下:可读取端口的高低电平或电压,用于读取按键输入、外界模块电平信号输入、ADC电压采集、模拟通信协议接收数据等
二、GPIO结构

三、GPIO位结构

四、GPIO模式
4.1 浮空/上拉/下拉输入
(GPIO_Mode_IN_FLOATING/GPIO_Mode_IPU/GPIO_Mode_IPD)
 

4.2 模拟输入(GPIO_Mode_AIN)
4.3 开漏/推挽输出
 (GPIO_Mode_Out_OD/GPIO_Mode_Out_PP)
 

4.4 复用开漏/推挽输出 
 (GPIO_Mode_AF_OD/GPIO_Mode_AF_PP)
 

五、GPIO库函数
void GPIO_DeInit(GPIO_TypeDef* GPIOx);//复位GPIO外设
void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct);//初始化GPIO
void GPIO_StructInit(GPIO_InitTypeDef* GPIO_InitStruct);//给结构体赋默认值GPIO读取函数
uint8_t GPIO_ReadInputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);//读取输入数据寄存器某一个端口的输入值
uint16_t GPIO_ReadInputData(GPIO_TypeDef* GPIOx);//读取整个输入数据寄存器,返回一个16位的数据
uint8_t GPIO_ReadOutputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);//读取输出数据寄存器某一个端口的输入值(输出模式)
uint16_t GPIO_ReadOutputData(GPIO_TypeDef* GPIOx);//读取整个输出数据寄存器
GPIO写入函数
void GPIO_SetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);//设置高电平
void GPIO_ResetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);//设置低电平
void GPIO_WriteBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, BitAction BitVal);
void GPIO_Write(GPIO_TypeDef* GPIOx, uint16_t PortVal);void GPIO_PinLockConfig(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
//锁定GPIO配置,防止意外更改
六、实验(GPIO输出)
6.1 LED闪烁
#include "stm32f10x.h"                  // Device header
#include "Delay.h"int main(void)
{//一、使用RCC开启GPIO时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//二、使用GPIO_Init函数初始化GPIOGPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA,&GPIO_InitStructure);while (1){//=====one:GPIO_WriteBit=====//
//		GPIO_WriteBit(GPIOA,GPIO_Pin_0,Bit_RESET);
//		Delay_ms(500);
//		GPIO_WriteBit(GPIOA,GPIO_Pin_0,Bit_SET);
//		Delay_ms(500);//=====two:GPIO_WriteBit 0/1=====//
//		GPIO_WriteBit(GPIOA,GPIO_Pin_0,(BitAction)0);
//		Delay_ms(500);
//		GPIO_WriteBit(GPIOA,GPIO_Pin_0,(BitAction)1);
//		Delay_ms(500);//=====three:GPIO_ResetBits  GPIO_SetBits=====//GPIO_ResetBits(GPIOA,GPIO_Pin_0);Delay_ms(500);GPIO_SetBits(GPIOA,GPIO_Pin_0);Delay_ms(500);}
}
 
6.2 LED流水灯
#include "stm32f10x.h"                  // Device header
#include "Delay.h"int main(void)
{RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7; //GPIO_InitStructure.GPIO_Pin = GPIO_Pin_All;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA,&GPIO_InitStructure);while (1){GPIO_Write(GPIOA,~0x0001);//0000 0000 0000 0001,PA15-PA0,低电平驱动所以取反Delay_ms(100);GPIO_Write(GPIOA,~0x0002);//0000 0000 0000 0010Delay_ms(100);GPIO_Write(GPIOA,~0x0004);//0000 0000 0000 0100Delay_ms(100);GPIO_Write(GPIOA,~0x0008);//0000 0000 0000 1000Delay_ms(100);GPIO_Write(GPIOA,~0x0010);//0000 0000 0001 0000Delay_ms(100);GPIO_Write(GPIOA,~0x0020);//0000 0000 0010 0000Delay_ms(100);GPIO_Write(GPIOA,~0x0040);//0000 0000 0100 0000Delay_ms(100);GPIO_Write(GPIOA,~0x0080);//0000 0000 1000 0000Delay_ms(100);}
}
 
6.3 蜂鸣器
#include "stm32f10x.h"                  // Device header
#include "Delay.h"int main(void)
{RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOB,&GPIO_InitStructure);while (1){GPIO_ResetBits(GPIOB,GPIO_Pin_12);Delay_ms(500);GPIO_SetBits(GPIOB,GPIO_Pin_12);Delay_ms(500);}
}
 
七、实验(GPIO输入)
7.1 按键控制LED
main.c
#include "stm32f10x.h" // Device header #include "Delay.h" #include "LED.h" #include "key.h"uint8_t KeyNum;int main(void) {LED_Init();//LED初始化Key_Init();//按键初始化while (1){KeyNum = Key_GetNum();//判断是哪一个按键按下if(KeyNum == 1){LED1_Turn();}if(KeyNum == 2){LED2_Turn();}} }LED.c
#include "stm32f10x.h" // Device headervoid LED_Init(void) {RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_2;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA,&GPIO_InitStructure);GPIO_SetBits(GPIOA,GPIO_Pin_1 | GPIO_Pin_2);//初始化高电平 }//=====LED1=====// void LED1_ON(void) {GPIO_ResetBits(GPIOA,GPIO_Pin_1); }void LED1_OFF(void) {GPIO_SetBits(GPIOA,GPIO_Pin_1); }void LED1_Turn(void) {if(GPIO_ReadOutputDataBit(GPIOA,GPIO_Pin_1) == 0) //读取LED输出的高低电平,控制翻转{GPIO_SetBits(GPIOA,GPIO_Pin_1);}else{GPIO_ResetBits(GPIOA,GPIO_Pin_1);}}//=====LED2=====// void LED2_ON(void) {GPIO_ResetBits(GPIOA,GPIO_Pin_2); }void LED2_OFF(void) {GPIO_SetBits(GPIOA,GPIO_Pin_2); }void LED2_Turn(void) {if(GPIO_ReadOutputDataBit(GPIOA,GPIO_Pin_2) == 0){GPIO_SetBits(GPIOA,GPIO_Pin_2);}else{GPIO_ResetBits(GPIOA,GPIO_Pin_2);} }key.c
#include "stm32f10x.h" // Device header #include "Delay.h"//===按键初始化===// void Key_Init(void) {RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;//上拉输入GPIO_InitStructure.GPIO_Pin = GPIO_Pin_14 | GPIO_Pin_11;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOB,&GPIO_InitStructure); }//===获取按键返回码===// uint8_t Key_GetNum(void) {uint8_t KeyNum = 0;if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_14) == 0){Delay_ms(20);//消抖while(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_14) == 0);//如果不松手则卡着Delay_ms(20);KeyNum = 1;} if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_11) == 0){Delay_ms(20);//消抖while(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_11) == 0);Delay_ms(20);KeyNum = 2;}return KeyNum; }
7.2 光敏传感器控制蜂鸣器
main.c
#include "stm32f10x.h" // Device header #include "Delay.h" #include "Buzzer.h" #include "LightSensor.h"int main(void) {Buzzer_Init();//蜂鸣器初始化LightSensor_Init();//光敏传感器初始化while (1){if(LightSensor_Get() == 1){ Buzzer_ON();}else{Buzzer_OFF();}} }Buzzer.c
#include "stm32f10x.h" // Device header//===蜂鸣器初始化===// void Buzzer_Init(void) {RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOB,&GPIO_InitStructure);GPIO_SetBits(GPIOB,GPIO_Pin_12);//初始化高电平 }void Buzzer_ON(void) {GPIO_ResetBits(GPIOB,GPIO_Pin_12); }void Buzzer_OFF(void) {GPIO_SetBits(GPIOB,GPIO_Pin_12); }void Buzzer_Turn(void) {if(GPIO_ReadOutputDataBit(GPIOB,GPIO_Pin_12) == 0) //读取蜂鸣器输出的高低电平,控制翻转{GPIO_SetBits(GPIOB,GPIO_Pin_12);}else{GPIO_ResetBits(GPIOB,GPIO_Pin_12);} }LightSensor.c
#include "stm32f10x.h" // Device header//===光敏传感器初始化===// void LightSensor_Init(void) {RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;//上拉输入GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOB,&GPIO_InitStructure); }//===获取返回码===// uint8_t LightSensor_Get(void) {return GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_13); }
八、总结
GPIO使用方法:
①初始化时钟
②定义结构体,赋值结构体
③使用GPIO_Init()函数初始化GPIO
相关文章:
STM32-GPIO
一、GPIO简介 GPIO(General Purpose Input Output)通用输入输出口 可配置8种输入输出模式 引脚电平:0V~3.3V,部分引脚可容忍5V 输出模式下:可控制端口输出高低电平,用以驱动LED、控制蜂鸣器、模拟通信协议输…...
MySQL的事务
<!DOCTYPE html> <html> <head> <meta charset"UTF-8" /> <title>MySQL的事务</title> </head> <body> <!-- 事务是一组操作的集合,它是一个不可分隔的工作单位,事务会把所有的操作作…...
go-carbon v2.2.14 发布,轻量级、语义化、对开发者友好的 Golang 时间处理库
carbon 是一个轻量级、语义化、对开发者友好的 golang 时间处理库,支持链式调用。 目前已被 awesome-go 收录,如果您觉得不错,请给个 star 吧 github.com/golang-module/carbon gitee.com/golang-module/carbon 安装使用 Golang 版本大于…...
解决 IIS HTTP 403 错误问题
最近上传附件 IIS 总是返回 HTTP 403 错误,在踩了很多配置的坑之后,终于把问题解决了,于是特意写了本篇文章。 虽然网络上的文章不少,大都写的没错,但是他们没有很清晰的把问题描述清楚,导致一些新手在看这些文章跟着处理问题的时候难免会踩坑,于是我就以我踩坑的经验写…...
字符设备驱动基础—并发控制
一、上下文和并发场合 执行流:有开始有结束总体顺序执行的一段代码 又称上下文 应用编程:任务上下文 内核编程: 任务上下文:五状态 可阻塞 a. 应用进程或线程运行在用户空间 b. 应用进程或线程运行在内核空间(通过调…...
5-Tornado入门、程序的原理图、tornado不能使用同步代码的演示
安装 pip install tornado第一个程序 from tornado import web from tornado import ioloop class IndexHandler(web.RequestHandler):def get(self):self.write(Hello Tornado!!123)if __name__ __main__:# 1.创建了app对象,设置路由,并开启debug模式app web.A…...
mysql原理--InnoDB记录结构
1.InnoDB行格式 我们平时是以记录为单位来向表中插入数据的,这些记录在磁盘上的存放方式也被称为 行格式 或者 记录格式 。 设计 InnoDB 存储引擎的大叔们到现在为止设计了4种不同类型的 行格式 ,分别是 Compact 、 Redundant 、Dynamic 和 Compressed 行…...
ES6基础语法
目录 一、解构 数组解构 对象解构 字符串解构 数值解构 布尔值解构 二、箭头函数 和普通函数区别? 三、拓展运算符 ... 一、解构 给右侧值匹配对应的变量 等号两侧模式一定要匹配 数组解构 /*** 解构:从数组或者对象中提取值,给变量进行赋值操作就…...
java8 常用code
文章目录 前言一、lambda1. 排序1.1 按照对象属性排序:1.2 字符串List排序:1.3 数据库排序jpa 2. 聚合2.1 基本聚合(返回对象list)2.2 多字段组合聚合(直接返回对象list数量) 二、基础语法2.1 List2.1.1 数…...
docker 镜像管理
搜索镜像:这种方法只能用于官方镜像库搜索基于 centos 操作系统的镜像# docker search centos 按星级搜索镜像: 查找 star 数至少为 100 的镜像,默认不加 s 选项找出所有相关 ubuntu 镜像: # docker search ubun…...
Jira 中如何修改时间为绝对时间
问题描述 在使用Jira的时候,有一些时间显示的是相对时间,如:2天前,3个小时前等,有些用户不习惯这样的显示方式,希望使用绝对的时间格式,如:2022年2月22日 22:22 应该怎样修改 解…...
班级查分软件制作教程:老师必备技能!
首先,你需要选择一个合适的软件平台来制作班级查分软件。推荐使用群发成绩,因为它是一个功能强大且易于使用的在线查询系统,可以帮助你快速高效地制作班级查分软件。 在制作班级查分软件之前,你需要准备好学生的成绩数据。这可以…...
Linux 的性能调优的思路
Linux操作系统是一个开源产品,也是一个开源软件的实践和应用平台,在这个平台下有无数的开源软件支撑,我们常见的apache、tomcat、mysql等。 开源软件的最大理念是自由、开放,那么Linux作为一个开源平台,最终要实现的是…...
如何通过webdriver禁用浏览器定位功能
今天碰到一个小问题,在使用了代理ip的情况下访问某些站点,但是还是显示本地的ip地址,这个是什么问题呢,原来是谷歌浏览器默认打开了定位功能 那么问题来了,如何在使用webdriver的时候关闭浏览器的定位功能呢࿱…...
网卡bonding绑定
目录 一、概念 1、概述: 二、实验 1、绑定案例: 一、概念 1、概述: 将多个物理网卡进行排列组合,形成逻辑网卡,网卡的高可用 绑定模式 mode0(平衡负载模式):平时两块网卡均工…...
flink运行报Exception in thread “main“ java.lang.IllegalStateException
问题描述 运行flink程序时报异常,异常信息如下: Exception in thread "main" java.lang.IllegalStateException: No ExecutorFactory found to execute the application.at org.apache.flink.core.execution.DefaultExecutorServiceLoader.g…...
易点易动设备管理系统--提升设备备品备件管理效率的工具
设备备品备件管理是市场推广人员关注的重要问题之一。为了帮助市场推广人员提升设备备品备件管理效率,易点易动设备管理系统应运而生。本文将详细介绍易点易动设备管理系统的功能和优势,以及如何借助该系统提高设备备品备件管理效率,提升企业…...
第二十一章——网络通信
一.网络程序设计基础 1.局域网与互联网 2.网络协议 1.IP协议 IP是Internet Protocol的简称,是一种网络协议。 1.1 TCP/IP层次结构 2.TCP与UDP协议 TCP可保证数据从一端送至另一端时,能够确实送达,而且抵达的数据的排列顺序和送出时的顺序相…...
Siemens-NXUG二次开发-打开与关闭prt文件[Python UF][20231206]
Siemens-NXUG二次开发-打开与关闭prt文件[Python UF][20231206] 1.python uf函数1.1 NXOpen.UF.Part.Open1.2 NXOpen.UF.Part.LoadStatus1.3 NXOpen.UF.Part.Close1.4 NXOpen.UF.Part.AskUnits 2.示例代码3.运行结果3.1 内部模式3.2 外部模式 1.python uf函数 1.1 NXOpen.UF.P…...
2015年五一杯数学建模C题生态文明建设评价问题解题全过程文档及程序
2015年五一杯数学建模 C题 生态文明建设评价问题 原题再现 随着我国经济的迅速发展,生态文明越来越重要,生态文明建设被提到了一个前所未有的高度。党的十八大报告明确提出要大力推进生态文明建设,报告指出“建设生态文明,是关系…...
synchronized 学习
学习源: https://www.bilibili.com/video/BV1aJ411V763?spm_id_from333.788.videopod.episodes&vd_source32e1c41a9370911ab06d12fbc36c4ebc 1.应用场景 不超卖,也要考虑性能问题(场景) 2.常见面试问题: sync出…...
微信小程序之bind和catch
这两个呢,都是绑定事件用的,具体使用有些小区别。 官方文档: 事件冒泡处理不同 bind:绑定的事件会向上冒泡,即触发当前组件的事件后,还会继续触发父组件的相同事件。例如,有一个子视图绑定了b…...
树莓派超全系列教程文档--(62)使用rpicam-app通过网络流式传输视频
使用rpicam-app通过网络流式传输视频 使用 rpicam-app 通过网络流式传输视频UDPTCPRTSPlibavGStreamerRTPlibcamerasrc GStreamer 元素 文章来源: http://raspberry.dns8844.cn/documentation 原文网址 使用 rpicam-app 通过网络流式传输视频 本节介绍来自 rpica…...
C++:std::is_convertible
C++标志库中提供is_convertible,可以测试一种类型是否可以转换为另一只类型: template <class From, class To> struct is_convertible; 使用举例: #include <iostream> #include <string>using namespace std;struct A { }; struct B : A { };int main…...
日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする
日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする 1、前言(1)情况说明(2)工程师的信仰2、知识点(1) にする1,接续:名词+にする2,接续:疑问词+にする3,(A)は(B)にする。(2)復習:(1)复习句子(2)ために & ように(3)そう(4)にする3、…...
《Playwright:微软的自动化测试工具详解》
Playwright 简介:声明内容来自网络,将内容拼接整理出来的文档 Playwright 是微软开发的自动化测试工具,支持 Chrome、Firefox、Safari 等主流浏览器,提供多语言 API(Python、JavaScript、Java、.NET)。它的特点包括&a…...
五年级数学知识边界总结思考-下册
目录 一、背景二、过程1.观察物体小学五年级下册“观察物体”知识点详解:由来、作用与意义**一、知识点核心内容****二、知识点的由来:从生活实践到数学抽象****三、知识的作用:解决实际问题的工具****四、学习的意义:培养核心素养…...
反射获取方法和属性
Java反射获取方法 在Java中,反射(Reflection)是一种强大的机制,允许程序在运行时访问和操作类的内部属性和方法。通过反射,可以动态地创建对象、调用方法、改变属性值,这在很多Java框架中如Spring和Hiberna…...
04-初识css
一、css样式引入 1.1.内部样式 <div style"width: 100px;"></div>1.2.外部样式 1.2.1.外部样式1 <style>.aa {width: 100px;} </style> <div class"aa"></div>1.2.2.外部样式2 <!-- rel内表面引入的是style样…...
【HarmonyOS 5 开发速记】如何获取用户信息(头像/昵称/手机号)
1.获取 authorizationCode: 2.利用 authorizationCode 获取 accessToken:文档中心 3.获取手机:文档中心 4.获取昵称头像:文档中心 首先创建 request 若要获取手机号,scope必填 phone,permissions 必填 …...

