文章目录
- 前言
- 一、如何生成gpio.c文件
- 二、gpio.c内部实现
- 总结
前言
这篇文章将带大家了解一下cubeMX自动生成的gpio.c文件。
一、如何生成gpio.c文件
在LED这篇文章中我们配置了控制LED的GPIO引脚,选择了PD2和PC8 PC9这三个引脚,并且将他们都设置为了输出引脚。
我们就只在cubeMX里面勾选了这些引脚并进行了设置,大家都知道自己去写GPIO引脚的初始化是有点复杂的,那么在cubeMX里面配置后就不需要写GPIO引脚的初始化代码了吗?其实使用cubeMX这个软件勾选这些引脚后,生成的工程里面已经帮我们完成了GPIO的配置。
勾选这个选项为每个模块生成独立的.c和.h文件,我们配置了GPIO相关的信息那么cubeMX就会为我们自动生成gpio.c和gpio.h这两个文件了。
二、gpio.c内部实现
在keil5左边可以看到生成的gpio.c文件。
进入void MX_GPIO_Init(void)这个函数查看GPIO引脚的初始化
GPIO初始化结构体
这个结构体里面包含了GPIO的各种参数设置,GPIO的引脚、GPIO的模式、速度等…
GPIO_InitTypeDef GPIO_InitStruct = {0};
typedef struct
{
uint32_t Pin; /*!< Specifies the GPIO pins to be configured.
This parameter can be any value of @ref GPIO_pins */
uint32_t Mode; /*!< Specifies the operating mode for the selected pins.
This parameter can be a value of @ref GPIO_mode */
uint32_t Pull; /*!< Specifies the Pull-up or Pull-Down activation for the selected pins.
This parameter can be a value of @ref GPIO_pull */
uint32_t Speed; /*!< Specifies the speed for the selected pins.
This parameter can be a value of @ref GPIO_speed */
uint32_t Alternate; /*!< Peripheral to be connected to the selected pins
This parameter can be a value of @ref GPIOEx_Alternate_function_selection */
} GPIO_InitTypeDef;
使能GPIO引脚的时钟
/* GPIO Ports Clock Enable */
__HAL_RCC_GPIOF_CLK_ENABLE();
__HAL_RCC_GPIOC_CLK_ENABLE();
__HAL_RCC_GPIOA_CLK_ENABLE();
__HAL_RCC_GPIOD_CLK_ENABLE();
设置GPIO引脚的电平状态,这里为什么是RESET呢而不是SET,因为我们在cubeMX里面只设置了这些引脚作为输出引脚,其他的并没有设置,所以这些引脚默认会输出低电平。
/*Configure GPIO pin Output Level */
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_8|GPIO_PIN_9, GPIO_PIN_RESET);
cubeMX引脚默认设置:
通过GPIO Output Level这个选项可以知道这个引脚默认就被设置为低电平了。
引脚的一些配置
HAL_GPIO_Init这个函数就是将下列这些设置好的参数都设置进GPIO。
/*Configure GPIO pins : PC8 PC9 */
GPIO_InitStruct.Pin = GPIO_PIN_8|GPIO_PIN_9;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;//配置为推挽输出模式
GPIO_InitStruct.Pull = GPIO_NOPULL;//无上拉电阻
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;//低速模式
HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);//将这些设置好的参数设置进GPIO
总结
大家掌握了这个gpio.c文件后就可以不用去cubeMX里面修改这些引脚的输出电平等信息了。
初学者对于这些函数也不是很熟悉,告诉大家一个技巧可以直接在gpio.c里面复制参考自动生成的代码来写。