目录
一.配置GPIO初始化函数的步骤
①定义GPIO初始化变量-GPIO_InitTypeDef
②使能对应GPIO时钟-_HAL_RCC_GPIOx_CLK_ENABLE()
③配置GPIO状态-HAL_GPIO_Init()
二.有关GPIO的HAL函数
①HAL_GPIO_ReadPin-读
②HAL_GPIO_WritePin-写
③HAL_GPIO_TogglePin-倒置
一.配置GPIO初始化函数的步骤
- 如果使用Cube预先进行设置则不需要我们去写GPIO的初始化函数
- 但是为了以防万一,我们需要了解如何写。如下:
static void MX_GPIO_Init(void)
{
GPIO_InitTypeDef GPIO_InitStruct = {0};
/* GPIO Ports Clock Enable */
__HAL_RCC_GPIOC_CLK_ENABLE();
__HAL_RCC_GPIOF_CLK_ENABLE();
__HAL_RCC_GPIOD_CLK_ENABLE();
/*Configure GPIO pin Output Level */
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13|GPIO_PIN_14|GPIO_PIN_15|GPIO_PIN_8
|GPIO_PIN_9|GPIO_PIN_10|GPIO_PIN_11|GPIO_PIN_12, GPIO_PIN_RESET);
/*Configure GPIO pin Output Level */
HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_RESET);
/*Configure GPIO pins : PC13 PC14 PC15 PC8
PC9 PC10 PC11 PC12 */
GPIO_InitStruct.Pin = GPIO_PIN_13|GPIO_PIN_14|GPIO_PIN_15|GPIO_PIN_8
|GPIO_PIN_9|GPIO_PIN_10|GPIO_PIN_11|GPIO_PIN_12;
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);
/*Configure GPIO pin : PD2 */
GPIO_InitStruct.Pin = GPIO_PIN_2;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(GPIOD, &GPIO_InitStruct);
}
①定义GPIO初始化变量-GPIO_InitTypeDef
GPIO_InitTypeDef GPIO_InitStruct = {0};
②使能对应GPIO时钟-_HAL_RCC_GPIOx_CLK_ENABLE()
__HAL_RCC_GPIOC_CLK_ENABLE();
__HAL_RCC_GPIOF_CLK_ENABLE();
__HAL_RCC_GPIOD_CLK_ENABLE();
③配置GPIO状态-HAL_GPIO_Init()
/*Configure GPIO pin : PD2 */
GPIO_InitStruct.Pin = GPIO_PIN_2;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(GPIOD, &GPIO_InitStruct);
- 查看结构体GPIO_InitTypeDef的定义,如下:
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;
-
-
- Pin-GPIO的引脚-‘GPIO_Pin_x’
- Mode-GPIO的模式
#define GPIO_MODE_INPUT (0x00000000U) /*!<输入模式 */
#define GPIO_MODE_OUTPUT_PP (0x00000001U) /*!<推挽输出 */
#define GPIO_MODE_OUTPUT_OD (0x00000011U) /*!<开漏输出 */
#define GPIO_MODE_AF_PP (0x00000002U) /*!<复用推挽输出 */
#define GPIO_MODE_AF_OD (0x00000012U) /*!<复用开漏输出 */
#define GPIO_MODE_ANALOG (0x00000003U) /*!<模拟模式 */
#define GPIO_MODE_INPUT (0x00000000U) /*!<输入模式 */
#define GPIO_MODE_OUTPUT_PP (0x00000001U) /*!<推挽输出 */
#define GPIO_MODE_OUTPUT_OD (0x00000011U) /*!<开漏输出 */
#define GPIO_MODE_AF_PP (0x00000002U) /*!<复用推挽输出 */
#define GPIO_MODE_AF_OD (0x00000012U) /*!<复用开漏输出 */
#define GPIO_MODE_ANALOG (0x00000003U) /*!<模拟模式 */
#define GPIO_SPEED_FREQ_LOW (0x00000000U) /*!<5Mhz */
#define GPIO_SPEED_FREQ_MEDIUM (0x00000001U) /*!<5 MHz to 25 MHz*/
#define GPIO_SPEED_FREQ_HIGH (0x00000002U) /*!<25 MHz to 50 MHz*/
#define GPIO_SPEED_FREQ_VERY_HIGH (0x00000003U) /*!<50 MHz to 120 MHz*/
- 步骤其实和STM32F10x系列使用标准库的GPIO初始化相同,触类旁通
二.有关GPIO的HAL函数
GPIO_PinState HAL_GPIO_ReadPin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin);
void HAL_GPIO_WritePin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState);
void HAL_GPIO_TogglePin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin);
HAL_StatusTypeDef HAL_GPIO_LockPin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin);
void HAL_GPIO_EXTI_IRQHandler(uint16_t GPIO_Pin);
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin);
下面介绍常用的GPIO函数(其实没什么必要,大致明白即可,实际上都是对寄存器进行操作)
①HAL_GPIO_ReadPin-读
/**
* @brief Read the specified input port pin.
* @param GPIOx where x can be (A..G) to select the GPIO peripheral for STM32G4xx family
* @param GPIO_Pin specifies the port bit to read.
* This parameter can be any combination of GPIO_PIN_x where x can be (0..15).
* @retval The input port pin value.
*/
GPIO_PinState HAL_GPIO_ReadPin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin)
{
GPIO_PinState bitstatus;
/* Check the parameters */
assert_param(IS_GPIO_PIN(GPIO_Pin));
if ((GPIOx->IDR & GPIO_Pin) != 0x00U)
{
bitstatus = GPIO_PIN_SET;
}
else
{
bitstatus = GPIO_PIN_RESET;
}
return bitstatus;
}
- 简介brief写此函数用于读取选择的输入引脚
- 至于入口参数十分简单不用赘述
- 看函数主体可见实际是读取GPIO的寄存器IDR即Input Data Register的值,与STM32F10x的标准库函数相同
②HAL_GPIO_WritePin-写
/**
* @brief Set or clear the selected data port bit.
*
* @note This function uses GPIOx_BSRR and GPIOx_BRR registers to allow atomic read/modify
* accesses. In this way, there is no risk of an IRQ occurring between
* the read and the modify access.
*
* @param GPIOx where x can be (A..G) to select the GPIO peripheral for STM32G4xx family
* @param GPIO_Pin specifies the port bit to be written.
* This parameter can be any combination of GPIO_PIN_x where x can be (0..15).
* @param PinState specifies the value to be written to the selected bit.
* This parameter can be one of the GPIO_PinState enum values:
* @arg GPIO_PIN_RESET: to clear the port pin
* @arg GPIO_PIN_SET: to set the port pin
* @retval None
*/
void HAL_GPIO_WritePin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState)
{
/* Check the parameters */
assert_param(IS_GPIO_PIN(GPIO_Pin));
assert_param(IS_GPIO_PIN_ACTION(PinState));
if (PinState != GPIO_PIN_RESET)
{
GPIOx->BSRR = (uint32_t)GPIO_Pin;
}
else
{
GPIOx->BRR = (uint32_t)GPIO_Pin;
}
}
③HAL_GPIO_TogglePin-倒置
|