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

news/2024/7/5 8:32:59

继续研究《STM32学习和实践笔记(4): 分析和理解GPIO_InitTypeDef GPIO_InitStructure (b)-CSDN博客》中的这个问题:

其实是这样的,首先在正式运行main.c之前,实际运行的是这个启动文件:

这个启动文件是用汇编写的,它实现以下功能:

具体代码在这一处:

启动文件做完前面那些配置之后,才会进入main.c,从main处开始运行。

而main中首先就是LED_Init();

因为main.c中有#include "led.h",所以,编译器知道要到led.c中去执行LED_Init();

而在led.c中中也包含了"led.h",而"led.h"又包含了"stm32f10x.h",所以在led.c中执行LED_Init()中的第一条语句:GPIO_InitTypeDef GPIO_InitStructure时,编译器先到"led.h"中查找这个GPIO_InitTypeDef 到底是什么。它将在"led.h"中包含的"stm32f10x.h"中找到以下这个定义和声明:

** 
  * @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;
 

于是,编译器知道,这是一个结构体并且知道它里面的成员上面的三个。程序继续运行下去,

就是这三条语句:

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

这里仅是给这三个成员赋值而已,还并没有对STM32进行实际的操作。

实际执行操作是接下来的这条语句,也就是这个GPIO_Init函数:

    GPIO_Init(LED_PORT,&GPIO_InitStructure);

这个函数输入两个参数(实参,实际值,这里传过来的是地址):一个是GPIO的端口,这里选择是C端口,即GPIOC(也就是LED_PORT),另一个就是前面那个已给三个成员都赋值了的结构体GPIO_InitStructure。

GPIO_Init函数的原形如下:

void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct)
{....}

这个函数有两个形参,这两个都是结构体指针变量,它们对应的值,都是地址。所以可以看到,前面调用这个函数时,都是传过来的地址!


 (未完待续!)


http://lihuaxi.xjx100.cn/news/2144990.html

相关文章

5.108 BCC工具之virtiostat.py解读

一,工具简介 virtiostat程序用于跟踪virtio设备以分析IO操作和吞吐量。 例如,客户端挂载了一个9pfs,而我们再也无法通过iostat命令获取IO统计信息。 在这种情况下,我们只能从VIRTIO层而不是块层获取统计信息。 示例 二,代码示例 #!/usr/bin/env pythonfrom __future__…

如何通过Spring提供的EL表达式执行bean的属性或方法?

如何通过Spring提供的EL表达式执行bean的属性或方法&#xff1f; 关键两个bean&#xff1a; org.springframework.expression.Expression org.springframework.expression.spel.support.StandardEvaluationContext 实例&#xff1a; import cn.hutool.extra.spring.Spring…

golang微服务框架特性分析及选型

目录 一、微服务框架特性&#xff08;10个&#xff09;包括&#xff1a;Istio、go-zero、go-kit、go-kratos、go-micro、rpcx、kitex、goa、jupiter、dubbo-go、tarsgo 1、特性及使用场景2、比较 二、web框架特性&#xff08;7个&#xff09;包括&#xff1a;gin、fiber、beego…

数据结构——图的应用(最小生成树,最短路径,拓扑排序,关键路径)

目录 1.最小生成树 1.概念回顾——生成树 2.最小生成树概念 2.构造最小生成树 1.MST性质 2.Prim算法 3.Kruskal 算法 4.两种算法比较 3.最短路径 1.两点间最短路径 2.某源点到其它各点最短路径 3.单源最短路径——用Dijkstra算法 4.所有顶点间的最短路径…

SpringCloud Hystrix 服务熔断、服务降级防止服务雪崩

文章目录 SpringCloud Hystrix 熔断器、服务降级防止服务雪崩需求背景引入依赖启动类加Hystrix注解接口配置熔断常规配置超时断开错误率熔断请求数熔断限流 可配置项HystrixCommand.Setter参数Command Properties 服务降级 SpringCloud Hystrix 熔断器、服务降级防止服务雪崩 H…

Spring Boot Mockito (二)

Spring Boot Mockito (二) 基于第一篇Spring Boot Mockito (一) 这篇文章主要是讲解Spring boot 与 Mockito 集成持久层接口层单元测试。 1. 引入数据库 h2及其依赖包 <dependency><groupId>com.h2database</groupId><artifactId>h2</artifactId…

目标检测——车牌数据集

一、重要性及意义 交通安全与管理&#xff1a;车牌检测和识别技术有助于交通管理部门快速、准确地获取车辆信息&#xff0c;从而更有效地进行交通监控和执法。例如&#xff0c;在违规停车、超速行驶等交通违法行为中&#xff0c;该技术可以帮助交警迅速锁定违规车辆&#xff0…

Francek Chen 的128天创作纪念日

目录 Francek Chen 的128天创作纪念日机缘收获日常成就憧憬 Francek Chen 的128天创作纪念日 Francek Chen 的个人主页 机缘 不知不觉的加入CSDN已有两年时间了&#xff0c;最初我第一次接触CSDN技术社区是在2022年4月的时候&#xff0c;通过学长给我们推荐了几个IT社区平台&a…