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题 生态文明建设评价问题 原题再现 随着我国经济的迅速发展,生态文明越来越重要,生态文明建设被提到了一个前所未有的高度。党的十八大报告明确提出要大力推进生态文明建设,报告指出“建设生态文明,是关系…...
htop:Linux系统进程监控与性能分析利器
1. 项目概述:为什么我们需要一个比top更好的工具?如果你在Linux或类Unix系统上做过运维、开发,或者仅仅是好奇过自己的服务器或电脑到底在“忙”些什么,那么top命令几乎是你绕不开的第一个工具。它像系统资源的一个实时仪表盘&…...
李辉《曾国藩日记》笔记:人到晚年,最重保全!
李辉《曾国藩日记》笔记:人到晚年,最重保全!原文:同治三年五月二十日早饭后清理文件。见客,坐见者二次,立见者一次。程希辕来,围棋二局,又观程与鲁秋航一局。习字一纸。巳刻见客二次…...
数据投资回报率金字塔:衡量和最大化数据团队价值的方法
原文:towardsdatascience.com/the-data-roi-pyramid-a-method-for-measuring-maximizing-your-data-team-cab470b98cf6?sourcecollection_archive---------4-----------------------#2024-02-02 难以清晰表达你数据团队的价值?了解如何使用数据投资回报…...
提示词架构设计:从字符串到组件化系统的工程实践
1. 项目概述:当提示词也需要“架构师”在AI应用开发,尤其是大语言模型(LLM)驱动的项目中,我们常常面临一个核心矛盾:一方面,我们希望提示词(Prompt)足够强大、灵活&#…...
别再只用setToolTip了!深入Qt事件体系,搞懂鼠标悬停提示的三种高阶玩法
深入Qt事件体系:鼠标悬停提示的三种高阶实现方案 在Qt应用开发中,鼠标悬停提示(ToolTip)是最常见的用户交互增强手段之一。大多数开发者止步于简单的setToolTip()API调用,却不知道Qt事件系统为这一功能提供了更强大、更…...
Docker化OpenClaw:容器环境下的智能数据抓取部署与实践
1. 项目概述:容器化部署的“OpenClaw”数据抓取利器最近在折腾一个数据采集项目,需要从一些结构复杂的网页里精准提取信息,传统的正则表达式和简单的爬虫库已经有点力不从心了。在社区里翻找解决方案时,我发现了ozbillwang/opencl…...
量子混合算法优化带容量约束的车辆路径问题
1. 量子混合算法求解带容量约束的车辆路径问题物流配送优化是供应链管理中的经典难题。想象一下,一家快递公司每天需要向城市各处投递包裹,每辆货车都有载重限制,如何规划路线才能使总运输距离最短?这就是带容量约束的车辆路径问题…...
别再只会按回车了!ChatGPT换行、分段、写代码的3种正确姿势(含移动端技巧)
ChatGPT高效输入指南:从换行技巧到结构化表达的艺术 在数字创作与AI交互的时代,每个按键背后都藏着提升效率的秘密。当大多数人还在用原始的单行输入与ChatGPT对话时,掌握格式化输入技巧的用户已经获得了截然不同的交互体验——他们的代码保持…...
彻底搞懂Git快照:Hash寻址、存储原理与常见误区解析
在使用Git进行版本控制时,很多开发者都会有一个核心困惑:一个短短40位的Hash值,怎么就能精准定位并还原整个项目的所有代码、文件目录甚至历史版本?Git的快照到底是增量存储还是全量存储?Hash值明明是“单向计算”的&a…...
本地搭建React Server Components:从原理到实践深度解析
1. 项目概述:当Server Components从概念走向你的本地环境如果你最近关注前端技术动态,一定对“Server Components”这个词不陌生。它被描述为React生态的一次范式转移,承诺带来更小的客户端包体积、更直接的数据库访问和更快的首屏渲染。但说…...

