STM32——GPIO输出(点亮第一个LED灯)

代码示例:

#include "stm32f10x.h"                  // Device header

int main()
{
	
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//开启时钟
	GPIO_InitTypeDef GPIO_InitStructure;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOA,&GPIO_InitStructure);
	GPIO_SetBits(GPIOA,GPIO_Pin_0);
	GPIO_WriteBit(GPIOA,GPIO_Pin_0,Bit_RESET);
	while(1)
	{
		
	}
}   

使用的外设:

在要用STM32单片机实现某一个功能之前我们需要除了完成基础步骤之外,要知道需要用的什么外设,然后查看该外设都有哪些库函数,这是在采用库函数的开发模式下。

一.RCC:
在STM32单片机中,RCC(Reset and Clock Control)即复位和时钟控制器,是一个非常重要的模块,负责单片机的复位以及时钟的配置。
RCC模块的主要作用包括:
1.复位控制: STM32F10xxx系列支持多种复位形式,如系统复位、电源复位和备份区域复位。这些复位操作可以通过NRST引脚上的低电平(外部复位)、窗口看门狗计数终止(WWDG复位)、独立看门狗计数终止(IWDG复位)、软件复位(SW复位)或低功耗管理复位等方式触发。系统复位将复位除时钟控制器的RCC_CSR寄存器中的复位标志位和备份区域中的寄存器以外的所有寄存器至其复位状态。
2.时钟配置: 2.时钟配置:RCC模块提供了对时钟源的配置、时钟分频、复位控制等功能。它可以配置主时钟源、系统时钟、AHB总线时钟和APB总线时钟等。通过RCC模块,可以将各种时钟源分配给不同的系统和外设,以满足它们对时钟频率和精度的需求。
3.外设时钟使能:在使用外设模块之前,需要启用相应的外设时钟。RCC模块提供了一系列函数。
如:
RCC_APB2PeriphClockCmd RCC_APB1PeriphClockCmd ,用于启用或禁用外设时钟。这些函数可以确保在需要时向特定外设提供时钟信号,从而使其能够正常工作。
总的来说:RCC模块在STM32单片机中起着至关重要的作用,它负责整个系统的复位和时钟管理,确保系统能够稳定、可靠地运行。

第一步:使用RCC开启GPIO的时钟

首先:
可以在Library中找到rcc.h文件,该文件里面有它能够使用的所有库函数,而我们常用的一般就三个:
1.RCC AHB外设时钟控制
2.RCC APB2外设时钟控制
3.RCC APB1外设时钟控制

在这里插入图片描述

  • 右键可以打开该函数:
    注释部分讲述了该函数的功能。同时里面包含的外设就是你能够通过RCC进行使能的

    在这里插入图片描述

为什么第一步要开启时钟:

  • STM32的时钟系统对于整个微控制器的工作至关重要。时钟系统为STM32提供统一的节拍,就像人的心跳一样,驱动着微控制器内部各个部分按照预定的时序执行相应的指令。具体来说,时钟系统的作用主要体现在以下几个方面:

1. 同步工作:时钟信号为STM32的各个电路模块提供了一个统一的时间基准,使得它们能够按照预定的时序进行工作。例如,CPU核心在时钟的驱动下完成指令执行和状态变换,外设部件(如GPIO端口)在时钟的驱动下完成数据的发送和接收等操作。

2. 控制速度:时钟信号的频率决定了STM32的工作速度。通过调整时钟信号的频率,可以控制STM32的执行效率和功耗。在需要高性能的场景下,可以提高时钟频率以加快执行速度;在需要低功耗的场景下,可以降低时钟频率以降低功耗。

3. 省电设计:STM32的时钟系统采用了时钟门控技术,可以根据需要开启或关闭某个电路模块的时钟。当某个电路模块不需要工作时,关闭其时钟可以节省功耗。这种设计使得STM32在保持高性能的同时,也具有良好的节能性能。

  • 在STM32中,GPIO(通用输入/输出)端口是连接外部设备和微控制器的桥梁。要想使用GPIO端口进行数据的输入和输出,必须先通过RCC(Reset and Clock Control,复位与时钟控制)模块开启其时钟。这是因为GPIO端口的寄存器是由D触发器构成的,而触发器需要时钟信号才能改写其值。只有开启了GPIO的时钟,微控制器才能通过操作寄存器来控制GPIO端口的输入输出状态。因此,在使用GPIO之前,第一步就是使用RCC开启其时钟。

调用RCC的APB2外设时钟控制函数:

  • 本次点灯用的是PA0口,所以对GPIOA的时钟进行使能,打开APB2外设时钟控制函数,在注释里能够看到支持的外设,选择GPIOA放到第一个参数,第二个参数就是使能ENABLE。
    在这里插入图片描述
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);

第二步:使用GPIO_Init函数初始化GPIO

首先:
打开GPIO的.H头文件,就可以看到GPIO_Init函数,这个函数用结构体参数来初始化GPIO口,函数会读取结构体成员然后把外设的参数配置好,这种Init函数在所有外设函数中基本都有。

为什么要用GPIO_Init函数对GPIO口进行初始化:

  • 在STM32中,使用GPIO_Init函数初始化GPIO是点亮LED灯的关键步骤,原因主要有以下几点:

1.配置GPIO引脚属性:GPIO_Init函数用于配置GPIO引脚的各种属性,如输出模式、上拉/下拉电阻、引脚速度等。对于LED灯来说,通常需要将GPIO引脚配置为输出模式,以便能够控制LED灯的亮灭。

2.确保通信正常:通过GPIO_Init函数的正确配置,可以确保STM32微控制器与LED灯之间的通信正常进行。这包括设置正确的引脚速度、避免冲突和干扰等。

3.简化编程:STM32的HAL(硬件抽象层)库中包含了GPIO_Init函数,使得开发者可以更方便地配置GPIO引脚。通过直接使用这个函数,可以避免直接操作寄存器,从而简化编程过程。

4.适应不同需求:GPIO_Init函数允许开发者根据具体需求配置GPIO引脚。例如,对于不同的LED灯或不同的应用场景,可能需要设置不同的引脚速度或上拉/下拉电阻。通过GPIO_Init函数,可以轻松实现这些配置。

因此,在使用STM32点亮LED灯时,需要使用GPIO_Init函数来初始化GPIO引脚,以确保LED灯能够正常工作。同时,还需要注意在程序中正确设置GPIO引脚的状态(高电平或低电平),以控制LED灯的亮灭。

结构体参数的赋值步骤:

2.GPIO_Init函数第二个参数是一个结构体,GPIO_InitTypeDef是一个结构体类型,它是这个结构体的名字,将它赋值下来一会在主函数中创建一个该结构体的变量,然后给这个结构体的变量的成员赋值,再将这个结构体变量的地址作为参数传给GPIO_Init函数。

//这样就创建了一个GPIO_InitTypeDef类型的变量,GPIO_InitTypeDef是一个已经定义好的结构体。GPIO_InitStructure则是一个用GPIO_InitTypeDe定义的结构体变量。
GPIO_InitTypeDef GPIO_InitStructure;

第一步:

  • 创建好一个结构体变量,然后通过点操作符先选择一个成员,右键选择去到该成员的定义处,不要画蓝选中,直接鼠标指到该变量右键就好。我们先看GPIO_Mode,配置好GPIO的工作模式。
GPIO_InitStructure.GPIO_Mode

在这里插入图片描述
第二步:
跳转之后如下图,注意旁边的注释。
在这里插入图片描述
*1.注释 /*!< … / 是一种特殊的多行注释,在Doxygen(一个流行的文档生成工具)中用于生成文档。它通常用于为代码添加额外的描述信息,这些信息可以被Doxygen等工具提取并转换为人类可读的文档。

2.@ref GPIOMode_TypeDef 是一个Doxygen标记,用于创建一个到GPIOMode_TypeDef定义的引用。这意味着,当你查看生成的文档时,你可以通过这个引用直接跳转到GPIOMode_TypeDef的定义部分。

第三步:

  • 那么选中注释中的GPIOMode_TyepeDef,然后CTRL + F可以查找到关于GPIO八种工作模式的选择。
    在这里插入图片描述
  • 跳转到该处就能看到一个枚举类型GPIOMode_TyepeDef,可以看到其中的枚举常量(枚举成员)指定的整数值就是不同的输入输出模式。我们点灯用的是推挽输出,所以赋值Out_PP这一项。这个Out_PP是一个枚举常量,而GPIO_Mode是一个枚举类型GPIOMode_TypeDef的变量。**
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;

在这里插入图片描述

其他的GPIO_Pin和GPIO_Speed也是同样的步骤

枚举类型:

  • 枚举类型(Enumeration Type)是一种用户定义的数据类型,允许你为整数值指定一组具名的标识符(也称为枚举成员或枚举常量)。在编程中,枚举类型用于表示固定数量的常量值,这些常量值通常与某种上下文或数据类型相关联。

代码块(1):

typedef enum
{ GPIO_Mode_AIN = 0x0,
  GPIO_Mode_IN_FLOATING = 0x04,
  GPIO_Mode_IPD = 0x28,
  GPIO_Mode_IPU = 0x48,
  GPIO_Mode_Out_OD = 0x14,
  GPIO_Mode_Out_PP = 0x10,
  GPIO_Mode_AF_OD = 0x1C,
  GPIO_Mode_AF_PP = 0x18
}GPIOMode_TypeDef;
  • 代码(1)中展示的就是一个枚举类型,其中花括号{}内部的称为枚举成员,花括号结尾的GPIOMode_TypeDef是这个枚举类型的名字。

代码块(2):

typedef struct
{
  uint16_t GPIO_Pin;             /*!< Specifies the GPIO pins to be configured.
                                      This parameter can be any value of @ref GPIO_pins_define */

  GPIOSpeed_TypeDef GPIO_Speed;  /*!< Specifies the speed for the selected pins.
                                      This parameter can be a value of @ref GPIOSpeed_TypeDef */

  GPIOMode_TypeDef GPIO_Mode;    /*!< Specifies the operating mode for the selected pins.
                                      This parameter can be a value of @ref GPIOMode_TypeDef */
}GPIO_InitTypeDef;
  • 在上面这块代码中一共用GPIOSpeed_TypeDef定义了两个枚举变量,分别是GPIO_Speed和GPIO_Mode,于是我们就能够用枚举常量(枚举成员)给这两个变量进行赋值。

注意:

  • 在C语言中,如果枚举成员没有显式地指定整数值,那么它们的值将从0开始递增。在这个例子中,MONDAY 的值为0,TUESDAY 的值为1,依此类推。但是,你也可以显式地为枚举成员指定整数值,就像代码块(2)中已经为每个输出模式的名字指定了整数值。
  • 调用GPIO_Init函数:

//这样就创建了一个GPIO_InitTypeDef类型的变量,GPIO_InitTypeDef是一个已经定义好的结构体。GPIO_InitStructure则是一个用GPIO_InitTypeDe定义的结构体变量。
GPIO_InitTypeDef GPIO_InitStructure;
//接下来对该结构体变量的内部成员进行赋值,然后传给GPIO_Init函数,该函数会读取这些成员变量的值,然后对外设进行配置。
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
//记得这里传的是该结构体变量的地址
GPIO_Init(GPIOA,&GPIO_InitStructure);

当这段代码执行完,这个GPIOA就自动化被配置为推挽输出、50Mhz的速度了。
1.第一个参数是GPIOA,注释中有写该函数的参数和返回值。

GPIO_Init(GPIOA,...)

第三步:使用输出或者输入函数控制GPIO口

在这里插入图片描述
图上是所有GPIO输入或者输出函数,可以直接右键跳转到定义处,根据注释自己使用。
在这里插入图片描述
注释在函数定义的上面,包含简介、参数、返回值。

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

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

相关文章

成为计算机视觉(CV)需要掌握哪些技术知识(综述)

在CV领域&#xff0c;深度学习和机器学习技术发挥着至关重要的作用&#xff0c;它们为图像识别、目标检测、图像分割等任务提供了强大的工具和方法。本文将综述CV中需要学习的深度学习和机器学习技术。 一、深度学习技术 卷积神经网络&#xff08;Convolutional Neural Netwo…

【吊打面试官系列】Java高并发篇 - 为什么线程通信的方法 wait(), notify()和 notifyAll()被定义在 Object 类里?

大家好&#xff0c;我是锋哥。今天分享关于 【为什么线程通信的方法 wait(), notify()和 notifyAll()被定义在 Object 类里&#xff1f;】面试题&#xff0c;希望对大家有帮助&#xff1b; 为什么线程通信的方法 wait(), notify()和 notifyAll()被定义在 Object 类里&#xff1…

被严重低估的后端技术面经,强到离谱!

前天加完班&#xff0c;回家路上翻了下粉丝群。发现群里最近在疯传一份叫《后端 offer 收割机养成指南》的资料。 本来感觉这个 title 看起来有点离谱&#xff0c;结果没想到仔细一看&#xff0c;这份资料竟然真的有点东西。内容收纳的很全&#xff0c;而且融合了很多今年的新…

软件测试从业人员怎么看待测试工作的前途?

调查背景   工信部发布的2023年软件业经济运行情况显示&#xff0c;全年累计完成软件业务收入123258亿元&#xff0c;同比增长13.4%&#xff0c;增速较上年同期提高2.2个百分点。值得注意的是&#xff0c;亚太地区软件测试市场正在迅速崛起&#xff0c;预计到2026年复合年增长…

Django开发实战之单元测试和集成测试之编写测试用例以及代码覆盖率统计分析

这里分为了两种情况&#xff1a; E2E&#xff1a;接近真实使用情况&#xff0c;用例数量少 UT&#xff1a;执行速度快&#xff0c;用例数量多 1、整理测试点 1、注册功能 允许匿名访问URL&#xff1a;http://127.0.0.1:8000/accounts/register/get请求&#xff1a;返回htmlp…

Linux 用户进程启动与Systemd

Linux用户空间的启动 我们都知道&#xff0c;Linux在内核的初始化自身的流程结束后&#xff0c;就会将程序流的运行转到用户态&#xff0c;也就是进入init进程流之后&#xff0c;他会按照这个流程进行初始化&#xff1a; init进程初始化 基础的底层服务&#xff1a;比如说ude…

JavaScript 事件

在 Web 开发中&#xff0c;JavaScript 事件是至关重要的概念之一。通过事件&#xff0c;我们可以实现交互性和动态性&#xff0c;使用户与网页进行互动。本篇博客将介绍 JavaScript 事件的基础知识&#xff0c;并深入探讨一些高级技术。 1. 什么是事件&#xff1f; 事件是指用…

振弦采集仪在岩土工程监测中的性能评价及标准选择

振弦采集仪在岩土工程监测中的性能评价及标准选择 河北稳控科技振弦采集仪是一种重要的岩土工程监测仪器&#xff0c;用于测量振动场的频率、振幅和相位等参数。它在岩土工程施工和地震监测中具有重要的应用价值。本文将对振弦采集仪的性能评价及标准选择进行详细介绍。 首先&…

每日一练2024.5.9

题目&#xff1a; 给定一个非负整数数组 nums&#xff0c; nums 中一半整数是 奇数 &#xff0c;一半整数是 偶数 。 对数组进行排序&#xff0c;以便当 nums[i] 为奇数时&#xff0c;i 也是 奇数 &#xff1b;当 nums[i] 为偶数时&#xff0c; i 也是 偶数 。 你可以返回 …

Java | Leetcode Java题解之第80题删除有序数组中的重复项II

题目&#xff1a; 题解&#xff1a; class Solution {public int removeDuplicates(int[] nums) {int n nums.length;if (n < 2) {return n;}int slow 2, fast 2;while (fast < n) {if (nums[slow - 2] ! nums[fast]) {nums[slow] nums[fast];slow;}fast;}return sl…

Python 全栈系列242 踩坑记录:租用算力机完成任务

说明 记一次用算力机分布式完成任务的坑。 内容 1 背景 很早的时候&#xff0c;做了一个实体识别模型。这个模型可以识别常见的PER、ORG、LOC和TIME几种类型实体。 后来&#xff0c;因为主要只用来做PER、ORG的识别&#xff0c;于是我根据业务数据&#xff0c;重新训练了模…

免费矢量图标汇总:一文掌握10个优质网站!

矢量图标是我们日常设计应用程序和网页过程中不可缺少的元素之一。通过小矢量图标&#xff0c;我们可以快速方便地实现视觉指导和功能划分。但在创作中&#xff0c;设计师往往需要花费大量的时间和精力来寻找不同网站的矢量图标&#xff0c;以满足他们的设计需求&#xff0c;这…

跨域问题(服务器和浏览器之间)待补充

一、为什么产生&#xff1a; 同源策略&#xff08;域名&#xff0c;协议&#xff0c;端口&#xff09;&#xff0c;安全问题 二、怎么解决&#xff1a; 1、cros:修改响应头 2、jp&#xff1a;采用js标签 3、代理&#xff08;创建服务器&#xff0c;定义规则&#xff0c;服…

就业班 第三阶段(zabbix) 2401--5.9 day1 普通集zabbix 5.0部署 nginx部署+agent部署

文章目录 环境一、zabbix 5.0 部署1、安装yum源2、安装相关软件3、数据库安装和配置mariaDB数据库mysql57数据库 安装mysql万能卸载mysql代码&#xff1a;启动mysql并初始化4、数据表导入5、修改配置&#xff0c;启动服务6、配置 web GUI7、浏览器访问注意数据加密的选项不要勾…

走进CHEN MEI HUA的设计哲学:书写东方女性力量与态度的时尚篇章

在时尚的舞台中央&#xff0c;品牌不止是商品&#xff0c;更是故事的讲述者、文化的传承者。CHEN MEI HUA&#xff0c;一个源自中国上海的高端女装品牌&#xff0c;以其独特的设计理念及文化内核&#xff0c;成为了时尚界一颗耀眼的明珠。今天&#xff0c;让我们一起走进CMH的世…

[android]Activity生命周期

andorid app 开发入门与项目实战

SH150S1光电吊舱

SH150S1光电吊舱 1产品应用 SH150S1是一款三轴三光吊舱&#xff0c;集成了最远测程达3.0km&#xff0c;精度小于2米的半导体激光测距机&#xff0c;640512高分辨率红外相机&#xff0c;30倍光学变倍可见光相机以及高稳定精度平台框架&#xff1b;可安装于中小型无人机&#x…

2024数维杯数学建模A题B题C题思路+模型+代码(开赛后第一时间更新)

2024数维杯数学建模A题B题C题思路模型代码&#xff08;开赛后第一时间更新&#xff09; https://mbd.pub/o/bread/ZpWakpdq https://mbd.pub/o/bread/ZpWakpdq 2024年第九届数维杯大学生数学建模挑战赛参赛规则 竞赛要求及论文提交方式; ①本次参赛作品统一在线提交到竞赛…

海外邮件群发工具的使用方法?有哪些限制?

海外邮件群发工具怎么选择&#xff1f;使用邮件群发工具的优势&#xff1f; 海外邮件群发工具成为了企业开展海外推广、联系客户、推广产品和服务的重要工具。但如何有效地使用这一工具&#xff0c;成为了众多营销人员关注的问题。接下来&#xff0c;AokSend将详细探讨海外邮件…
最新文章