STM32 学习2 库函数控制GPIO输出

STM32 学习2 库函数控制GPIO输出

  • 一、GPIO寄存器介绍
    • 1. GPIO简介
    • 2. GPIO功能
      • (1)模式分类
      • (2)模式设置方法
        • MODE[1:0]:模式控制,用于配置端口引脚的模式:
        • CNF[1:0]:配置引脚输出速度:
        • PUPD[1:0]:上拉/下拉配置:
      • (3)**输入模式**:
      • (4)**输出模式**:
    • 3. GPIO的寄存器
      • (1)两个32位配置寄存器
      • (2)两个32位数据寄存器
      • (3)一个32位置位/复位寄存器:GPIOx_BSRR
      • (4)一个16位复位寄存器:GPIOx_BRR
      • (5)一个32位锁定寄存器:GPIOx_LCKR
    • 4. 时钟控制器
  • 二、GPIO配置
    • 1. 配置内容
    • 2. 配置结构体
      • (1)GPIO_Pin:
      • (2)Mode:
      • (3)Speed:
      • (4)OType:
      • (5)PuPd:
  • 三、GPIO使用步骤
  • 四、代码示例
    • 1. 跑马灯显示
    • 2. 显示数字

在这里插入图片描述

一、GPIO寄存器介绍

1. GPIO简介

GPIO是STM32微控制器上的一组引脚,可配置为输入或输出模式,用于与外部设备进行数字信号交换。每个GPIO引脚都有一个唯一的编号,通常称为引脚名称或引脚号码。

STM32系列微控制器通常具有多个GPIO引脚,数量取决于具体型号。

GPIO模块是STM32微控制器中非常重要的功能之一,它允许微控制器与外部设备进行数字信号交换。通过正确配置和使用GPIO,可以实现各种应用,包括传感器接口、控制输出设备等。

IO端口的基本作用

2. GPIO功能

(1)模式分类

GPIO端口的每个位可以由软件分别配置成多种模式:

  • 输入浮空
  • 输入上拉
  • 输入下拉
  • 开漏输出
  • 推挽式输出
  • 推挽式复用功能
  • 开漏复用功能

(2)模式设置方法

通过设置: GPIOx_CRL/CRH,具体有:

MODE[1:0]:模式控制,用于配置端口引脚的模式:
  • 00:输入模式
  • 01:输出模式
  • 10:复用功能模式
  • 11:模拟输入模式
CNF[1:0]:配置引脚输出速度:
  • 00:低速
  • 01:中速
  • 10:高速
  • 11:最高速
PUPD[1:0]:上拉/下拉配置:
  • 00:无上拉/下拉
  • 01:上拉
  • 10:下拉
  • 11:保留

这些值一般在使用寄存器编程需要用到,使用库函数时直接使用系统定义的宏来设置,一般定义如下:

  • GPIO_Mode_IN:输入模式,用于将GPIO引脚配置为输入模式。
  • GPIO_Mode_OUT:输出模式,用于将GPIO引脚配置为输出模式。
  • GPIO_Mode_AF:复用模式,用于将GPIO引脚配置为复用模式,通常用于连接外设。
  • GPIO_Mode_AN:模拟模式,用于将GPIO引脚配置为模拟模式,用于ADC输入等。

(3)输入模式

GPIO引脚可以用于读取外部设备的数字信号。在输入模式下,引脚可以被连接到传感器、开关、按钮等外部设备,并且微控制器可以读取这些设备的状态(高电平或低电平)。
下图是I/O端口位的输入设置:
在这里插入图片描述

(4)输出模式

GPIO引脚可以用于向外部设备发送数字信号。在输出模式下,微控制器可以控制引脚的状态,输出高电平或低电平信号,从而驱动LED、继电器、马达等外部设备。
输出IO端口位配置:
在这里插入图片描述

3. GPIO的寄存器

在STM32系列微控制器中,GPIO的配置和控制通过一系列特定的寄存器完成。这些寄存器提供了对GPIO引脚的各种配置选项和控制功能。
每个GPIO端口有:

(1)两个32位配置寄存器

控制端口引脚的模式、输出速度和上拉/下拉配置。

  • GPIOx_CRL
  • GPIOx_CRH,

(2)两个32位数据寄存器

  • GPIOx_IDR:输入数据寄存器,读取端口引脚的电平状态。
  • GPIOx_ODR:输出数据寄存器,设置端口引脚的电平状态。

(3)一个32位置位/复位寄存器:GPIOx_BSRR

用于设置或复位端口引脚的电平。

(4)一个16位复位寄存器:GPIOx_BRR

用于复位端口引脚的电平。

(5)一个32位锁定寄存器:GPIOx_LCKR

锁定寄存器,用于锁定GPIO端口的配置。

4. 时钟控制器

在STM32微控制器中,每个GPIO端口都需要单独打开时钟以激活其功能。时钟控制器(Clock Controller)是用来控制微控制器内部各个模块的时钟信号的,包括GPIO模块。通过打开相应GPIO端口的时钟,可以使得该端口的GPIO模块开始正常工作。

二、GPIO配置

1. 配置内容

在STM32中,使用寄存器对GPIO进行配置和控制。常见的GPIO配置包括以下几个步骤:

  1. 选择引脚模式:确定引脚是作为输入还是输出。这通常涉及设置相应的寄存器位。

  2. 配置引脚速率:根据需求选择引脚的输出速率,以适应外部设备的要求。速率通常包括低速、中速、高速等选项。

  3. 配置引脚上下拉:根据需要启用或禁用引脚的上拉或下拉电阻,以确保在未连接外部设备时引脚的稳定状态。

  4. 配置引脚中断(可选):如果需要,可以配置引脚触发中断,以便在引脚状态发生变化时触发微控制器的中断服务程序。

2. 配置结构体

GPIO配置结构体是一个用于配置GPIO引脚参数的数据结构,面是一个典型的GPIO配置结构体的说明:

typedef struct {uint32_t GPIO_Pin;      // GPIO引脚编号,可以是单个引脚或者多个引脚的组合,如 GPIO_Pin_0 | GPIO_Pin_1GPIOMode_TypeDef Mode;  // GPIO引脚的工作模式,包括输入模式、输出模式、复用模式等GPIOSpeed_TypeDef Speed; // GPIO引脚的输出速率,通常有低速、中速、高速可选GPIOOType_TypeDef OType; // GPIO引脚的输出类型,通常有推挽输出和开漏输出两种类型GPIOPuPd_TypeDef PuPd;   // GPIO引脚的上拉/下拉电阻状态,可以选择无上拉/下拉、上拉、下拉
} GPIO_InitTypeDef;

初始化:

GPIO_InitTypeDef GPIO_InitStruct;

(1)GPIO_Pin:

表示需要配置的GPIO引脚的编号,可以使用GPIO_Pin_X的形式表示单个引脚,也可以使用按位或操作将多个引脚组合在一起,例如 GPIO_Pin_0 | GPIO_Pin_1 表示同时配置GPIO引脚0和1。

(2)Mode:

表示GPIO引脚的工作模式,包括输入模式(GPIO_Mode_IN)、输出模式(GPIO_Mode_OUT)、复用模式(GPIO_Mode_AF)等。根据具体应用需求选择合适的工作模式。
示例:

GPIO_InitStruct.Mode = GPIO_Mode_IN; // 输入模式
GPIO_InitStruct.Mode = GPIO_Mode_OUT; // 输出模式
GPIO_InitStruct.Mode = GPIO_Mode_AF; // 复用模式

如果是输出模式,还需要选择引脚的类型,通常有推挽输出和开漏输出两种类型。

GPIO_InitStruct.Mode = GPIO_Mode_OUT; // 输出模式
GPIO_InitStruct.Mode = GPIO_Mode_Out_PP; // 推挽输出
GPIO_InitStruct.Mode = GPIO_Mode_Out_OD; // 开漏输出

(3)Speed:

表示GPIO引脚的输出速率,通常有低速(GPIO_Speed_2MHz)、中速(GPIO_Speed_50MHz)、高速(GPIO_Speed_100MHz)可选。选择合适的输出速率可以满足不同应用的需求。
示例:

GPIO_InitStruct.Speed = GPIO_Speed_2MHz; // 2MHz输出速率
GPIO_InitStruct.Speed = GPIO_Speed_50MHz; // 50MHz输出速率
GPIO_InitStruct.Speed = GPIO_Speed_100MHz; // 100MHz输出速率

(4)OType:

表示GPIO引脚的输出类型,包括推挽输出(GPIO_OType_PP)和开漏输出(GPIO_OType_OD)两种类型。推挽输出适用于驱动电平信号,而开漏输出适用于驱动开关或者双向总线。

(5)PuPd:

表示GPIO引脚的上拉/下拉电阻状态,可以选择无上拉/下拉(GPIO_PuPd_NOPULL)、上拉(GPIO_PuPd_UP)、下拉(GPIO_PuPd_DOWN)。根据实际连接情况选择合适的上拉/下拉电阻状态。
示例:

GPIO_InitStruct.Pull = GPIO_PuPd_NOPULL; // 无上拉/下拉
GPIO_InitStruct.Pull = GPIO_PuPd_UP; // 上拉
GPIO_InitStruct.Pull = GPIO_PuPd_DOWN; // 下拉

配置完成后,可以使用GPIO_Init()函数将配置应用到GPIO引脚上:

GPIO_Init(GPIOA, &GPIO_InitStruct); // 将配置应用到 GPIOA 端口上

三、GPIO使用步骤

以下是使用STM32的GPIO的一般步骤:

  1. 打开GPIO端口时钟;
  2. 初始化GPIO模块:在程序开始时,需要初始化GPIO模块,配置所需的引脚为输入或输出,并设置其他相关参数;
  3. 读取输入引脚状态:如果引脚配置为输入模式,可以使用相应的函数或指令来读取引脚的状态,判断外部设备的状态;
  4. 设置输出引脚状态:如果引脚配置为输出模式,可以使用相应的函数或指令来设置引脚的状态,向外部设备发送所需的信号;
  5. 处理中断(可选):如果配置了中断,需要编写相应的中断服务程序来处理引脚状态变化时的事件。

四、代码示例

1. 跑马灯显示

实验使用普中开发板,LED电路如下:
在这里插入图片描述
LED1的阴极连接在芯片的26号引脚PC0(GPIO端口C的第0管脚)上,当PC0输出低电平时,发光二极管正向导通,D1被点亮。因此,对PC0进行操作即可控制LED1。

#include "stm32f10x_lib.h" //包含所有的STM32F10x库的头文件
#include <stdio.h>// GPIO配置函数
void GPIO_Configuration(void)
{GPIO_InitTypeDef GPIO_InitStructure; //定义GPIO初始化结构体// 开启GPIOC的时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);// 设置GPIOC的模式为推挽输出GPIO_InitStructure.GPIO_Pin = GPIO_Pin_All; //选择所有的pinGPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //设置输出速度为50MHzGPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //设置为推挽输出模式GPIO_Init(GPIOC, &GPIO_InitStructure); //初始化GPIOC
}// 延时函数
void delay(u32 i)
{while (i--) //当i不为0时,持续减1,实现延时;
}// 打开指定位置的LED
void on(int position)
{// GPIOC->BSRR = (1 << (16 + position)); //通过设置BSRR寄存器,关闭指定位置的LEDGPIO_ResetBits(GPIOC, GPIO_Pin_0 << position); //
}// 关闭指定位置的LED
void off(int position)
{// GPIOC->BSRR = (1 << (position)); //通过设置BSRR寄存器,打开指定位置的LEDGPIO_SetBits(GPIOC, GPIO_Pin_0 << position);
}// 主函数
int main(void)
{GPIO_Configuration(); //调用GPIO配置函数int j;//GPIOC->BRR = GPIO_Pin_0; //关闭0号位的LEDGPIO_SetBits(GPIOC, GPIO_Pin_All);while (1) //无限循环{for (j = 0; j < 8; j++) //遍历0到7号位{on(j); //打开j号位的LEDdelay(0xfffff); //延时off(j); //关闭j号位的LEDdelay(0xfffff); //延时}}
}

可以设置断点,打开GPIOA的查看窗口查看运行状态 :
在这里插入图片描述

2. 显示数字

#include "stm32f10x_lib.h" //包含所有的STM32F10x库的头文件
#include <stdio.h>int arr[10][7] = {{0,1,2,3,4,5},{1,2},{0,1,6,4,3},{0,1,6,2,3},{5,6,1,2},{0,5,6,2,3},{0,5,6,4,3,2},{0,1,2},{0,1,2,3,4,5,6},{0,1,2,3,5,6}
};// GPIO配置函数
void GPIO_Configuration(void)
{GPIO_InitTypeDef GPIO_InitStructure; //定义GPIO初始化结构体// 开启GPIOC的时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);// 设置GPIOC的模式为推挽输出GPIO_InitStructure.GPIO_Pin = GPIO_Pin_All; //选择所有的pinGPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //设置输出速度为50MHzGPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //设置为推挽输出模式GPIO_Init(GPIOC, &GPIO_InitStructure); //初始化GPIOC
}// 延时函数
void delay(u32 i)
{while (i--) //当i不为0时,持续减1,实现延时;
}// 打开指定位置的LED
void on(int position)
{GPIO_ResetBits(GPIOC, GPIO_Pin_0 << position); //
}// 关闭指定位置的LED
void off(int position)
{GPIO_SetBits(GPIOC, GPIO_Pin_0 << position);
}
void onArray(int array[], int len){int j;for(j=0;j<len;j++){on(array[j]);}
}
int count(int n){int len = 1;for (int i = 1; i < 7; i++) {if (arr[n][i] != '\0') {len++;} else {break;}}	
return len;
}
void lightn(int n){// 计算onArray 第二个参数,即二维数组第二维长度int len = count(n);onArray(arr[n], len);
}void allOff(){GPIO_SetBits(GPIOC, GPIO_Pin_All);
}
// 主函数
int main(void)
{GPIO_Configuration(); //调用GPIO配置函数int j;GPIO_SetBits(GPIOC, GPIO_Pin_All);while (1) //无限循环{for(int i=0;i<10;i++){lightn(i);delay(0xfffff);allOff();delay(0xff);}}
}

本文代码开源地址:
https://gitee.com/xundh/stm32_arm_learn

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

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

相关文章

【vue+leaflet】vue项目中使用leaflet绘制室内平面图、leaflet.pm在平面图中绘制点、线、面图层(一)

效果图: 一,插件安装 npm i leaflet --save // 我的版本^1.9.4 npm i leaflet.pm --save // 我的版本^2.2.0附官网链接: leaflet官网: https://leafletjs.com/index.html leaflet.pm官网: https://www.npmjs.com/package/leaflet.pm?activeTabreadme 二,模块引入 因为我…

Android MMKV 接入+ 替换原生 SP + 原生 SP 数据迁移

背景:项目中一直使用的是原生 SP,众所周知,使用原生 SP 存在卡顿性能问题。公司的性能监控平台抓到不少原生 SP 导致的 ANR 问题: java.io.FileDescriptor.sync (FileDescriptor.java) android.os.FileUtils.sync (FileUtils.java:256) android.app.SharedPreferencesImpl.…

CentOS7.6安装RocksDB

一、简介 RocksDB是使用C编写的嵌入式kv存储引擎&#xff0c;其键值均允许使用二进制流。由Facebook基于levelDB开发&#xff0c; 提供向后兼容的levelDB API。 RocksDB针对Flash存储进行优化&#xff0c;延迟极小。RocksDB使用LSM存储引擎&#xff0c;纯C编写。Java版本Rock…

使用傅里叶实现100倍的压缩效果(附Python源码)

傅里叶变换&#xff08;Fourier Transform&#xff09;是一种将一个函数&#xff08;在时间或空间域&#xff09;转换为另一个函数&#xff08;在频率域&#xff09;的数学变换方法。它在信号处理、图像处理、通信等领域有广泛应用。 实现过程 将傅里叶系数核心的1%保留&…

使用阿里云发送短信

使用阿里云短信服务有两种方式 API 发送和 控制台发送&#xff0c;控制台发送到话有太多限制&#xff0c;这里我们使用API 通过 调用服务端代码进行发送。 整体结构如下&#xff1a; 导入依赖 <!--阿里云短信发送--><dependency><groupId>com.aliyun<…

iOS如何一键清除剪贴板中的所有内容

参考:https://www.jb51.net/shouji/746688.html 1.打开“快捷指令”应用&#xff0c;前往“快捷指令中心”&#xff0c;下拉找到“巧用剪贴板”并点击“查看全部”。 2.下拉到底部&#xff0c;点击“清除剪贴板中的所有内容”&#xff0c;然后选择“添加快捷指令”&#xff1a…

Java学习--黑马SpringBoot3课程个人总结-2024-02-12

1.环境准备 出现报错 Vue 引入路径正确的&#xff0c;但一直报错&#xff1a; Already included file name ‘‘ differs from file name ‘‘ only in casing. 解决方案来自此链接 2.注册界面的搭建 代码如下 <script setup> import { User, Lock } from element-plus/…

信钰证券:a股可以t+0吗?怎么间接实现t+0?

a股不能够t0&#xff0c;它是实施t1的买卖方式&#xff0c;即当天买入的个股&#xff0c;当天不能够卖出&#xff0c;需求比及下一个买卖日才能够卖出&#xff0c;但是&#xff0c;投资者能够通过以下方法直接地完成t0&#xff1a; 1、融券操作 通过融资融券中的融券直接地做…

多元统计分析课程论文-聚类效果评价

数据集来源&#xff1a;Unsupervised Learning on Country Data (kaggle.com) 代码参考&#xff1a;Clustering: PCA| K-Means - DBSCAN - Hierarchical | | Kaggle 基于特征合成降维和主成分分析法降维的国家数据集聚类效果评价 目录 1.特征合成降维 2.PCA降维 3.K-Mean…

Docker部署开源白板工具Excalidraw并结合内网穿透远程访问

最近&#xff0c;我发现了一个超级强大的人工智能学习网站。它以通俗易懂的方式呈现复杂的概念&#xff0c;而且内容风趣幽默。我觉得它对大家可能会有所帮助&#xff0c;所以我在此分享。点击这里跳转到网站。 文章目录 1. 安装Docker2. 使用Docker拉取Excalidraw镜像3. 创建…

基于ORB-SLAM2与YOLOv8剔除动态特征点

基于ORB-SLAM2与YOLOv8剔除动态特征点 以下方法以https://cvg.cit.tum.de/data/datasets/rgbd-dataset/download#freiburg3_walking_xyz数据集进行实验测试APE 首先在不剔除动态特征点的情况下进行测试&#xff1a; 方法1:segment坐标点集合逐一排查剔除 利用YOLOv8的segm…

容性负载箱有哪些主要功能?

容性负载箱是一种用于模拟电网中感性负载的设备&#xff0c;其主要功能包括以下几点&#xff1a; 补偿无功功率&#xff1a;在电力系统中&#xff0c;感性负载会产生无功功率&#xff0c;导致电网电压降低、功率因数下降。容性负载箱可以产生与感性负载相反的无功功率&#xff…

快速排序(2)——快速排序的优化

因为Hoare的快速排序写起来容易出错&#xff0c;并且有很多地方不太合适&#xff0c;于是&#xff0c;就有了一下几种优化。 基准值的优化 如果我们一直选取一组数据的第一个数据为基准值&#xff0c;如果遇到重复少的值的化&#xff0c;没什么问题。但是如果重复的值比较多的…

【PyQt】11-QTextEdit、QPushButton

文章目录 前言一、文本输入-QTextEdit1.1 代码1.2 运行结果 二、QPushButton2.1.1 按钮上添加文本2.1.2 按键的弹跳效果2.1.3 两个信号可以绑定一个槽。2.1.4 带图标的按键运行结果 2.1.5 按键不可用以及回车默认完整代码2.2 单选按键控件运行结果 2.3 复选框&#xff08;多选框…

WouoUI-PageVersion 一个用于快速构建具有丝滑OLED_UI动画的项目

WouoUI-PageVersion 写在前面 简介&致谢 Air001的TestUI例子的b站的演示视频 Air001的LittleClock例子的b站演示视频: https://www.bilibili.com/video/BV1J6421g7H1/ Stm32的TestUI例子的b站演示视频: https://www.bilibili.com/video/BV1mS421P7CZ/ 所有演示的工程文…

对前端限流操作(Redis版本)4种算法

固定时间窗口算法 固定时间窗口算法也可以叫做简单计数算法。网上有很多都将计数算法单独抽离出来。但是笔者认为计数算法是一种思想&#xff0c;而固定时间窗口算法是他的一种实现包括下面滑动时间窗口算法也是计数算法的一种实现。因为计数如果不和时间进行绑定的话那么失去…

文心一言API使用教程(python版)

注&#xff1a;在做项目的时候需要调用文心一言&#xff0c;发现网上的版本很乱&#xff0c;基本都止步在官方文档的代码上&#xff0c;所以写了一篇博客来记录自己的尝试实现了对文心一言的循环调用和自定义询问&#xff0c;本篇文章不需要有任何对api的基础知识&#xff0c;代…

PNG图片压缩-UPNG.js参数说明及示例

UPNG.js是一个非常轻量且高效的库&#xff0c;用于处理PNG图像。它可以编码和解码PNG图片&#xff0c;同时支持压缩和解压缩功能。特别适合在前端项目中处理图像&#xff0c;尤其是在需要优化图像大小而不牺牲质量时。 UPNG.encode()函数是UPNG.js中用于将图像数据编码成PNG格…

lv15 input子系统框架、外设驱动开发 5

一、input子系统基本框架 在我们日常的Linux系统中&#xff0c;存在大量的输入设备&#xff0c;例如按键、鼠标、键盘、触摸屏、摇杆等&#xff0c;他们本身就是字符设备&#xff0c;linux内核将这些字符设备的共同性抽象出来&#xff0c;简化驱动开发建立了一个input子系统。 …

羊大师的羊奶有几种口味呢?

羊大师提供的羊奶有6种不同口味可供选择。 1.新鲜羊奶不仅没有膻味&#xff0c;而且富含高钙无糖&#xff0c;并且含有丰富的优质蛋白质和超过200种营养物质。这非常适合缺钙或体弱的人饮用。 2.益生菌羊奶是一种含有保加利亚乳杆菌、嗜酸乳杆菌、双歧杆菌等益生菌群的产品&…