STM32——关于GPIO讲解及标准库应用(基础篇)

news2024/9/29 3:27:59

简介:       

 STM32是一系列基于ARM Cortex-M内核的32位微控制器。该系列微控制器广泛应用于计算机、通讯、工业自动化、消费电子、汽车电子、医疗仪器及家庭电器等领域。该系列控制器具有高性能、低功耗、智能化等特点。其中,GPIO就是STM32控制器中的一种重要的通用输入输出口。

        GPIO全称为“General Purpose Input and Output”,即通用输入输出口。它是STM32控制器中的一种数字输入输出接口,具有广泛的应用。GPIO通常是微控制器与外围电路之间的主要通信接口。它可以通过控制逻辑电平来实现输入、输出、控制等功能。在STM32控制器中,GPIO口通常是通过引脚配置和寄存器编程进行控制的。


STM32控制器中的GPIO口具有以下特征:

  • 可编程性强:GPIO口的功能由配置它们的寄存器所决定。可以通过编程改变其工作模式(输入、输出、模拟等),其共有八种输入输出模式,分别为以下八种:

   

                输出模式下可控制端口输出高低电平,用以驱动外部模块,如LED、蜂鸣器、模拟通信协议输出时序等。只要是可以使用高低电平对其进行控制的,都可以使用GPIO引脚完成,如果控制功率较大的设别,如电机等,则需要加入驱动电路。

                输入模式下可读取端口的高低电平或电压,用于读取按键输入、ADC电压采集、模拟通信协议接收数据等。

  • 电压适应性强:STM32控制器的GPIO输入和输出口具有较宽的电压适应范围(0~3.3V),可以适应3.3V或5V的外围电路。
  • 可配置性高:GPIO口可以进行复用,多个GPIO口可以通过引脚复用功能共享同一个管脚,从而实现更多的接口和功能。
  • 高速性能:GPIO口的传输速度可以达到几百MHz,可以满足最高性能要求。

结构:

首先,我们对这张图进行分析,APB2为总线(总线以后在讲,这里只需要知道GPIO由总线控制),控制GPIOA和GPIOB以及其他部分,如何区分GPIOA和GPIOB及其他部分,这里可以看我们的数据手册,如下面的一张图,:

可以看到上面有PA0,PB1,PC1等等,这里的PA0引脚就归属于 GPIOA,PB1引脚就归属于 GPIOB。每个GPIO外设,总共有16个引脚,编号为0到15,当GPIO的第0号引脚,一般将其成为PA0,接着就是PA1。。。。。等等

在STM32控制器中,GPIO模块内包含寄存器和驱动器,分别是:

  1. 寄存器:GPIO模块内部有多个寄存器,用于控制GPIO口的工作模式、电平状态、中断控制等。常见的GPIO寄存器包括GPIOx_MODER、GPIOx_ODR、GPIOx_IDR、GPIOx_BSRR等。这些寄存器可以通过编程来进行配置和控制。

  2. 驱动器:GPIO模块内部的驱动器用于控制GPIO口的电平状态。在STM32控制器中,GPIO口可以输出高电平、低电平或者高阻态,驱动器可以根据寄存器的配置来控制GPIO口的电平状态。常见的GPIO驱动器包括CMOS、TTL等。

STM32是32位的单片机,故STM32内部的寄存器都是32位的,由于端口只有16位,所以寄存器只有低16位对应的有端口,高16位无用。

寄存器和驱动器是GPIO模块内部的两个重要组成部分,它们共同实现了GPIO口的各种功能。通过对GPIO寄存器的配置,可以实现GPIO口的输入、输出、中断控制等操作;通过GPIO驱动器的控制,可以实现GPIO口的电平状态控制。


 代码介绍:

1、对ST单片机的整个IO进行复位操作
void GPIO_DeInit(GPIO_TypeDef* GPIOx);

2、根据 GPIO_InitStruct 中指定的参数初始化外设 GPIOx 寄存器
void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct);

3、把 GPIO_InitStruct 中的每一个参数按缺省值填
void GPIO_StructInit(GPIO_InitTypeDef* GPIO_InitStruct);

4、读取指定端口管脚的输入
uint8_t GPIO_ReadInputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);

5、读取指定端口管脚的输出
uint8_t GPIO_ReadOutputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);

6、拉高引脚输出电平
void GPIO_SetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);

7、拉低引脚输出电平
void GPIO_ResetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);

8、对 IO进行写操作,仅可以自定义设置写0或写1,都0或都1
void GPIO_WriteBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, BitAction BitVal);

9、对整个IO端口进行写操作,0xFFFF 对应 0-15 PIN全部置为1;0x0000全部置为0
void GPIO_Write(GPIO_TypeDef* GPIOx, uint16_t PortVal);

10、当引脚具有复用功能时,可进行设置
void GPIO_PinLockConfig(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);

演示代码效果: 

1、LED.C

#include "stm32f10x.h"                  // Device header
#include "Delay.h"

void LED_Init(void)
{
	
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);	//开启APB2外设时钟
	
	GPIO_DeInit(GPIOC);	//对整个GPIOC引脚进行复位操作
	GPIO_InitTypeDef GPIO_InitStructure;	//声明结构体GPIO_InitStructure
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;	
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;		//推挽输出
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOC,&GPIO_InitStructure);

}
 

void LED(void)
{
	GPIO_WriteBit(GPIOB,GPIO_Pin_7,(BitAction)0);	//BitAction为强制类型转换符
	Delay_ms(500);
	GPIO_WriteBit(GPIOB,GPIO_Pin_7,Bit_SET);
	Delay_ms(500);
}

void PC13_ON(void)
{
		GPIO_ResetBits(GPIOC,GPIO_Pin_13);		//低电平点亮PC13LED灯
		Delay_ms(500);
}

void PC13_OFF(void)
{
		GPIO_SetBits(GPIOC,GPIO_Pin_13);		//高电平点亮PC13LED灯
		Delay_ms(500);
}

uint8_t LED_GetNum(void)
{
	return GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_13 ); //读取PC13号端口的输入值
}
2、LED.h


#ifndef __LED_H
#define __LED_H

void LED_Init(void);
void PC13_ON(void);
void PC13_OFF(void);
uint8_t LED_GetNum(void);
void LED(void);

#endif

 

3、main.c


#include "stm32f10x.h"                  // Device header
#include "LED.h"
#include "Delay.h"

uint8_t LEDNum;
int main(void)
{
	LED_Init();
	
	while(1)
	{
		/*低电平点亮PC13的LED灯。
		初始时,引脚为任意电平,当引脚为低电平时
		熄灭LED灯,熄灭LED时的电平为高电平,所以引脚也被设置为高电平了
		当引脚为高电平时,点亮LED灯,点亮LED时的电平为低电平,所以这样就可以循环往复。
		*/
			if(LED_GetNum() == 1)			//如果引脚为高电平,则点亮LED灯,输入值和输出值在这里对于程序没有影响,只需要得到引脚的电平值。
				{
					PC13_ON();
					Delay_ms(500);
					GPIO_WriteBit(GPIOC,GPIO_Pin_13,(BitAction)0);
				}
			else
				{
					PC13_OFF();
					Delay_ms(2000);
					GPIO_WriteBit(GPIOC,GPIO_Pin_13,(BitAction)1);
				}
				
		}
	}



//测试结果,LED灯交替闪烁

在STM32控制器中,GPIO口的应用非常广泛。比如,可以使用GPIO口来控制LED灯灯光的亮灭、控制继电器的闭合、读取传感器的数据等。同时,GPIO口也可以广泛应用于通信领域,如SPI、I2C、USART等串行通信控制等。其中,GPIO口的引脚复用功能可以实现多重功能,如CAN总线、PWM输出等特殊功能。

综上所述,GPIO是STM32控制器中的一个重要设备,这种通用输入输出口具有可编程性强、电压适应性好、可配置性高、高速性能等特点,在系统设计中具有广泛的应用。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/570869.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Stack 栈的实现与应用

目录 1. 概念 2. 常用的栈的方法 2.1 方法 2.2 代码 3. 自己实现栈 3.1 构造MyStack 3.2 push() 3.3 ensureCapacity() 3.4 pop() 3.5 peek() 3.6 empty() 3.7 szie() 4. 栈的应用 1. 概念 栈(Stack)是一种数据结构&…

02_stack栈

1. Stack 栈是什么? 栈也叫栈内存,主管Java程序的运行,是在线程创建时创建,它的生命期是跟随线程的生命期,线程结束栈内存也就释放,对于栈来说不存在垃圾回收问题,只要线程一结束该栈就Over&…

LabVIEWCompactRIO 开发指南37 在第三方模拟器中执行

LabVIEWCompactRIO 开发指南37 在第三方模拟器中执行 如果需要验证时序和功能,在将LabVIEW FPGA VI编译到硬件之前,可以与三款第三方仿真器进行交互:MentorGraphicsModelSim(LabVIEW2013及更早版本)、MentorGraphics…

【MySQL】MySQL主从同步延迟原因与解决方案

文章目录 一、MySQL数据库主从同步延迟产生的原因二、关于DDL和DML三、主从延时排查方法四、解决方案3.1 解决从库复制延迟的问题:3.2 MySql数据库从库同步其他问题及解决方案 一、MySQL数据库主从同步延迟产生的原因 MySQL的主从复制都是单线程的操作,…

JS CSS 关于 Shadow dom 的用法

一、什么是 Shadow DOM 你是否好奇过,浏览器自带的元素的样式是如何实现的,例如 video、input ,又或者在某些网站中看到一些非浏览器自带且没见过的元素? 如果你打开 F12 查看定位该元素的信息,你会发现啥都没看到&am…

Spring Cloud Alibaba 完整使用及与各中间件集成

目录 前言 官方中文文档 使用版本 spring 中间件 使用到的组件与功能 环境安装 虚拟机 nexus nacos 集成过程 工程搭建 父工程搭建 子工程 服务集成 nacos 配置文件: 服务注册与发现-discovery 服务注册 启动 服务发现 测试 配置管理-config…

网络安全是一个好专业吗?

前言 网络安全作为一个专业领域,在当今数字时代正变得越发重要和关键。无论是企业还是个人,面对着越来越频繁的网络威胁和攻击,网络安全领域的专业人员扮演着至关重要的角色。那么,从一个资深网安工程师的角度来看,网…

nest context.switchToHttp().getRequest() 获取不到user

把你该死的Public注释掉,这玩意开了后不走JWT验证token,所以拿不到那该死的user。

pdf怎么合并在一起?软件操作更高效

PDF格式已经成为了许多文档和表格的首选格式。然而,当你需要合并多个PDF文件时,可能会遇到一些麻烦,在本篇文章中,我们将向您介绍一种简单易用的方法来合并PDF文件。 以下是可以用来合并PDF文件的软件: - PDF转换器&a…

当你在浏览器中输入 URL 时会发生什么?

下面的图解说明了步骤。 1.Bob 在浏览器中输入 URL 并按下 Enter。在这个例子中,URL 由 4 部分组成: 🔹 协议 - http://. 这告诉浏览器使用 HTTP 发送连接到服务器。 🔹 域名 - example.com. 这是站点的域名。 🔹 路径…

C++STL— priority_queue的使用与模拟实现

priority_queue的使用 priority_queue的介绍 优先级队列默认使用vector作为其底层存储数据的容器,在vector上又使用了堆算法将vector中的元素构造成堆的结构,因此priority_queue就是堆,所有需要用到堆的位置,都可以考虑使用prio…

极米十年巅峰之作极米Z7X,能带走的百吋大屏

近年来,随着人们娱乐消费的升级,家用投影仪消费市场不断扩大,增长速度也非常可观。据IDC最新发布的数据显示,2022年中国投影机市场总出货量505万台,同比增长7.4%。其中,智能投影机市场(搭载有OS…

ChatGPT:免费可用 ChatGPT 网页版(免登录、免注册、不限制使用次数)

一、什么是chatgpt ChatGPT是一种基于GPT-3(Generative Pre-trained Transformer 3)的聊天机器人。GPT-3是由OpenAI公司开发的自然语言处理模型,具有非常强的语言理解和生成能力。 ChatGPT使用了GPT-3的预训练模型,在此基础上进行了微调和优化&#xf…

机器学习:基于Apriori算法对中医病症辩证关联规则分析

系列文章目录 作者:i阿极 作者简介:Python领域新星作者、多项比赛获奖者:博主个人首页 😊😊😊如果觉得文章不错或能帮助到你学习,可以点赞👍收藏📁评论📒关注…

【Linux】进程间通信的有关基础概念

在以前我们使用多进程时,我们一般都是让父子进程分别执行各自的代码,进程之间几乎没有通信,但是实际过程中,进程间的通信是十分重要的的一件事情,一个复杂的程序一般都是有多个进程相互通信,协调进行来完成…

重磅发布 |《2023年消费品企业数字化转型调研白皮书》

数字经济时代,数字化转型对于消费品企业越来越重要,已成为消费品企业增加经济效益、提升竞争力的重要策略之一。随着数字化转型进入深水区,越来越多涉及到商业模式、业务模式和产业链生态的创新变革开始出现,给消费品企业带来了一…

【UE】windows包蓝图分辨率设置

【UE】windows包蓝图分辨率设置 屏幕模式(SetFullscreenMode) 模式说明全屏可以任意修改分辨率的全屏窗口化全屏适配显示器分辨率的全屏窗口化窗口化 分辨率修改方法(SetScreenResolution) 控制台修改分辨率方法(ExecuteConsoleCommand) 命令 &#xf…

股票量化分析工具QTYX使用攻略——挖掘主升浪中的人气个股(更新2.6.5)

搭建自己的量化系统 如果要长期在市场中立于不败之地!必须要形成一套自己的交易系统。 行情不等人!边学习边实战,在实战中学习才是最有效地方式。于是我们分享一个即可以用于学习,也可以用于实战炒股分析的量化系统——QTYX。 QTY…

如何有效运用测评自养号来提升阿里国际店铺权重

在阿里国际平台上提升销售并非易事,但是借助强大的营销策略和有效的自养号技术,你可以大幅度提升你的店铺销量。以下是一些具体的步骤和技巧。 1. 数据分析和市场调研 首先,要了解你的目标客户群体和市场趋势。分析你的销售数据&#xff0c…

chatgpt赋能python:Python编程教程:使用Python生成0到100的列表

Python编程教程:使用Python生成0到100的列表 Python是一种流行的编程语言,因其简单易学、强大而受到广泛欢迎。本文将介绍如何使用Python编程语言来生成0到100的数字列表。 什么是Python? Python是一种高级编程语言,由Guido van Rossum 在…