STM32F1 HAL库实战开发
提示:这里是 STM32F1 HAL 库实战开发的实验案例之一
提示:以下是本篇文章正文内容,下面案例可供参考
GPIO 输出
一、继电器引脚电平输出
继电器的控制是通过 ULN2003A 芯片控制的,Double Pi 开发板集成了一个继电器, 给 ULN2003A 低电平,ULN2003A 输出高电平,给 ULN2003A 高电平,ULN2003A输出低电平,所以当 STM32 引脚输出低电平时,ULN2003A 应该是高电平,电路是将ULN2003A 接入了 5V 电源,那么 ULN2003A 应该输出 5V 到继电器,让继电器开始工作。
二、GPIO 外设结构体
HAL 库为每个外设(GPIO 除外)创建了两个结构体,一个是外设初始化结构体,一个是外设句柄结构体,其中 GPIO 没有句柄结构体。这两个结构体都是定义在外设对应的驱动头文件中,比如 stm32f1xx_hal_usart.h 文件。初始化结构一般是做为句柄结构体的一个成员通过指针被引用,而句柄结构体则在外设HAL 函数库实现被使用,比如在 stm32f1xx_hal_usart.c 文件。这两个结构体内容几乎包括了外设的所有可选属性,理解这两个结构体内容对我们编程非常有帮助。
GPIO 外设只有一个初始化结构体,没有句柄结构体,所以 GPIO 初始化结构体直接在stm32f1xx_hal_gpio.c文件中与相关初始化函数配合使用完成GPIO 外设初始化配置。HAL 库 GPIO 结构体如图6:
Pin:引脚编号选择,一个 GPIO 外设有 16 个引脚可选,这里根据电路原理图选择目标引脚,参数可选:GPIO_PIN_0、…、GPIO_PIN_15 和 GPIO_PIN_ALL。很多时候我们可以使用或运算选择多个:GPIO_PIN_0|GPIO_PIN_4。
Mode:引脚工作模式选择,前面内容介绍了引脚有八种基本工作模式,选择结合到具体的外设可以有 13 种模式可选,GPIO 引脚工作模式选择如图 7:
Pull:上拉或者下拉选择,用于输入模式,可选:GPIO_NOPULL:不上下来;GPIO_PULLUP:使能上拉;GPIO_PULLDOWN:使能下拉。
Speed:引脚最大输出速度,可选:GPIO_SPEED_FREQ_LOW:低速(2MHz);中速(10MHz);高速(50MHz)。
三、GPIO 编程流程分析
(1) 使能 GPIO 端口时钟;
__HAL_RCC_GPIOB_CLK_ENABLE();
(2)初始化 GPIO 引脚,即为 GPIO 初始化结构体成员赋值,并调用HAL_GPIO_Init 函数完成初始化配置;
GPIO_InitStruct.Pin = GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3
|GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
(3)根据项目要求控制引脚输出高低电平。
HAL 库对引脚操作的函数有:
GPIO_PinState HAL_GPIO_ReadPin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin);
*@简介 读取指定的输入端口引脚。
*@参数 GPIOx:其中 x 可以是(A-G,取决于使用的设备)来选择 GPIO 外围设备
*@参数 GPIO_Pin:指定要读取的端口位。
*此参数可以是 GPIO_PIN_x,其中 x 可以是(0..15)。
*@返回值 输入端口引脚值。
void HAL_GPIO_WritePin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin,
GPIO_PinState PinState);
*@简介 设置或清除所选数据端口位。
*@注意:此函数使用 GPIOx_BSRR 寄存器允许原子读取/修改,这样,在读取和修
改访问之间就不会出现 IRQ 风险。
*读取和修改访问。
*@参数 GPIOx:其中 x 可以是(A-G,取决于使用的设备)来选择 GPIO 外围设备
*@参数 GPIO_Pin:指定要写入的端口位。
*此参数可以是 gpio_pin_x 中的一个,其中 x 可以是(0..15)。
*@参数 pinstate:指定要写入所选位的值。
*此参数可以是 gpio\u pinstate 枚举值之一:
*@arg GPIO_PIN_RESET:清除端口引脚
*@arg GPIO_PIN_SET:设置端口引脚
*@返回值 无
void HAL_GPIO_TogglePin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin);
*@简介 反转指定的 GPIO 引脚状态
*@参数 GPIOx:其中 x 可以是(A-G,取决于使用的设备)来选择 GPIO 外围设备
*@参数 GPIO_Pin:指定要切换的管脚。
*@返回值 无