首先还是我们点灯的工程文件,本文我主要介绍GPIO相关库函数的使用。
打开GPIO相关文件
在Drivers/STM32F1xx_HAL_Driver文件夹下找到stm32f1xx_hal_gpio.c文件,双击即可打开。
我们需要看的部分
这个文件中,我们只需要看How to use this driver部分。这部分介绍了GPIO的HAL库使用。
一些不重要的部分我就不说了,会讲解的部分在下图标号了。其他部分都不太重要,想了解的可以用翻译软件翻译一下。
HAL_GPIO_ReadPin()
这个是引脚为输入才使用的函数,我们点亮LED为输出,所以用不了。就先不介绍了,之后在按键扫描的时候说。
HAL_GPIO_WritePin()
函数声明
void HAL_GPIO_WritePin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState)
GPIOx
这个是设置为哪个端口,现在我们是想让PB5输出,所以应该在函数中传入GPIOB。
可选参数如下
#define GPIOA ((GPIO_TypeDef *)GPIOA_BASE) #define GPIOB ((GPIO_TypeDef *)GPIOB_BASE) #define GPIOC ((GPIO_TypeDef *)GPIOC_BASE) #define GPIOD ((GPIO_TypeDef *)GPIOD_BASE) #define GPIOE ((GPIO_TypeDef *)GPIOE_BASE) #define GPIOF ((GPIO_TypeDef *)GPIOF_BASE) #define GPIOG ((GPIO_TypeDef *)GPIOG_BASE)
GPIO_Pin
这个是设置让哪个引脚输出,现在我们是想让PB5输出,所以应该在函数中传入GPIO_PIN_5。
可选参数如下。
注意一下,GPIO_PIN_All就是同时控制PIN0到PIN15共16个引脚。
#define GPIO_PIN_0 ((uint16_t)0x0001) /* Pin 0 selected */ #define GPIO_PIN_1 ((uint16_t)0x0002) /* Pin 1 selected */ #define GPIO_PIN_2 ((uint16_t)0x0004) /* Pin 2 selected */ #define GPIO_PIN_3 ((uint16_t)0x0008) /* Pin 3 selected */ #define GPIO_PIN_4 ((uint16_t)0x0010) /* Pin 4 selected */ #define GPIO_PIN_5 ((uint16_t)0x0020) /* Pin 5 selected */ #define GPIO_PIN_6 ((uint16_t)0x0040) /* Pin 6 selected */ #define GPIO_PIN_7 ((uint16_t)0x0080) /* Pin 7 selected */ #define GPIO_PIN_8 ((uint16_t)0x0100) /* Pin 8 selected */ #define GPIO_PIN_9 ((uint16_t)0x0200) /* Pin 9 selected */ #define GPIO_PIN_10 ((uint16_t)0x0400) /* Pin 10 selected */ #define GPIO_PIN_11 ((uint16_t)0x0800) /* Pin 11 selected */ #define GPIO_PIN_12 ((uint16_t)0x1000) /* Pin 12 selected */ #define GPIO_PIN_13 ((uint16_t)0x2000) /* Pin 13 selected */ #define GPIO_PIN_14 ((uint16_t)0x4000) /* Pin 14 selected */ #define GPIO_PIN_15 ((uint16_t)0x8000) /* Pin 15 selected */ #define GPIO_PIN_All ((uint16_t)0xFFFF) /* All pins selected */
PinState
这个是设置指定引脚输出高电平还是低电平。
GPIO_PIN_RESET //引脚输出低电平 GPIO_PIN_SET //引脚输出高电平
HAL_GPIO_TogglePin()
让指定引脚电平反转,意思就是如果指定的引脚原来是高电平,使用这个函数之后就是低电平。如果原来是高电平,使用这个函数之后就是低电平。
函数声明
void HAL_GPIO_TogglePin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin)
GPIOx和GPIO_Pin
同上
HAL_GPIO_LockPin()
这个是用于锁死指定引脚输出的。如果指定引脚为高电平,使用这个函数之后,引脚只能为高电平。就算你之后调用HAL_GPIO_TogglePin()或者HAL_GPIO_WritePin()更改他的输出,也做不到。
改引脚直至程序复位(按下复位键,或者拔下供电口重新插上),才会解锁。
函数声明
HAL_StatusTypeDef HAL_GPIO_LockPin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin)
GPIOx和GPIO_Pin
同上
返回值
我们看这个函数的返回值,如果锁死成功返回HAL_OK。锁死失败返回HAL_ERROR
if ((uint32_t)(GPIOx->LCKR & GPIO_LCKR_LCKK)) { return HAL_OK; } else { return HAL_ERROR; }
延时函数
HAL自带延时函数HAL_Delay(x)。单位为ms
实验
现在我们知道了这几个函数了。HAL_GPIO_ReadPin()用不了,HAL_GPIO_LockPin()新手不建议使用。我们现在分别使用HAL_GPIO_TogglePin()和HAL_GPIO_WritePin()函数实现。
注意:这里的LED_R_GPIO_Port是GPIOB,LED_R_Pin是GPIO_PIN_5
详情请看:STM32CubeMX新建工程并点亮一个LED的 新建工程->User Label部分
使用HAL_GPIO_TogglePin()实现闪烁
我只提供while(1)中程序,其他地方不用改动。
while (1) { /* USER CODE END WHILE */ HAL_GPIO_TogglePin(LED_R_GPIO_Port, LED_R_Pin); HAL_Delay(1000); /* USER CODE BEGIN 3 */ }
使用HAL_GPIO_WritePin()实现闪烁
while (1) { /* USER CODE END WHILE */ HAL_GPIO_WritePin(LED_R_GPIO_Port, LED_R_Pin, GPIO_PIN_SET); HAL_Delay(1000); HAL_GPIO_WritePin(LED_R_GPIO_Port, LED_R_Pin, GPIO_PIN_RESET); HAL_Delay(1000); /* USER CODE BEGIN 3 */ }