STM32学习和实践笔记(4): 分析和理解GPIO_InitTypeDef GPIO_InitStructure (a)

深入分析及学习一下上面这一段代码的构成与含义。

首先,这个GPIO_InitTypeDef GPIO_InitStructure;其实与int a 是完全类似的语法格式以及含义。

GPIO_InitStructure就相当于a这样一个变量。不过从这个变量的名字可以知道,这是一个用于GPIO初始化的结构体类型变量而已。

GPIO_InitTypeDef,就相当于int这样的类型声明。不过很明显的,GPIO_InitTypeDef是一个自定义的数据类型。它到底是一个什么样的类型?从后面的跟的这个GPIO_InitStructure,可以大概猜测它是一个结构体类型。

那么通过右键go to define,找到这个GPIO_InitTypeDef的定义如下:

/** * @brief  GPIO Init structure definition  */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;

很明显这是一个结构体。这个结构体本身没有命名,但是通过 type struct{}GPIO_InitTypeDef的方式,将这个结构体类型起了一个别名GPIO_InitTypeDef,这样定义之后,就可以直接使用GPIO_InitTypeDef作为这个结构体类型的声明。

也就是我前面说的,使用GPIO_InitTypeDef GPIO_InitStructure;其实与int a 是完全类似的语法格式以及含义!

跟int a声明后应该给a 赋值一样,GPIO_InitTypeDef GPIO_InitStructure之后,也需要为这个GPIO_InitStructure结构构体变量指明它的值。而这个结构体变量里有三个成员,所以就要分别为这三个成员指定相应的值。

所以后面的:

    GPIO_InitStructure.GPIO_Pin=LED_PIN; 
    GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
    GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;    

就是给这个结构体变量成员分别赋值。

在这个结构体内,有三个成员变量。它们的每一个也其实与int a 是完全类似的语法格式以及含义。

第一个成员变量是uint16_t GPIO_Pin;  

这个uint16_t,是用这个typedef unsigned short     int uint16_t 语句得到一个别名,其含义就是unsigned short     int,这是一个无符号16位整型数据。

GPIO_Pin则是像int a的a一样的变量名称,通过这个名字我们可以了解到,这个变量表示的是GPIO_Pin的引脚。

通过后面的这条注释语句: /*!< Specifies the GPIO pins to be configured.
                                      This parameter can be any value of @ref GPIO_pins_define */

用GPIO_pins_define查找,这个变量取下面这些值才是有意义,有相应的作用:

/** @defgroup GPIO_pins_define 
  * @{
  */

#define GPIO_Pin_0                 ((uint16_t)0x0001)  /*!< Pin 0 selected */
#define GPIO_Pin_1                 ((uint16_t)0x0002)  /*!< Pin 1 selected */
#define GPIO_Pin_2                 ((uint16_t)0x0004)  /*!< Pin 2 selected */
#define GPIO_Pin_3                 ((uint16_t)0x0008)  /*!< Pin 3 selected */
#define GPIO_Pin_4                 ((uint16_t)0x0010)  /*!< Pin 4 selected */
#define GPIO_Pin_5                 ((uint16_t)0x0020)  /*!< Pin 5 selected */
#define GPIO_Pin_6                 ((uint16_t)0x0040)  /*!< Pin 6 selected */
#define GPIO_Pin_7                 ((uint16_t)0x0080)  /*!< Pin 7 selected */
#define GPIO_Pin_8                 ((uint16_t)0x0100)  /*!< Pin 8 selected */
#define GPIO_Pin_9                 ((uint16_t)0x0200)  /*!< Pin 9 selected */
#define GPIO_Pin_10                ((uint16_t)0x0400)  /*!< Pin 10 selected */
#define GPIO_Pin_11                ((uint16_t)0x0800)  /*!< Pin 11 selected */
#define GPIO_Pin_12                ((uint16_t)0x1000)  /*!< Pin 12 selected */
#define GPIO_Pin_13                ((uint16_t)0x2000)  /*!< Pin 13 selected */
#define GPIO_Pin_14                ((uint16_t)0x4000)  /*!< Pin 14 selected */
#define GPIO_Pin_15                ((uint16_t)0x8000)  /*!< Pin 15 selected */
#define GPIO_Pin_All               ((uint16_t)0xFFFF)  /*!< All pins selected */

#define IS_GPIO_PIN(PIN)   ((((PIN) & (uint16_t)0x00) == 0x00) && ((PIN) != (uint16_t)0x00))

#define IS_GET_GPIO_PIN(PIN)   (((PIN) == GPIO_Pin_0) || \
                              ((PIN) == GPIO_Pin_1) || \
                              ((PIN) == GPIO_Pin_2) || \
                              ((PIN) == GPIO_Pin_3) || \
                              ((PIN) == GPIO_Pin_4) || \
                              ((PIN) == GPIO_Pin_5) || \
                              ((PIN) == GPIO_Pin_6) || \
                              ((PIN) == GPIO_Pin_7) || \
                              ((PIN) == GPIO_Pin_8) || \
                              ((PIN) == GPIO_Pin_9) || \
                              ((PIN) == GPIO_Pin_10) || \
                              ((PIN) == GPIO_Pin_11) || \
                              ((PIN) == GPIO_Pin_12) || \
                              ((PIN) == GPIO_Pin_13) || \
                              ((PIN) == GPIO_Pin_14) || \
                              ((PIN) == GPIO_Pin_15))

也就是当GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0 ; 时,其实就是将对应的该引脚的寄存器地址给了GPIO_InitStructure.GPIO_Pin,这就表示,选中了GPIO_Pin_0来操作!

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

DeepMind联合创始人Demis Hassabis因对人工智能的贡献被授予英国爵士勋章

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

Python深度学习034:cuda的环境如何配置

文章目录 1.安装nvidia cuda驱动CMD中看一下cuda版本:下载并安装cuda驱动2.创建虚拟环境并安装pytorch的torch_cuda3.测试附录1.安装nvidia cuda驱动 CMD中看一下cuda版本: 注意: 红框的cuda版本,是你的显卡能装的最高的cuda版本,所以可以选择低于它的版本。比如我的是11…

keycloak - 鉴权quarkus

目录 一、前言 二、遇到的问题 1、keycloak中配置public访问方式如何配置keycloak 2、keycloak拦截登录后&#xff0c;重定向多次报错&#xff0c;因cookie超长 三、解决问题 1、环境说明 2、对应keycloak public访问方式的keycloak配置 3、解决cookie太长的问题 a、方…

前端二维码生成工具小程序:构建营销神器的技术解析

摘要&#xff1a; 随着数字化营销的不断深入&#xff0c;二维码作为一种快速、便捷的信息传递方式&#xff0c;已经广泛应用于各个领域。本文旨在探讨如何通过前端技术构建一个功能丰富、操作简便的二维码生成工具小程序&#xff0c;为企业和个人提供高效的营销支持。 一、引言…

国宝二抗-没有最全面,只有更全面

博奥龙Biodragon 专业从事各种免疫球蛋白与相应的二抗产品的研发、生产和销售&#xff0c;为您提供最全、最优的二抗相关产品。多种种属、多种标记&#xff0c;您找不到的二抗这里都有&#xff01; 多种种属&#xff08;小鼠、大鼠、豚鼠、人、猪、马、牛、羊、狗、猫、驴、鸡…

如何在 Mac 上恢复已删除的数据

如果您丢失了 Mac 上的数据&#xff0c;请不要绝望。恢复数据比您想象的要容易&#xff0c;并且有很多方法可以尝试。 在 Mac 上遭受数据丢失是每个人都认为永远不会发生在他们身上的事情之一......直到它发生。不过&#xff0c;请不要担心&#xff0c;因为您可以通过多种方法…

有趣的css - 旋转的设置按钮

大家好&#xff0c;我是 Just&#xff0c;这里是「设计师工作日常」&#xff0c;今天分享的是一个会旋转的齿轮设置按钮。 《有趣的css》系列最新实例通过公众号「设计师工作日常」发布。 目录 整体效果核心代码html 代码css 部分代码 完整代码如下html 页面css 样式页面渲染效…

zvt,一个神奇的 Python 库!

更多Python学习内容&#xff1a;ipengtao.com 大家好&#xff0c;今天为大家分享一个神奇的 Python 库 - zvt Github地址&#xff1a;https://github.com/zvtvz/zvt Python在金融数据分析领域有着广泛的应用&#xff0c;而zvt库作为一款强大的金融数据分析工具&#xff0c;为开…

HTTP协议格式详解之首行信息解析

HTTP&#xff08;Hypertext Transfer Protocol&#xff09;是一种用于传输超文本文档的应用层协议&#xff0c;通常用于在客户端和服务器之间传输网页、图片、视频等资源。它是建立在TCP/IP协议栈之上的应用层协议&#xff0c;使用标准的TCP连接来传输数据。HTTP的主要特点包括…

用echarts实现进度条

今天有个需求需要实现类似这种进度条 渐变&#xff0c;指示点&#xff0c;背景这些都比较容易实现&#xff0c;前面这段有个高度逐渐增大的地方卡住了&#xff0c;半天没想到用什么方式去实现&#xff0c;搜了一圈&#xff0c;发现可以用echarts来实现 let icon1 image://data…

AIGC浪潮下,鹅厂新一代前端人的真实工作感受

AIGC 这一时代潮流已然不可阻挡&#xff0c;我们要做的不是慌乱&#xff0c;而是把握住这个时代的机会。本文就和大家一起来探索在 AIGC 下&#xff0c;前端工程师即将面临的挑战和机遇。聊聊从以前到现在&#xff0c;AIGC 给我们带来了怎么样的变化&#xff0c;下一代前端工程…

Towhee

文章目录 关于 Towhee✨ 项目特点&#x1f393; 快速入门流水线预定义流水线自定义流水线 &#x1f680; 核心概念 关于 Towhee Towhee 是一个开源的 embedding 框架&#xff0c;包含丰富的数据处理算法与神经网络模型。通过 Towhee&#xff0c;能够轻松地处理非结构化数据&am…