继续研究《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)
{....}
这个函数有两个形参,这两个都是结构体指针变量,它们对应的值,都是地址。所以可以看到,前面调用这个函数时,都是传过来的地址!
(未完待续!)