#STM32 GPIO编程详解

2023-11-11

硬件环境:stm32f407zet6 软件环境:mdk5

1.GPIO概述

GPIO,翻译为通用输入输出,也就是软件可编程引脚,也就是MCU通过控制GPIO来完成一系列的功能。

GPIO属于引脚,但引脚还包含电源、晶振、下载、boot、复位等,这一部分组成的电路同时也叫做单片机最小系统

同一个GPIO可以作为多种外设功能的引脚,在芯片对应的数据手册中有比较详细的引脚功能说明

在STM32F407中,除了ADC引脚,其他引脚都是可以5V容忍
所谓5V容忍就是可以正常识别5V的逻辑电平信号而不至于因为逻辑电平电压高于自身的3.3V标准而损坏芯片

在STM32中,将GPIO分为多组,每组最多16个,每个GPIO都可以进行输出类型、模式、上下拉、输出速度的配置。

看图
在STM32中所有的GPIO操作均是围绕下图展开的。
在这里插入图片描述

  1. 输出类型
    输出类型可以分为推挽输出和开漏输出。

    推挽输出
    当输出一个低电平,首先经过反相器变成一个高电平,当为高电平时,NMOS管工作,IO口与地线短接,从而输出低电平,此时电源电流输出到负载,也叫灌电流,可以理解为推
    当输出一个高电平,首先经过反相器变成一个低电平,当为低电平时,PMOS管工作,IO口与VDD短接,从而输出高电平,此时负载电流流入到芯片,也叫拉电流,可以理解为挽
    推挽输出电流驱动能力是很大的,因为MOS管在工作的时候,其内阻非常小,因此VDD输入电流可近似等于IO口输出电流

    开漏输出
    开漏模式下,PMOS管不工作,只能输出低电平,同推完输出,输出高电平时IO口将呈现高组态的状态。

  2. 模式
    可以设置为输入、输出、复用、模拟四种工作模式
    输入模式下,TTL施密特触发器工作,本质就是将引脚上电压转换成开关量,当电压低于一个值判断为逻辑0,高于一个值判断为逻辑1.
    模拟模式分为输入和输出模式,分别工作在ADC采集和DAC输出的时候,配置为此模式时外设引脚直接连接到对应的模拟线路上
    输出电平可以通过设置数据寄存器来控制,也可以用过置位复位寄存器控制,后者的优势在于不用考虑当前寄存器的值

  3. 上下拉
    可以选择是否启用上下拉电阻,比如开漏模式下需要输出高电平,则需要外接上拉电阻来实现

  4. 输出速度
    可以设置为 2M、25M、50M、100M(30 pF 时为 100 MHz(高速)(15 pF 时为 80 MHz 输出(最大速度)))。
    100M输出速度是什么意思?
    对于CMOS工艺的集成电路而言,输入阻抗是非常高的,主要功耗来自于绝缘栅等效的电容充放电效应。既然是电容的充放电,考虑信号源的内阻(基于标准CMOS电路的输出),根据RC充电常数和逻辑门限电平就能得出一个最小周期,其对应一个最高IO频率。

2.GPIO寄存器分析

直接看数据手册不就好了嘛,干嘛要抄一遍,费时费力又没有什么意义

3.GPIO编程实例

以标准的LED控制程序为例

  1. 固件库
    GPIO_InitTypeDef GPIO_InitStructure;
    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF, ENABLE);						//开启GPIOF的时钟
    
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;								//设置为输出模式
    GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;								//设置为推挽输出
    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;								//设置为上拉模式
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;							//设置输出速度为100M
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9 | GPIO_Pin_10;
    GPIO_Init(GPIOF, &GPIO_InitStructure);	
    
  2. BB库
    //定义LED
    typedef enum
    {
    	LED1 = 0,
    	LED2
    } LEDx_t;
    
    //LED状态
    typedef enum
    {
    	LED_OFF = 0,
    	LED_ON
    } LED_Status_t;
    
    //LED引脚
    typedef enum
    {
    	LED1_PIN = BB_GPIO_PIN_9,
    	LED2_PIN = BB_GPIO_PIN_10
    } LED_Pin_t;
    
    //定义GPIO引脚
    typedef enum
    {
    	BB_GPIO_PIN_0 = 0,
    	BB_GPIO_PIN_1,
    	BB_GPIO_PIN_2,
    	BB_GPIO_PIN_3,
    	BB_GPIO_PIN_4,
    	BB_GPIO_PIN_5,
    	BB_GPIO_PIN_6,
    	BB_GPIO_PIN_7,
    	BB_GPIO_PIN_8,
    	BB_GPIO_PIN_9,
    	BB_GPIO_PIN_10,
    	BB_GPIO_PIN_11,
    	BB_GPIO_PIN_12,
    	BB_GPIO_PIN_13,
    	BB_GPIO_PIN_14,
    	BB_GPIO_PIN_15
    } BB_GPIO_Pin_t;
    
    BB_RCC_AHB1_PeriphClock_Enable(RCC_AHB1Periph_GPIOF);						//开启GPIOF的时钟
    
    BB_GPIO_Mode(GPIOF, (BB_GPIO_Pin_t)LED1_PIN, GPIO_Mode_OUT); 				//设置为输出模式
    BB_GPIO_OType(GPIOF, (BB_GPIO_Pin_t)LED1_PIN, GPIO_OType_PP);				//设置为推挽输出
    BB_GPIO_Speed(GPIOF, (BB_GPIO_Pin_t)LED1_PIN, GPIO_Speed_100MHz);			//设置输出速度为100M
    BB_GPIO_PuPd(GPIOF, (BB_GPIO_Pin_t)LED1_PIN, GPIO_PuPd_UP);					//设置为上拉模式
    
    BB_GPIO_Mode(GPIOF, (BB_GPIO_Pin_t)LED2_PIN, GPIO_Mode_OUT); 
    BB_GPIO_OType(GPIOF, (BB_GPIO_Pin_t)LED2_PIN, GPIO_OType_PP);
    BB_GPIO_Speed(GPIOF, (BB_GPIO_Pin_t)LED2_PIN, GPIO_Speed_100MHz);
    BB_GPIO_PuPd(GPIOF, (BB_GPIO_Pin_t)LED2_PIN, GPIO_PuPd_UP);
    
    BB_GPIO_SetBits(GPIOF, (BB_GPIO_Pin_t)LED1_PIN);							//默认熄灭LED
    BB_GPIO_SetBits(GPIOF, (BB_GPIO_Pin_t)LED2_PIN);
    
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

#STM32 GPIO编程详解 的相关文章

随机推荐

  • Unity 管理游戏的退出,重开

    游戏的退出和重开 退出和重开 建一个按钮 并在按钮上写一个脚本 同时在Inspector视图中 在右侧如图所示 退出 using System Collections using System Collections Generic usi
  • 强烈强烈安利3个Python数据分析EDA神器!

    EDA是数据分析必须的过程 用来查看变量统计特征 可以此为基础尝试做特征工程 东哥这次分享3个EDA神器 其实之前每一个都分享过 这次把这三个工具包汇总到一起来介绍 1 Pandas Profiling 这个属于三个中最轻便 简单的了 它可
  • idea开发常用必备插件推荐

    Easy Javadoc 可使用该插件 一键生成函数 变量等注释 提高效率 插件详情说明 https github com starcwang easy javadoc Json Parser 可以对 JSON 字符串进行格式化 Java
  • 零基础学完Python的7大就业方向,原来赚钱的路子这么多?

    我想学 Python 但是学完 Python 后都能干啥 现在学 Python 哪个方向最简单 哪个方向最吃香 相信不少 Python 的初学者 都会遇到上面的这些问题 大家都知道 Python 很吃香 薪资高 就业面广 但具体的 有哪些方
  • 关于springboot项目 maven打包报错:Unable to find a single main class from the following candidates

    ERROR Failed to execute goal org springframework boot spring boot maven plugin 2 0 3 RELEASE repackage default on projec
  • 19、计算机图形学——蒙特卡洛路径追踪

    一 蒙特卡洛积分 蒙特卡洛积分主要解决的问题是当被积函数很难被以函数的形式表示时 需要对该被积函数指定概率密度函数并进行多次采样 然后用采样得到的局部面积除以局部采样点的概率来近似得到整体的面积 积分 当采样次数足够多时 将这些整体近似值除
  • java:找不到符号 符号:方法 builder()

    在导入以前的 idea 项目运行 junit 测试方法的时候遇到这样一个问题 解决方法 第一步 如果依赖之前存在 在 pom xml 中重新导入一遍 lombox 依赖 并下载
  • mybatisPlus中postgreSql数组字段类型处理

    在实际开发中遇到postgresql中定义的数组字段 下面解决两个问题 如何定义数组字段的默认值为空格数组 以及如何再java实体类中直接使用数组对象接受数据或把数据存入数据库 1 在postgresql中定义数组对象及默认值 以字符串你数
  • Java线程中 suspend() 和 resume() 、wait() 和 notify()、park和unpark

    suspend 和 resume 方法 两个方法配套使用 suspend 使得线程进入阻塞状态 并且不会自动恢复 必须其对应的 resume 被调用 才能使得线程重新进入可执行状态 但suspend 方法阻塞时都不会释放占用的锁 很容易引起
  • PPPOE拨号过程

    索引 日 志 内 容 1 1738 发送PADR 2 1738 接收PADS Session ID 0x361D AC MAC 286ED421146A 3 1738 LCP tx Req MRU 05D4 Magic 0001A93C 4
  • 分别从资源管理,服务用户,进程交互,系统实现的角度分析操作系统的作用

    操作系统的主要作用 按老师来说这种题目要先答一下操作系统的定义 概念 操作系统的定义 操作系统是管理系统资源 控制程序执行 改善人机界面 提供各种服务 并合理组织计算机工作流程和为用户有效地使用计算机提供良好运行环境的一种系统软件 操作系统
  • nginx 健康检查配置

    nginx 配置 upstream test server 127 0 0 1 8001 max fails 2 fail timeout 30s server 127 0 0 1 8002 max fails 2 fail timeout
  • shell脚本之awk命令——分隔符介绍

    文章目录 awk入门 awk F awk命令之 分割符 awk命令之 分割符 awk入门 关于awk命令的基础用法 请参考Linux awk命令 awk F awk F F相当于内置变量FS 指定分割字符 fs是一个字符串或者是一个正则表达
  • 华为OD机试 C++ 优秀学员统计

    题目 任务 你的工作是帮我们找出打卡次数最多的前五名员工 有些小细节需要注意 如果两位员工打卡次数一样多 那么先打卡的员工排名更靠前 如果他们开始打卡的时间也一样 那就按照员工id的大小排序 id小的员工排在前面 输入 第一行是员工的数量N
  • Vue3 toRef

    toRef 可以用来为一个 reactive 对象的属性创建一个 ref 这个 ref 可以被传递并且能够保持响应性 作用 创建一个 ref 对象 其value值指向另一个对象中的某个属性 说明 在模板使用的时候 如果一个对象嵌套的太深 那
  • 利用OpenCV对视频进行拆帧处理

    文章目录 简介 输入输出 源代码 Python 简介 提供一种利用OpenCV对视频进行拆帧 并制作成图片集的方式 输入输出 输入 视频文件所在文件夹 输出 按视频文件命名的文件夹下保存图片 源代码 Python import cv2 im
  • C++中虚函数和非虚函数重载在继承时的区别

    这里唯一想说明的一点就是 使用虚函数继承时 当继承类被强转成基类后调用虚函数 调用的还是继承类的虚函数 而重载方式的继承类被强转成基类再调用重载函数 则调用的是基类的函数 废话不多说 上代码 cpp view plain copy incl
  • xss-labs/level11

    首先输入 丝毫不差 没有出现回弹现象 根本就不出人意料好吧 接着来看一下源代码好吧 能够看得出来第一个输出点由于htmlspecialchars转义操作 所以上述代码根本行不通 这一关比上一关又多了一个隐藏表单 一共是有四个隐藏表单 从第四
  • 【ARM】使用模板编写dht11温湿度linux驱动程序

    作者主页 凉开水白菜 作者简介 共同学习 互相监督 热于分享 多加讨论 一起进步 专栏资料 https gitee com stylle linux code 点赞 收藏 再看 养成习惯 订阅的粉丝可通过PC端文末加我微信 可对文章的内容进
  • #STM32 GPIO编程详解

    硬件环境 stm32f407zet6 软件环境 mdk5 1 GPIO概述 GPIO 翻译为通用输入输出 也就是软件可编程引脚 也就是MCU通过控制GPIO来完成一系列的功能 GPIO属于引脚 但引脚还包含电源 晶振 下载 boot 复位等