当前位置: 首页 > news >正文

细说ARM MCU中的MX_GPIO_Init()函数的实现过程

目录

1、建立.ioc工程

2、 MX_GPIO_Init()函数

(1)MX_GPIO_Init()函数的类型

(2)MX_GPIO_Init()函数中用到的结构体变量

(3)MX_GPIO_Init()函数使能时钟

(4)MX_GPIO_Init()函数配置GPIO


        本文中使用ST的开发板NUCLEO-G474RE,板上MCU型号为STM32G474RET6。配套的扩展板:

        实例中当开发板上的按键B1被按下时,PC13引脚被上拉至高电平VDD,不按下时,PC13下拉至低电平GND。用按键B1控制板上的LD2灯的亮灭,当PA5输出高电平时LD2亮,否则灯灭。

1、建立.ioc工程

        根据上述信息,建立工程,具体操作,略。

2、 MX_GPIO_Init()函数

        系统自动生成代码后,打开main.c。因为工程配置了2个GPIO,一个作为输入,另一个作为输出。MX_GPIO_Init()定义如下:

static void MX_GPIO_Init(void)
{GPIO_InitTypeDef GPIO_InitStruct = {0};/* USER CODE BEGIN MX_GPIO_Init_1 *//* USER CODE END MX_GPIO_Init_1 *//* GPIO Ports Clock Enable */__HAL_RCC_GPIOC_CLK_ENABLE();__HAL_RCC_GPIOF_CLK_ENABLE();__HAL_RCC_GPIOA_CLK_ENABLE();/*Configure GPIO pin Output Level */HAL_GPIO_WritePin(LED0_GPIO_Port, LED0_Pin, GPIO_PIN_SET);/*Configure GPIO pin : KEY_Pin */GPIO_InitStruct.Pin = KEY_Pin;GPIO_InitStruct.Mode = GPIO_MODE_INPUT;GPIO_InitStruct.Pull = GPIO_PULLDOWN;HAL_GPIO_Init(KEY_GPIO_Port, &GPIO_InitStruct);/*Configure GPIO pin : LED0_Pin */GPIO_InitStruct.Pin = LED0_Pin;GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;GPIO_InitStruct.Pull = GPIO_PULLUP;GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;HAL_GPIO_Init(LED0_GPIO_Port, &GPIO_InitStruct);/* USER CODE BEGIN MX_GPIO_Init_2 *//* USER CODE END MX_GPIO_Init_2 */
}

(1)MX_GPIO_Init()函数的类型

        从上面的定义可知,函数MX_GPIO_Init()的类型为void,不返回任何值。不过在void前加了一个static,表示该函数只能在定义它的文件中可见。对于MX_GPIO_Init()函数,只能在main.c中可见。实际上,该函数只置用于设置GPIO的参数,别的地方也用不到。

(2)MX_GPIO_Init()函数中用到的结构体变量

        其中,第一句定义了一个结构体变量GPIO_InitStruct,结构体名称为GPIO_InitTypeDef。这个结构体的声明是在固件库的stm32g4xx_hal_gpio.h文件中:

typedef struct
{unint32_t Pin:unint32_t Mode;unint32_t Pull;unint32_t Speed;unint32_t Alternate;
}GPIO_IniyTypeDef;

        GPIO_InitTypeDef在这里是结构体名称,并不是一个结构体变量,所以在使用该结构体类型时,还需要定义变量。结构体GPIO_InitTypeDef中有5个成员。

  • 成员Pin

        成员Pin实际就是引脚号,譬如GPIO_PIN_0~GPIO_PIN_15等。这些引脚号也是数值,在stm32g4xx_hal_gpio.h中有定义:

#define GPIO_PIN_0  ((uint16_t)0x0001) //第1个引脚
......
#define GPIO_PIN_15 ((uint16_t)0x8000) //第16个引脚
#define GPIO_PIN_All ((uint16_t)0xFFFF)//所有引脚

        在这些define宏定义中,引脚号定义为uint16_t类型,而在结构体GPIO_InitTypeDef中,成员Pin定义为uint32_t。由此可见,在给32位的结构体变量赋值时,实际赋的是16位数。

        实际上STM32G4系列MCU的GPIO寄存器,都是32位的,但有的寄存器只是低16位有效。

  • 成员Mode

        成员Mode是指输入、输出等模式。例如:

输入模式:GPIO_MODE_INPUT;
推挽输出模式:GPIO_MODE_OUTPUT_PP;
开漏输出模式:GPIO_MODE_OUTPUT_OD。

        当然还有一些响应外部中断和外部事件的模式,此处暂时略过。

  • 成员Pull

        成员Pull是用于配置上拉、下拉功能的。例如:

不用上拉下拉:GPIO_NOPULL;
上拉:GPIO_PULLUP;
下拉:GPIO_PULLDOWN。
  • 成员Speed

        成员Speed用于配置GPIO速度,有4个挡位。例如:

低速:GPIO_GPIO_SPEED_FREQ_LOW,最高5MHz;
中速:GPIO_SPEED_FREQ_MEDIUM,5~25 MHz;
高速:GPIO_SPEED_FREQ_HIGH,25~50 MHz;
很高速:GPIO_SPEED_FREQ_VERY_HIGH,50~120 MHz。
  • 成员Alternate

        成员 Alternate涉及引脚复用功能。

       继续,看MX_GPIO_Init()函数的定义,第一条语句是给变量GPIO_InitStruct赋值,等号右侧为{0},意思是将结构体中的所有成员都初始化为0。

(3)MX_GPIO_Init()函数使能时钟

        接下来是三条时钟使能语句,分别使能GPIOC、GPIOF和GPIOA的时钟。使能GPIOF是因为外接晶体用到了GPIOF端口。

(4)MX_GPIO_Init()函数配置GPIO

        因为配置了PA5作为输出,所以接下来的一条语句是初始化PA5的输出状态,用的是GPIO_PIN_RESET,即将其初始化为低电平输出。

        随后,分别对PC13(KEY)和PA5(LED)进行配置。由于已经定义了一个结构体变量GPIO_InitStruct,所以这里需要先给其中的成员赋值:

GPIO_InitStruct.Pin =KEY_Pin;
GPIO_InitStruct.Mode =GPIO_MODE_INPUT;
GPIO_InitStruct.Pull =GPIO_PULLDOWN;

        在这三条语句中,访问结构体成员变量用的是“.”。

      至此,这只是通过结构体变量给成员赋值,还不会作用到硬件(GPIO寄存器)来,调用HAL_GPIO_Init函数,将结构体变量的信息传递过来并作用到相关GPIO寄存器中。所用语句如下:

HAL_GPIO_Init(KEY_GPIO_Port,&GPIO_InitStruct);

        HAL_GPIO_Init函数有两个参数:一个是端口KEY_GPIO_Port,也就是GP个是已经给结构体成员赋值的结构体变量GPIO_InitStruct,注意在结构体变量前要后面的代码是用类似的方式初始化PA5。

        关于HAL_GPIO_Init函数的解析,请看本文作者的其他文章。

相关文章:

细说ARM MCU中的MX_GPIO_Init()函数的实现过程

目录 1、建立.ioc工程 2、 MX_GPIO_Init()函数 (1)MX_GPIO_Init()函数的类型 (2)MX_GPIO_Init()函数中用到的结构体变量 (3)MX_GPIO_Init()函数使能时钟 (4)MX_GPIO_Init()函数…...

【wordpress】网站提示Error establishing a database connection错误代码

Error establishing a database connection错误代码处理方法: 检查数据库连接情况检查数据库账号密码是否正确检查数据库是否开启 总之较大可能是数据库出现了问题...

图书管理系统——Java实现

文章目录 Java实现图书管理系统问题分析框架搭建业务实现项目测试代码演示BookioperationUserMain(默认包) Java实现图书管理系统 学习了前六篇的SE语法,我们现在要用它们实现一个简单的图书管理系统项目,深入了解各个知识点的应…...

Capto 标准版【简体中文+Mac 】

Capto 是一套易于使用的屏幕捕捉、视频录制和视频编辑 Capto-capto安装包-安装包https://souurl.cn/DPhBmP 屏幕录制和教程视频制作 记录整个屏幕或选择的任何特定区域。在创建内容丰富的教程视频时选择显示或隐藏光标。无论您做什么,都可以确保获得高质量的视频。…...

连锁收银系统的五大功能 会员营销是核心

连锁企业的收银系统是其经营管理的关键工具之一,具备多种功能可以帮助企业提高效率、优化服务并实现会员营销。以下是连锁收银系统的五大功能,其中会员营销作为核心功能将在最后详细讨论。 首先,收银系统应具备高效的销售管理功能。这包括商品…...

射频功率限幅器简略

在功率输入保护方面,限幅器是最好用的器件之一,可以保护后级电路不受超限功率的损害,限幅器其实像TVS功能一样,让超过阈值的功率释放到接地上,来达到限制幅度的目的,目前限幅器的限幅幅度大多都大于15dBm,很…...

[备忘] Reboot Linux in python

1.可行的Reboot方法 1.1 修改/etc/sudoers 假定当前用户是mimi,增补这一行: mimi ALL(ALL) NOPASSWD: ALL 这是为了免输指令。 sudoers文件尽量在覆盖前把它的权限改回去: 原始权限 mimidebian-vm:~/test_app$ ls -l /tmp/sudoers -r--r-…...

windows打开工程文件是顺序读写吗

在 Windows 操作系统中,打开和读写工程文件的过程可以是顺序读写,也可以是随机读写,具体取决于使用的软件和文件的性质。以下是一些详细解释: 顺序读写 顺序读写(sequential access)是指按文件中数据的顺…...

【Python】解决Python报错:AttributeError: ‘generator‘ object has no attribute ‘xxx‘

🧑 博主简介:阿里巴巴嵌入式技术专家,深耕嵌入式人工智能领域,具备多年的嵌入式硬件产品研发管理经验。 📒 博客介绍:分享嵌入式开发领域的相关知识、经验、思考和感悟,欢迎关注。提供嵌入式方向…...

【1800】【5.22-5.24】

E1. String Coloring (easy version) E2. String Coloring (hard version) 【细节参考了题解】 题意:序列拆分为最少的若干条不降序列。 思路:简单版可以 n 2 n^2 n2 dp。定义 b o o l d p ( i , j ) bool ~dp(i, j) bool dp(i,j) 表示是否存在方案…...

统计各个商品今年销售额与去年销售额的增长率及排名变化

文章目录 测试数据需求说明需求实现分步解析 测试数据 -- 创建商品表 DROP TABLE IF EXISTS products; CREATE TABLE products (product_id INT,product_name STRING );INSERT INTO products VALUES (1, Product A), (2, Product B), (3, Product C), (4, Product D), (5, Pro…...

华为校招机试 - 矿车运输成本(20240522)

题目描述 露天矿采矿作业的特点是规模大,矿石和废料的移动量达到百万吨,运输成本开销较大,需要寻求一种最优的运输路径节省成本。 已知矿场可以划分成 N * M 的网格图,每个网格存在地形的差异,因此通过不同网格时,成本开销存在差异。 网格有以下 5 种类型: 标志为 S …...

【C++奇技淫巧】CRTP(奇特重现模板模式)

CRTP(Curiously Recurring Template Pattern,奇特重现模版模式),是一种在C中使用模板来实现的设计模式,主要用于实现编译时多态性(静态多态)。这种模式通过类模板和模板继承机制来实现,使得派生…...

web学习笔记(六十一)

目录 如何使用公共组件来编写页面 如何使用公共组件来编写页面 1.导入公共组件nav.vue import Catenav from "/components/nav.vue"; 2.在页面插入子组件 如果使用了setup语法糖此时就可以直接在页面插入 <Catenav ></Catenav>标签&#xff0c; …...

Nginx在Docker中的应用:容器化部署与扩展

在当今的云计算和微服务时代&#xff0c;Docker容器技术因其轻量级、可移植性和可扩展性而受到广泛关注。Nginx&#xff0c;作为一个高性能的HTTP和反向代理服务器&#xff0c;也在Docker中找到了其广泛的应用场景。本文将探讨Nginx在Docker中的容器化部署和扩展策略&#xff0…...

vscode编译和调试wsl环境的c语言程序

直接f5会报错&#xff0c;提示你改一下json文件 launch.json { “version”: “0.2.0”, “configurations”: [ { “name”: “(gdb) Launch”, “type”: “cppdbg”, “request”: “launch”, “program”: “ w o r k s p a c e F o l d e r / a . o u t " , " …...

(CPU/GPU)粒子继承贴图颜色发射

GetRandomInfo节点(复制贴进scratch pad Scripts) Begin Object Class/Script/NiagaraEditor.NiagaraClipboardContent Name"NiagaraClipboardContent_22" ExportPath/Script/NiagaraEditor.NiagaraClipboardContent"/Engine/Transient.NiagaraClipboardConten…...

【C#】 一个窗体能够显示、最小化、最大化、关闭时分别触发方法

在C#的WPF应用程序中&#xff0c;窗体&#xff08;即继承自System.Windows.Window的类&#xff09;能够通过处理以下事件来响应显示、最小化、最大化和关闭操作&#xff1a; 1.显示&#xff1a; 窗体显示时没有直接对应的事件&#xff0c;但你可以通过覆盖OnLoaded方法或订阅…...

pgsql基本操作

查看已经存在的数据库 postgres# \lList of databasesName | Owner | Encoding | Collate | Ctype | Access privileges ----------------------------------------------------------------------postgres | postgres | UTF8 | C | C | runoobdb …...

3d渲染的常用概念和技术,渲染100邀请码1a12

之前我们介绍了3D渲染的基本原理和流程&#xff0c;这次说下几个常用概念和技术。 3D渲染中涉及到很多专业的概念和技术&#xff0c;它们决定了渲染质量和效果&#xff0c;常用的有以下几个。1、光线追踪 光线追踪是一些专业渲染器&#xff08;如V-Ray和Corona等&#xff09;…...

XML Group端口详解

在XML数据映射过程中&#xff0c;经常需要对数据进行分组聚合操作。例如&#xff0c;当处理包含多个物料明细的XML文件时&#xff0c;可能需要将相同物料号的明细归为一组&#xff0c;或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码&#xff0c;增加了开…...

基于ASP.NET+ SQL Server实现(Web)医院信息管理系统

医院信息管理系统 1. 课程设计内容 在 visual studio 2017 平台上&#xff0c;开发一个“医院信息管理系统”Web 程序。 2. 课程设计目的 综合运用 c#.net 知识&#xff0c;在 vs 2017 平台上&#xff0c;进行 ASP.NET 应用程序和简易网站的开发&#xff1b;初步熟悉开发一…...

抖音增长新引擎:品融电商,一站式全案代运营领跑者

抖音增长新引擎&#xff1a;品融电商&#xff0c;一站式全案代运营领跑者 在抖音这个日活超7亿的流量汪洋中&#xff0c;品牌如何破浪前行&#xff1f;自建团队成本高、效果难控&#xff1b;碎片化运营又难成合力——这正是许多企业面临的增长困局。品融电商以「抖音全案代运营…...

渲染学进阶内容——模型

最近在写模组的时候发现渲染器里面离不开模型的定义,在渲染的第二篇文章中简单的讲解了一下关于模型部分的内容,其实不管是方块还是方块实体,都离不开模型的内容 🧱 一、CubeListBuilder 功能解析 CubeListBuilder 是 Minecraft Java 版模型系统的核心构建器,用于动态创…...

生成 Git SSH 证书

&#x1f511; 1. ​​生成 SSH 密钥对​​ 在终端&#xff08;Windows 使用 Git Bash&#xff0c;Mac/Linux 使用 Terminal&#xff09;执行命令&#xff1a; ssh-keygen -t rsa -b 4096 -C "your_emailexample.com" ​​参数说明​​&#xff1a; -t rsa&#x…...

聊一聊接口测试的意义有哪些?

目录 一、隔离性 & 早期测试 二、保障系统集成质量 三、验证业务逻辑的核心层 四、提升测试效率与覆盖度 五、系统稳定性的守护者 六、驱动团队协作与契约管理 七、性能与扩展性的前置评估 八、持续交付的核心支撑 接口测试的意义可以从四个维度展开&#xff0c;首…...

vue3+vite项目中使用.env文件环境变量方法

vue3vite项目中使用.env文件环境变量方法 .env文件作用命名规则常用的配置项示例使用方法注意事项在vite.config.js文件中读取环境变量方法 .env文件作用 .env 文件用于定义环境变量&#xff0c;这些变量可以在项目中通过 import.meta.env 进行访问。Vite 会自动加载这些环境变…...

Springboot社区养老保险系统小程序

一、前言 随着我国经济迅速发展&#xff0c;人们对手机的需求越来越大&#xff0c;各种手机软件也都在被广泛应用&#xff0c;但是对于手机进行数据信息管理&#xff0c;对于手机的各种软件也是备受用户的喜爱&#xff0c;社区养老保险系统小程序被用户普遍使用&#xff0c;为方…...

推荐 github 项目:GeminiImageApp(图片生成方向,可以做一定的素材)

推荐 github 项目:GeminiImageApp(图片生成方向&#xff0c;可以做一定的素材) 这个项目能干嘛? 使用 gemini 2.0 的 api 和 google 其他的 api 来做衍生处理 简化和优化了文生图和图生图的行为(我的最主要) 并且有一些目标检测和切割(我用不到) 视频和 imagefx 因为没 a…...

Mysql8 忘记密码重置,以及问题解决

1.使用免密登录 找到配置MySQL文件&#xff0c;我的文件路径是/etc/mysql/my.cnf&#xff0c;有的人的是/etc/mysql/mysql.cnf 在里最后加入 skip-grant-tables重启MySQL服务 service mysql restartShutting down MySQL… SUCCESS! Starting MySQL… SUCCESS! 重启成功 2.登…...