当前位置: 首页 > 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;…...

Python爬虫实战:研究MechanicalSoup库相关技术

一、MechanicalSoup 库概述 1.1 库简介 MechanicalSoup 是一个 Python 库,专为自动化交互网站而设计。它结合了 requests 的 HTTP 请求能力和 BeautifulSoup 的 HTML 解析能力,提供了直观的 API,让我们可以像人类用户一样浏览网页、填写表单和提交请求。 1.2 主要功能特点…...

未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?

编辑&#xff1a;陈萍萍的公主一点人工一点智能 未来机器人的大脑&#xff1a;如何用神经网络模拟器实现更智能的决策&#xff1f;RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战&#xff0c;在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…...

Linux云原生安全:零信任架构与机密计算

Linux云原生安全&#xff1a;零信任架构与机密计算 构建坚不可摧的云原生防御体系 引言&#xff1a;云原生安全的范式革命 随着云原生技术的普及&#xff0c;安全边界正在从传统的网络边界向工作负载内部转移。Gartner预测&#xff0c;到2025年&#xff0c;零信任架构将成为超…...

基于Docker Compose部署Java微服务项目

一. 创建根项目 根项目&#xff08;父项目&#xff09;主要用于依赖管理 一些需要注意的点&#xff1a; 打包方式需要为 pom<modules>里需要注册子模块不要引入maven的打包插件&#xff0c;否则打包时会出问题 <?xml version"1.0" encoding"UTF-8…...

大模型多显卡多服务器并行计算方法与实践指南

一、分布式训练概述 大规模语言模型的训练通常需要分布式计算技术,以解决单机资源不足的问题。分布式训练主要分为两种模式: 数据并行:将数据分片到不同设备,每个设备拥有完整的模型副本 模型并行:将模型分割到不同设备,每个设备处理部分模型计算 现代大模型训练通常结合…...

网络编程(UDP编程)

思维导图 UDP基础编程&#xff08;单播&#xff09; 1.流程图 服务器&#xff1a;短信的接收方 创建套接字 (socket)-----------------------------------------》有手机指定网络信息-----------------------------------------------》有号码绑定套接字 (bind)--------------…...

腾讯云V3签名

想要接入腾讯云的Api&#xff0c;必然先按其文档计算出所要求的签名。 之前也调用过腾讯云的接口&#xff0c;但总是卡在签名这一步&#xff0c;最后放弃选择SDK&#xff0c;这次终于自己代码实现。 可能腾讯云翻新了接口文档&#xff0c;现在阅读起来&#xff0c;清晰了很多&…...

代码规范和架构【立芯理论一】(2025.06.08)

1、代码规范的目标 代码简洁精炼、美观&#xff0c;可持续性好高效率高复用&#xff0c;可移植性好高内聚&#xff0c;低耦合没有冗余规范性&#xff0c;代码有规可循&#xff0c;可以看出自己当时的思考过程特殊排版&#xff0c;特殊语法&#xff0c;特殊指令&#xff0c;必须…...

C语言中提供的第三方库之哈希表实现

一. 简介 前面一篇文章简单学习了C语言中第三方库&#xff08;uthash库&#xff09;提供对哈希表的操作&#xff0c;文章如下&#xff1a; C语言中提供的第三方库uthash常用接口-CSDN博客 本文简单学习一下第三方库 uthash库对哈希表的操作。 二. uthash库哈希表操作示例 u…...

云安全与网络安全:核心区别与协同作用解析

在数字化转型的浪潮中&#xff0c;云安全与网络安全作为信息安全的两大支柱&#xff0c;常被混淆但本质不同。本文将从概念、责任分工、技术手段、威胁类型等维度深入解析两者的差异&#xff0c;并探讨它们的协同作用。 一、核心区别 定义与范围 网络安全&#xff1a;聚焦于保…...