【STM32基础 CubeMX】从0带你点灯

news2024/12/23 7:07:10

文章目录

  • 前言
  • 一、GPIO的概念
  • 二、CubeMX配置GPIO
    • 2.1 基础配置
    • 2.2 GPIO配置
  • 三、点灯代码讲解
    • 3.1 cubemx生成的代码
    • 3.2 1个库函数
  • 四、LED闪烁
  • 总结


前言


一、GPIO的概念

STM32是一系列微控制器芯片的品牌,它们用于控制各种电子设备。其中的GPIO是通用输入/输出端口的简称,是STM32芯片上的一些引脚,用于与外部世界进行通信。
想象一下STM32芯片就像一个微型大脑,而GPIO引脚就是它的手臂和感官。这些手臂可以用来连接到LED灯、按钮、电机、传感器等外部设备,而感官则可以用来接收来自外部世界的信息,比如检测按钮是否被按下,或者读取传感器的数据。
您可以通过编程来控制这些手臂,告诉它们是应该高举还是低放,就像您控制您的手臂一样。这就是GPIO的基本概念:它们是微控制器与外部设备之间的桥梁,允许微控制器与外部世界互动和通信。通过控制这些引脚的电压,您可以执行各种任务,例如点亮LED、移动电机、检测按钮按下等等。所以,GPIO是让STM32芯片与外部设备互动的关键部分。

二、CubeMX配置GPIO

2.1 基础配置

1、点击File创建新的工程
在这里插入图片描述
在这里插入图片描述
2、输入STM32型号
在这里插入图片描述

3、选择具体的STM32
在这里插入图片描述
双击就可以创建了。就像下面这样:
在这里插入图片描述
然后使用CTRL+s保存,切记不要保存到中文路径下面。

4、配置时钟
在这里插入图片描述
点击RCC,把High Speed Clock(HSE)设置成图片上面的这个

5、选择Clock Configuration配置时钟在这里插入图片描述
6、设置微控制器的主总线时钟为最大
在这里插入图片描述
你这里有多大设置多大,然后按回车。

7、设置debug模式为Serial wire
在这里插入图片描述

8、选择工具链
在这里插入图片描述
9、生成代码
在这里插入图片描述
在这里插入图片描述

这样就是生成好了,我们进行一些Keil的普通配置即可烧录程序进去!

2.2 GPIO配置

1、首先在原理图中找到你想要点的灯的引脚
在这里插入图片描述
2、在CubeMX里面找到他
在这里插入图片描述
3、设置引脚模式
在这里插入图片描述
因为我们是要点灯,所以设置输出模式

在这里插入图片描述
右键可以设置他的名字。

4、接下来设置这个配置特定的GPIO引脚在输出模式下的电压电平状态。
在这里插入图片描述
5、设置GPIO mode
在这里插入图片描述
他们的介绍如下:
推挽输出(Push-Pull Output):

想象一下你有一个开关,可以很容易地按下(这是推)和放开(这是挽)。推挽输出就像这样的开关。它可以将电路连接到电源(高电平)或地(低电平)。

开漏输出(Open-Drain Output):

现在,想象你只能把开关按下,但不能把它放开。这就像你只能把开关拉向地面,但不能把它推向电源。开漏输出就像这样,它只能将电路连接到地(低电平),但在高电平时不会主动提供电源。

这两者之间的主要区别在于,推挽输出可以主动提供电源和连接到地,而开漏输出只能连接到地。开漏输出通常用于需要多个设备共享同一信号线的情况,而推挽输出用于一般的输出任务,比如控制LED灯或驱动电机等。

所以驱动灯需要推挽模式

6、设置GPIO输出的速度
在这里插入图片描述
可以设置3个等级,这里的灯没有要求,随便设置!

最后我们生成代码。

三、点灯代码讲解

3.1 cubemx生成的代码

static void MX_GPIO_Init(void)
{
  GPIO_InitTypeDef GPIO_InitStruct = {0};

  /* GPIO Ports Clock Enable */
  __HAL_RCC_GPIOA_CLK_ENABLE();
  __HAL_RCC_GPIOB_CLK_ENABLE();

  /*Configure GPIO pin Output Level */
  HAL_GPIO_WritePin(GPIOB, GPIO_PIN_5, GPIO_PIN_RESET);

  /*Configure GPIO pin : PB5 */
  GPIO_InitStruct.Pin = GPIO_PIN_5;
  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  GPIO_InitStruct.Pull = GPIO_NOPULL;
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
  HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
}

在这里插入图片描述

下面为这些代码的解析:
static void MX_GPIO_Init(void):这是一个静态函数,用于初始化GPIO配置。函数名是MX_GPIO_Init,不接收任何参数,返回值为空(void)。

GPIO_InitTypeDef GPIO_InitStruct = {0};:在函数内部创建了一个名为GPIO_InitStruct的结构体变量,用于配置GPIO的初始化参数,并初始化为默认值。

__HAL_RCC_GPIOA_CLK_ENABLE();:这行代码启用GPIOA端口的时钟。它告诉微控制器启动GPIOA端口的时钟以激活它,以便您可以在这个端口上使用GPIO引脚。

__HAL_RCC_GPIOB_CLK_ENABLE();:这行代码启用GPIOB端口的时钟,同样的道理,它启用了GPIOB端口以使其可用。

HAL_GPIO_WritePin(GPIOB, GPIO_PIN_5, GPIO_PIN_RESET);:这行代码将GPIOB端口的第5号引脚(也就是PB5)的输出电平设置为低电平(GPIO_PIN_RESET)。这通常用于初始化GPIO引脚的状态。

GPIO_InitStruct.Pin = GPIO_PIN_5;:这行代码设置了GPIO_InitStruct结构体中的Pin成员,指定了要配置的GPIO引脚,即PB5。

GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;:这行代码设置了GPIO_InitStruct结构体中的Mode成员,将GPIO引脚配置为推挽输出模式(GPIO_MODE_OUTPUT_PP)。这意味着PB5将能够提供电源并连接到地。

GPIO_InitStruct.Pull = GPIO_NOPULL;:这行代码设置了GPIO_InitStruct结构体中的Pull成员,表示不使用上拉或下拉电阻。

GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;:这行代码设置了GPIO_InitStruct结构体中的Speed成员,将GPIO引脚的输出速度配置为高速度。这表示GPIO引脚将具有较短的上升和下降边沿,以实现高速输出。

HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);:最后一行代码将配置参数应用到GPIOB端口的PB5引脚上,初始化该引脚的配置。

3.2 1个库函数

HAL_GPIO_WritePin函数是HAL(Hardware Abstraction Layer)库中的一个函数,用于控制STM32微控制器上的GPIO引脚的输出电平。以下是该函数的原型以及参数的作用:

void HAL_GPIO_WritePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState);

在这里插入图片描述

参数解释:

GPIO_TypeDef* GPIOx:这是一个指向GPIO端口寄存器的指针。它告诉函数要控制哪个GPIO端口。在STM32库中,每个GPIO端口都有一个相应的GPIO_TypeDef结构体指针,用于访问该端口的寄存器。例如,GPIOA、GPIOB等。

uint16_t GPIO_Pin:这是一个用于指定要控制的GPIO引脚的位掩码。在STM32中,每个GPIO端口有多个引脚,每个引脚都有一个唯一的位掩码。这个参数告诉函数要控制哪些引脚。可以使用位掩码运算来同时控制多个引脚。

GPIO_PinState PinState:这是一个枚举类型的参数,用于指定要设置的引脚状态。它有两个可能的值:

GPIO_PIN_RESET:表示要将引脚的状态设置为低电平(0V)。
GPIO_PIN_SET:表示要将引脚的状态设置为高电平(通常等于系统供电电压或VDD)。
这个函数的作用是根据参数的设置来控制指定GPIO端口上的一个或多个引脚的输出电平状态。它允许您在嵌入式应用中轻松地控制和操作GPIO引脚的电平,用于控制外部设备、传感器和其他外围设备。

那么我们就可以去点亮LED啦:

HAL_GPIO_WritePin(GPIOB,GPIO_PIN_5,GPIO_PIN_SET);

在这里插入图片描述

四、LED闪烁

我们只需要在main函数中的while循环写一个高电平一个低电平即可闪烁LED

int main(void)
{
  /* USER CODE BEGIN 1 */

  /* USER CODE END 1 */

  /* MCU Configuration--------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* USER CODE BEGIN Init */

  /* USER CODE END Init */

  /* Configure the system clock */
  SystemClock_Config();

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  /* USER CODE BEGIN 2 */

  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */
		
		HAL_GPIO_WritePin(GPIOB,GPIO_PIN_5,0);
		
		HAL_Delay(200);
		
		HAL_GPIO_WritePin(GPIOB,GPIO_PIN_5,1);
		
		HAL_Delay(200);

    /* USER CODE BEGIN 3 */
  }
  /* USER CODE END 3 */
}

在这里插入图片描述

其中HAL_Delay是一个延时函数,参数为延时的毫秒数。


总结

本文介绍了STM32微控制器的基础概念,特别是GPIO(通用输入/输出端口),并以通俗易懂的方式解释了相关概念。
首先,我们了解了STM32是一系列用于控制电子设备的微控制器芯片品牌。在这个系列中,GPIO引脚扮演了重要角色,它们就像微控制器的手臂和感官,用于连接和与外部世界通信。
GPIO引脚的基本概念是它们可以通过编程来控制,就像控制手臂一样。通过改变这些引脚的电压,可以执行各种任务,例如点亮LED、移动电机、检测按钮按下等等。GPIO是STM32与外部设备互动和通信的关键部分。
这篇文章强调了GPIO的初始化过程,以及如何使用HAL库中的函数来配置和控制GPIO引脚。示例代码中展示了如何初始化GPIO引脚,并将其配置为输出,以控制LED的点亮和熄灭。
总的来说,本文提供了一个入门级的STM32 GPIO教程,让读者了解了如何从零开始控制一个简单的电子设备,即LED灯。这是深入学习STM32嵌入式开发的第一步,为进一步探索更复杂的应用奠定了基础。希望本文对初学者有所帮助,引导他们进入嵌入式系统开发的精彩世界。

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

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

相关文章

Spring IOC(控制反转)与DI(依赖注入)

定义 IOC(Inversion of Control),即控制反转:对象的创建控制权不再由程序来执行,而是交由给Spring容器处理。简单的说程序不需要进行new操作,对象直接由Spring容器自动创建。 DI(Dependency Injection),即依赖注入&am…

窗口类介绍

目录 Qwidget QDialog QMessageBox QFileDialog QFontDialog QColorDialog QInputDialog QProgressDialog QMainWindow 菜单栏 工具栏 状态栏 停靠窗口 窗口布局 Qwidget 常用的一些函数包括: 设置窗口的大小,尺寸,得到对应的…

蓝海彤翔亮相2023新疆网络文化节重点项目“新疆动漫节”

9月22日上午,2023新疆网络文化节重点项目“新疆动漫节”(以下简称“2023新疆动漫节”)在克拉玛依科学技术馆隆重开幕,蓝海彤翔作为国内知名的文化科技产业集团应邀参与此次活动,并在美好新疆e起向未来动漫展映区设置展…

Ubuntu为什么键盘会出现乱字符

今天上午起来只是要简单打一个命令,需要输入一个"双引号,但是总是显示,我一开始以为是中了病毒,把键盘给改了,后来发现虚惊一场:出现这个原因是因为ubuntu的键盘设置有问题。 我把键盘设置为英国英语…

C++简单实现红黑树

目录 一、概念 二、红黑树的性质 三、红黑树的定义 四、红黑树的插入操作 情况一(叔叔节点存在且为红色)——变色向上调整: 情况二(叔叔节点不存在或为黑色)——旋转变色: 2.1叔叔节点不存在 2.2叔叔…

在 SDXL 上用 T2I-Adapter 实现高效可控的文生图

T2I-Adapter 是一种高效的即插即用模型,其能对冻结的预训练大型文生图模型提供额外引导。T2I-Adapter 将 T2I 模型中的内部知识与外部控制信号结合起来。我们可以根据不同的情况训练各种适配器,实现丰富的控制和编辑效果。 同期的 ControlNet 也有类似的…

Windows Server 2012 R2 安装 .NET Framework 4.6.1

服务器操作系统是 Windows Server 2012 R2 版本,在安装 .NET Framework 4.6.1 过程中出现报错,报错截图如下: 通过上报报错可以发现是缺少对应的 KB2919355 更新,只有安装了此依赖才能在 Windows 8.1 或 Windows Server 2012 R2 …

中秋海报设计技巧大公开

中秋节即将来临,为了帮助大家设计出完美的海报,本文将提供详细的步骤和技巧,让你轻松打造出令人满意的海报作品。 步骤一:注册并登录乔拓云后台,进入海报中心页面。 在制作海报之前,你需要先注册并登录乔拓…

yolov5-6.0使用改进

代码版本V6.0 源码 YOLOv5 v6.0 release 改动速览 推出了新的 P5 和 P6 ‘Nano’ 模型: YOLOV5n和YOLOV5n6。 Nano 将 YOLOv5s 的深度倍数保持为 0.33,但将 YOLOv5 的宽度倍数从 0.50 降低到 0.25,从而将参数从 7.5M 降低到 1.9M&#xff0…

Linux shell 脚本中, $@ 和$# 分别是什么意思

Linux shell 脚本中, 和 和 和# 分别是什么意思? $:表示所有脚本参数的内容 $#:表示返回所有脚本参数的个数。 示例:编写如下shell脚本,保存为test.sh #!/bin/sh echo “number:$#” echo “argume:$” 执行…

李宏毅机器学习第一课(结尾附作业模型详细分析)

机器学习就是让机器找一个函数f,这个函数f是通过计算机找出来的 如果参数少的话,我们可以使用暴搜,但是如果参数特别多的话,我们就要使用Gradient Descent Regression (输出的是一个scalar数值) Classification (在…

dart flutter json 转 model 常用库对比 json_serializable json_model JsonToDart

1.对比 我是一个初学者,一直跟着教材用原生的json,最近发现实在太麻烦了.所以搜索了一下,发现真的有很多现成的解决方案. 网页 https://app.quicktype.io/?ldart 这个是测试下来最好用的 有很多选项,可以使用 json_serializable 也可以不使用 json_serializable 这是推荐最…

【模拟实现C语言库函数】atoi的模拟实现

#include <stdio.h> #include <assert.h> #include <string.h> #include <math.h> int my_atoi(const char* str) {assert(str);size_t len strlen(str);size_t j len - 1;// 个位&#xff08;1234中的4&#xff09;int ret str[j--] - 0;// 十位百…

基于PySide6的GUI程序开发全流程(看完就会)

本文详细记录了从零到一开发一个GUI程序的过程&#xff0c;想学PySide6的入门文章不二之选&#xff1b; 1 前言 1.1 开发框架的选择 GUI程序的开发方式太多了&#xff0c;这里肯定就是Python语言了&#xff0c;至于为什么&#xff0c;就不多描述了&#xff1b; 那么基于Pyth…

YOLov5 分割数据集的制作(详细过程+代码)

1.labelme 的使用 每张图片会对应生成一个&#xff1a; 以上已经画好所有的数据集&#xff08;&#xff01;&#xff01;&#xff09; 2.这里介绍一下如果都是没有变化的数据集&#xff0c;标签的位置都一样&#xff0c;如何批量生成这个数据集 我们先将第一个数据集复制2275…

红队打靶:THE PLANETS: MERCURY打靶思路详解(vulnhub)

目录 写在开头 第一步&#xff1a;主机发现和端口扫描 第二步&#xff1a;Web渗透 第三步&#xff1a;获取初步立足点并搜集信息 第四步&#xff1a;软连接劫持sudo提权 总结与思考 写在开头 本篇博客在自己的理解之上根据大佬红队笔记的视频进行打靶&#xff0c;详述了…

C2. Powering the Hero (hard version)

题目&#xff1a;样例&#xff1a; 输入 5 5 3 3 3 0 0 6 0 3 3 0 0 3 7 1 2 3 0 4 5 0 7 1 2 5 0 4 3 0 5 3 1 0 0 4输出 6 6 8 9 4 思路&#xff1a; 贪心思维题&#xff0c;这道题要求的是一张一张的凑卡牌&#xff0c;凑到的是力量赋值卡就存储好&#xff0c;抽到 0 就是英…

智能驾驶、智能家居、智能工业中的 AI 关键基础设施,半导体厂商恩智浦的角色是什么?

我们来看一条七年前的真实新闻报道&#xff0c;2016 年《福布斯》在报道中提到“2020 年会有 1000 万台的自动驾驶汽车”。然而 2023 年的现在&#xff0c;真正实现 L4 级别自动驾驶的汽车&#xff0c;仍然远远没有达到这个预测的数量。 另一边&#xff0c;数据显示&#xff0c…

递归实例:汉诺塔问题(n个圆盘3个柱子abc 一次动一个盘子)

实例&#xff1a;汉诺塔问题 n个圆盘3个柱子abc 一次动一个盘子 把上面n-1个盘看成一个整体&#xff0c;下面1个盘看成一个整体 n-1盘经过c移动到b第n盘到cn-1盘经过a到c 1 3步就是小一规模的汉诺塔 移动次数递推式 h(x)2h(x-1)1 def hanoi(n, a, b, c):if n > 0:hano…

Flutter笔记:AnimationMean、AnimationMax 和 AnimationMin 三个类的用法

Flutter笔记 AnimationMean、AnimationMax 和 AnimationMin三个类的用法 作者&#xff1a;李俊才 &#xff08;jcLee95&#xff09;&#xff1a;https://blog.csdn.net/qq_28550263 邮箱 &#xff1a;291148484163.com 本文地址&#xff1a;https://blog.csdn.net/qq_28550263/…