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_1
    GPIOMode_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; //选择所有的pin
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //设置输出速度为50MHz
    GPIO_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寄存器,关闭指定位置的LED
	GPIO_ResetBits(GPIOC, GPIO_Pin_0 << position); //
}

// 关闭指定位置的LED
void off(int position)
{
    // GPIOC->BSRR = (1 << (position)); //通过设置BSRR寄存器,打开指定位置的LED
	GPIO_SetBits(GPIOC, GPIO_Pin_0 << position);
}

// 主函数
int main(void)
{
    GPIO_Configuration(); //调用GPIO配置函数

    int j;

    //GPIOC->BRR = GPIO_Pin_0; //关闭0号位的LED
		GPIO_SetBits(GPIOC, GPIO_Pin_All);
    while (1) //无限循环
    {
        for (j = 0; j < 8; j++) //遍历0到7号位
        {
            on(j); //打开j号位的LED
            delay(0xfffff); //延时
            off(j); //关闭j号位的LED
            delay(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; //选择所有的pin
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //设置输出速度为50MHz
    GPIO_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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

一.重新回炉Spring Framework: 理解Spring IoC

1. 写在前面的话 说实话&#xff0c;从事java开发工作时间也不短了&#xff0c;对于Spring Framework&#xff0c;也是天天用&#xff0c;这期间也碰到了很多问题&#xff0c;也解决了很多问题。可是&#xff0c;总感觉对Spring Framework还是一知半解&#xff0c;不能有个更加…

有趣的CSS - 新拟态输入框

我是 Just&#xff0c;这里是「设计师工作日常」&#xff0c;《有趣的css》系列已更新 11 篇了&#xff0c;今天这篇是关于新拟态风格的一个输入框效果&#xff0c;希望你们喜欢。 目录 页面效果核心代码html代码css代码 完整代码html页面css样式 页面效果 此效果使用 css 中 b…

计算机组成原理(4)-----Cache的原理及相关知识点

目录 1.Cache的原理 2.Cache的性能 3.Cache和主存的映射方式 &#xff08;1&#xff09;全相联映射 &#xff08;2&#xff09;直接映射 &#xff08;3&#xff09;组相联映射 4.替换算法 (1)随机算法(RAND) (2)先进先出算法(FIFO) (3)近期最少使用(LRU) (4)最近不经…

Netty通信框架功能设计

源码部分请见Netty的高级用法(一) 功能描述 通信框架承载了业务内部各模块之间的消息交互和服务调用&#xff0c;它的主要功能如下: 基于Netty的NIO通信框架&#xff0c;提供高性能的异步通信能力提供消息的编解码框架&#xff0c;可以实现POJO的序列化和反序列化消息内容的…

使用 apt 源安装 ROCm 6.0.x 在Ubuntu 22.04.01

从源码编译 rocSolver 本人只操作过单个rocm版本的情景&#xff0c;20240218 ubuntu 22.04.01 1&#xff0c;卸载原先的rocm https://docs.amd.com/en/docs-5.1.3/deploy/linux/os-native/uninstall.html # Uninstall single-version ROCm packages sudo apt autoremove ro…

IO 流分类

一、File File 类&#xff08;磁盘操作&#xff09;可以用于表示文件和目录的信息&#xff0c;但是它不表示文件的内容。递归地列出一个目录下所有文件&#xff1a; public static void listAllFiles(File dir) {if (dir null || !dir.exists()) {return;}if (dir.isFile())…

收藏 数据结构链表的知识点总结

数据结构链表知识点总结 1. 链表的基本概念 - 链表是一种线性数据结构&#xff0c;由一系列节点&#xff08;或元素&#xff09;组成。 - 每个节点包含两部分&#xff1a;数据域和指针域&#xff08;或称为链接&#xff09;。 - 指针域存储指向下一个节点的地址&#xff0c…

扶贫助农|基于springboot的扶贫助农系统设计与实现(源码+数据库+文档)

扶贫助农系统目录 目录 基于springboot的扶贫助农系统设计与实现 一、前言 二、系统功能设计 三、系统实现 1、用户信息管理 2、扶贫任务管理 3、论坛信息管理 4、扶贫公告管理 四、数据库设计 1、实体ER图 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐…

java面试多线程篇

文章说明 在文章中对所有的面试题都进行了难易程度和出现频率的等级说明 星数越多代表权重越大&#xff0c;最多五颗星&#xff08;☆☆☆☆☆&#xff09; 最少一颗星&#xff08;☆&#xff09; 1.线程的基础知识 1.1 线程和进程的区别&#xff1f; 难易程度&#xff1a;☆☆…

JAVA--泛型(Generic)

目录 1. 泛型概述 1.1 生活中的例子 1.2 泛型的引入 2. 使用泛型举例 2.1 集合中使用泛型 2.1.1 举例 2.2 比较器中使用泛型 2.2.1 举例 2.2.2 练习 2.3 相关使用说明 3. 自定义泛型结构 3.1 泛型的基础说明 3.2 自定义泛型类或泛型接口 3.2.1 说明 3.2.2 注意 …

LabVIEW智能监测系统

LabVIEW智能监测系统 设计与实现一个基于LabVIEW的智能监测系统&#xff0c;通过高效的数据采集和处理能力&#xff0c;提高监测精度和响应速度。系统通过集成传感器技术与虚拟仪器软件&#xff0c;实现对环境参数的实时监测与分析&#xff0c;进而优化监控过程&#xff0c;提…

平滑升级旧版nginx,使其支持健康检测模组

nginx是部署在华为欧拉的docker容器中&#xff0c;版本是2203sp1.x86_64 查看旧版nginx的版本与编译配置信息&#xff1a; nginx -Vnginx version: nginx/1.14.1 built by gcc 8.3.1 20191121 (Red Hat 8.3.1-5) (GCC) built with OpenSSL 1.1.1g FIPS 21 Apr 2020 (running …

解决Ubuntu下网络适配器桥接模式下ping网址不通的情况

问题反应&#xff1a;ping不通网址 打开虚拟机中的设置&#xff0c;更改网络适配器为NAT模式 确定保存更改之后&#xff0c;退出输入如下命令。 命令1&#xff1a; sudo /etc/network/inferfaces 命令2&#xff1a; sudo /etc/init.d/network/ restart

SpringCloud-Config:分布式配置

10. Spring Cloud Config 分布式配置 Dalston.RELEASE Spring Cloud Config为分布式系统中的外部配置提供服务器和客户端支持。使用Config Server&#xff0c;您可以在所有环境中管理应用程序的外部属性。客户端和服务器上的概念映射与Spring Environment和PropertySource抽象…

电商云平台系统的设计与实现

随着电商市场的不断发展&#xff0c;越来越多的企业和个人选择通过电商平台开展业务。为了更好地满足电商市场的需求&#xff0c;一个高效、安全、可扩展的电商云平台系统是必不可少的。本文将介绍电商云平台系统的设计与实现。 1. 系统架构设计 电商云平台系统的架构设计主要…

SSTI模板注入漏洞(vulhub 复现)

首先了解模板引擎&#xff1a; 模板引擎&#xff08;这里特指用于Web开发的模板引擎&#xff09;是为了使用户界面与业务数据&#xff08;内容&#xff09;分离而产生的&#xff0c;它可以生成特定格式的文档&#xff0c;利用模板引擎来生成前端的html代码&#xff0c;模板引擎…

JS加密解密之JS广告漂浮代码分析

前言 之前有个客户要求帮忙复刻一份广告漂浮代码&#xff0c;我看了下&#xff0c;目标站的广告代码是通过了JS加密后的&#xff0c;经过我解密还原后分析了一下该代码的作用如下。 ;var _0xodDddd,_0xodD_[_0xodD],_0x1d02[_0xodD,\x73\x54\x69\x6d\x65,\x6c\x6f\x61\x64\x5…

Vue3 provide + inject

provide&#xff1a;提供一个值&#xff0c;可以在应用中的所有后代组件中注入使用。 官方文档&#xff1a;应用实例 API | Vue.js 应用实例 API | Vue.jsVue.js - 渐进式的 JavaScript 框架https://cn.vuejs.org/api/application.html#app-provide 使用示例 祖先组件 <…

『随处指挥』:用这款APP,世界听你的!

在这个科技日新月异的时代&#xff0c;我们的生活被各种手机软件所包围。几乎每个人都有一个甚至多个手机&#xff0c;你是否也有遇到过需要远程操作自己某一台手机的场景呢&#xff1f;今天&#xff0c;我要向大家推荐一款神奇的手机远程操作神器&#xff0c;让你可以随时随地…

【设计模式】4、策略模式

文章目录 一、问题二、解决方案2.1 真实世界的类比2.2 策略模式结构2.3 适用场景2.4 实现方式2.5 优缺点2.6 与其他模式的关系 三、示例代码3.1 go3.2 rust 策略模式是一种行为设计模式&#xff0c;它能定义一系列算法&#xff0c;把每种算法分别放入独立的类中&#xff0c;以是…