当前位置: 首页 > news >正文

STM32——GPIO(点亮LEDLED闪烁)

一、什么是GPIO?

GPIO(通用输入输出接口):

1.GPIO 功能概述
 

 GPIO 是通用输入/输出(General Purpose I/O)的简称,既能当输入口使用,又能当输出口使用。端口,就是元器件上的一个引脚,可以通过软件去控制。

在大多数的时候,我们将IO口可以看为一个电子开关,通过向IO寄存器中写入相应的值,其输出的电平就随着寄存器的变化而变化,这是IO口的输出,在大多数的单片机中,需要去配置单片机的IO模式,是输入还是输出。

即需要预先初始化,配置GPIO的参数,再去使用GPIO。在51单片机中不支持这样的操作,即不能配置GPIO的参数,但在32我们就必须去配置GPIO从而完成某种功能。

输出功能 :继电器、 LED、蜂鸣器等的控制
输入功能 :传感器状态、高低电平等信息的读取
复用功能 :片内外设的对外接口
时序模拟 :模拟 SPI、I2C 和 UART 等常用接口的时序

2.端口和引脚


(1)端口(PORT): 独立的外设子模块,包括多个引脚,通过多个硬件寄存器控制引脚。
GPIO 模块由端口 GPIOA、GPIOB、GPIOC 等多个独立的子模块构成。

例如:端口 GPIOA 包括 PA0 ~ PA15 这 16 个引脚,通过 10 个硬件寄存器控制引脚工作。

(2)引脚(PIN): 对应微控制器的一个管脚,归属于端口,由端口寄存器的对应位控制。
PA0,属于端口 GPIOA,输出电平由端口 GPIOA 的输出数据寄存器 GPIOA_ODR 的第 0 位决定。

3.GPIO电路

  1. 注: VDD_FT 5V容忍I/O脚是特殊的,它与VDD不同

4.GPIO的8种工作模式

  1. 输入浮空:输入用,完全浮空,IO状态不定,由外部环境决定
  2. 输入上拉:输入用 ,内部下拉,IO默认是高电平
  3. 输入下拉:空闲时,IO默认是低电平
  4. 模拟功能:专门用于模拟信号的输入输出,如ADC/DAC
  5. 开漏输出:不能输出高电平,必须由外部或内部上拉电阻才能输出高电平,如软件IIC的SDL、SCL等
  6. 推挽输出:高低电平的驱动能力强,25ma 通用输出
  7. 开漏式复用功能: 可输出高低电平,片上外设功能(硬件IIC的SDL、SCL等)
  8. 推挽式复用功能:可输出高低电平,驱动力强,由其他外设控制输出

二、GPIO配置步骤

1、点亮LED代码演示

#include "stm32f10x.h"                  // Device headerint main(void)
{RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE); //使能时钟GPIO_InitTypeDef GPIO_InitStruct;GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0;GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init (GPIOA ,&GPIO_InitStruct);GPIO_ResetBits(GPIOA ,GPIO_Pin_0);while(1){}
}

可以看到,实物图中LED灯一端接的+极,另一端接的A0,因此想要LED点亮,就需要给A0低电平,用GPIO_ResetBits(GPIOA ,GPIO_Pin_0)函数就能实现,相反如果LED灯一端接的负极,那么此时A0就应该给予高电平才会亮,也就是使用GPIO_SetBits(GPIOA ,GPIO_Pin_0)函数;同样,如果使用GPIO_WriteBit(GPIOA ,GPIO_Pin_0,Bit_RESET)函数也可以将LED点亮,与前面两个函数区别的是这个函数多了一个参数,而就是这个参数决定了赋予高电平函数低电平。

但要注意:以上均是在GPIO推挽输出的模式下进行的,如果模式不同,高电平与低电平的驱动力不同,此时如果把GPIO换成开漏输出模式,此时只有低电平才具有驱动能力,那就意味着如果想要点灯,那么LED一端只能接+极,A0口给低电平才能够点亮LED,反正如果一段给低电平,A0口给高电平是不会点亮的,因为高电平是没有驱动能力的,无法驱动LED点亮

以上就是这三个函数的用法。

2、GPIO配置步骤

(1)使能时钟(使用RCC开启GPIO的时钟)

以上三个是最为常用的外设时钟控制

RCC AHB外设时钟控制
RCC APB2外设时钟控制
RCC APB1外设时钟控制

在点灯代码中我们使用的是 :RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE)

右键点击就可以跳转到rcc.c文件里面的函数定义

第一个参数就是选择哪个外设(蓝笔),第二个参数就是使能或失能(红笔)

(2)使用GPIO_Init函数初始化GPIO

GPIO_Init (GPIOA ,&GPIO_InitStruct)

这个函数的作用是通过结构体的参数(GPIO_InitStruct)来定义GPIO口(GPIOA);

所以接下来我们需要定义一个结构体变量,然后给结构体赋值,最后调用这个函数,也就是代码里面的:GPIO_InitTypeDef GPIO_InitStruct;其中GPIO_InsStruct为结构体变量的名字。

学过C语言的都知道,这里定义了一个结构体,它的子成员为GPIO_Pin、GPIO_Speed、GPIO_Mode,这个结构体的名字为GPIO_InitTypeDef

上图中这四个为GPIO的读取函数,紧接着的下面的四个为GPIO的写入函数;通过这8个函数就可以实现对GPIO口的读写。GPIO_ResetBits(GPIOA ,GPIO_Pin_0);这里就是对IO口进行赋予低电平,前面实物图下方也有介绍过。

然后我们要复制结构体的名字通过点(.)把它的子成员引出,也就是

GPIO_InitStruct.GPIO_Mode 

 GPIO_InitStruct.GPIO_Pin 
 GPIO_InitStruct.GPIO_Speed 

然后进行赋值:GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;
    GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0;
    GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;

怎么样进行赋值呢?还是老样子先跳转到函数定义处:

然后

进行模式选择;其他的速度以及引脚也是同理进行操作选择复制即可。 

三、LED闪烁

有了前面的基础,学习过51的都知道,只需要加上一个延时函数即可完成LED闪烁:

#include "stm32f10x.h"                  // Device header
#include "Delay.h"int main(void)
{RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);GPIO_InitTypeDef GPIO_InitStruct;GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0;GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init (GPIOA ,&GPIO_InitStruct);while(1){GPIO_WriteBit(GPIOA ,GPIO_Pin_0,Bit_RESET);Delay_ms(500);GPIO_WriteBit(GPIOA ,GPIO_Pin_0,Bit_SET);Delay_ms(500);}
}
http://www.lryc.cn/news/409251.html

相关文章:

  • VulnHub靶机入门篇--kioptrix.level 3
  • aiGPT系统源码★重大升级★AI写作/AI绘画/AI音乐/AI视频
  • Vue Router高级用法:动态路由与导航守卫
  • 江科大/江协科技 STM32学习笔记P9-11
  • 【培训通知】成为Power BI数据分析可视化实战第一人,加入3天直播即可
  • 24暑假算法刷题 | Day22 | LeetCode 77. 组合,216. 组合总和 III,17. 电话号码的字母组合
  • 一篇文章告诉你对讲机为什么不能被手机取代的7个原因
  • LION论文阅读
  • 在Android上实现汉字笔顺动画效果——HanZiWriter
  • 黑马头条vue2.0项目实战(一)——项目初始化
  • Unity Shader动画:用代码绘制动态视觉效果
  • 智税集成2.0生成凭证
  • B4005 [GESP202406 四级] 黑白方块 【暴力枚举】【前缀和】
  • 深度学习趋同性的量化探索:以多模态学习与联合嵌入为例
  • 决策树与随机森林:比较与应用场景分析
  • C#用Aspose.Cells导出Excel,.NET导出Excel
  • 天猫番茄品类TOP1,复购率超40%,「一颗大」如何策划极致产品力?
  • Docker搭建私有仓库harbor(docker 镜像仓库搭建)
  • 面试题:MySQL 索引
  • 云计算day13
  • 2024年孝感中级职称报名开始了吗?
  • RAG技术之Router
  • linux系统通过修改sudo文件使普通用户拥有类似root用户权限
  • 基于PyCharm在Windows系统上远程连接Linux服务器中Docker容器进行Python项目开发与部署
  • TypeScript学习篇-类型介绍使用、ts相关面试题
  • 超详细!Jmeter性能测试
  • C语言经典习题24
  • SQL labs-SQL注入(三,sqlmap使用)
  • 统一认证与单点登录:简明概述与应用
  • MSPM0G3507学习笔记1:开发环境_引脚认识与点灯