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

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

其实是这样的,首先在正式运行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)
{....}

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


 (未完待续!)

上一篇:sql语句如何在MySQL中执行?


下一篇:ZooKeeper 负载均衡和 Nginx 负载均衡的区别