以下内容全部来自正点原子,本人只是对主要知识点进行整理,方便以后查看。
一、hal库初始化
使用HAL库需要先初始化HAL库
HAL_Init();
二、串口配置相关函数和参数(hal库)
2.1串口使能
使用串口之前,需要先对串口时钟使能,对GPIOx口使能函数(x为具体串口,使用的时候要根据情况修改):
__HAL_RCC_GPIOx_CLK_ENABLE();
比如对F口使能就是:
__HAL_RCC_GPIOF_CLK_ENABLE();
2.2配置特定串口以及工作模式
hal库配置串口初始化的函数为:
void HAL_GPIO_Init(GPIO_TypeDef *GPIOx, GPIO_InitTypeDef *GPIO_Init);
形参 1 GPIO_TypeDef *GPIOx是端口号,配置哪个端口就使用哪个串口即可,比如配置F串口就写成:
void HAL_GPIO_Init(GPIOF, GPIO_InitTypeDef *GPIO_Init);
形参 2 GPIO_InitTypeDef *GPIO_Init是GPIO_InitTypeDef 类型的结构体变量,其定义如下:
typedef struct
{
uint32_t Pin; /* 引脚号 */
uint32_t Mode; /* 模式设置 */
uint32_t Pull; /* 上拉下拉设置 */
uint32_t Speed; /* 速度设置 */
uint32_t Alternate; /* 复用功能 */
} GPIO_InitTypeDef;
Pin 表示引脚号,范围:GPIO_PIN_0 到 GPIO_PIN_15,另外还有 GPIO_PIN_All 和 GPIO_PIN_MASK 可选。
Mode 是 GPIO 的模式选择,有以下选择项:
代码 | 功能 |
GPIO_MODE_INPUT | 输入模式 |
GPIO_MODE_OUTPUT_PP | 推挽输出 |
GPIO_MODE_OUTPUT_OD | 开漏输出 |
GPIO_MODE_AF_PP | 推挽式复用 |
GPIO_MODE_AF_INPUT | GPIO_MODE_INPUT |
GPIO_MODE_ANAOG | 模拟模式 |
GPIO_MODE_IT_RISING | 外部中断,上升沿触发检测 |
GPIO_MODE_IT_FALLING | 外部中断,下降沿触发检测 |
GPIO_MODE_IT_RISING_FALLING | 外部中断,上升和下降双沿触发检测 |
GPIO_MODE_EVT_RISING | 外部事件,上升沿触发检测 |
GPIO_MODE_EVT_FALLING | 外部事件,下降沿触发检测 |
GPIO_MODE_EVT_RISING_FALLING | 外部事件,上升和下降双沿触发检测 |
不同模式的具体介绍可以查看:(此处为占位符)
Pull 用于配置上下拉电阻,有以下选择项:
代码 | 功能 |
GPIO_NOPULL | 无上下拉 |
GPIO_PULLUP | 上拉 |
GPIO_PULLDOWN | 下拉 |
Speed 用于配置 GPIO 的速度,有以下选择项:
代码 | 功能 |
GPIO_SPEED_FREQ_LOW | 低速 |
GPIO_SPEED_FREQ_MEDIUM | 中速 |
GPIO_SPEED_FREQ_HIGH | 高速 |
Alternate 用于配置具体的复用功能,不同的 GPIO 口可以复用的功能不同,不使用串口的复用功能时直接不设置此参数即可
2.3串口高低电平设定函数
对串口进行高低电平写操作用函数:
void HAL_GPIO_WritePin(GPIO_TypeDef *GPIOx,uint16_t GPIO_Pin,GPIO_PinState PinState);
第一个参数为端口号,第二参数为引脚号,参数三有两个形式:
GPIO_PIN_SET //表示高电平
GPIO_PIN_RESET //表示低电平
比如想要对F端口的10引脚设定高电平就用代码:
HAL_GPIO_WritePin(GPIOF,GPIO_PIN_10,GPIO_PIN_SET);
对串口的进行高低电平反转操作用:
void HAL_GPIO_TogglePin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin);
例子:
HAL_GPIO_TogglePin(GPIOF, GPIO_PIN_10);
三、练习
假设在stm32的F端口的10引脚接有一个LED,当引脚输出高电平时LED亮,输出低电平LED灭,现在用HAL函数库写一个代码,控制LED的亮和灭。
#include "stm32f4xx.h"
#include "core_cm4.h"
#include "stm32f4xx_hal.h"
#include "stdio.h"
void led_init(void) /* 对LED串口进行初始化*/
{
GPIO_InitTypeDef gpio_init_struct; /* 定义结构体 */
gpio_init_struct.Pin = GPIO_PIN_10; /* LED引脚 */
gpio_init_struct.Mode = GPIO_MODE_OUTPUT_PP; /* 推挽输出 */
gpio_init_struct.Pull = GPIO_PULLUP; /* 上拉 */
gpio_init_struct.Speed = GPIO_SPEED_FREQ_HIGH; /* 高速 */
HAL_GPIO_Init(GPIOF, &gpio_init_struct); /* 初始化LED引脚 */
}
void main(void)
{
HAL_Init(); /* 初始化HAL库 */
__HAL_RCC_GPIOF_CLK_ENABLE(); /* 使能F端口时钟 */
led_init(); /* 对LED串口进行初始化*/
while(1)
{
/* 对LED的引脚设定为高电平,点亮LED */
HAL_GPIO_WritePin(GPIOF,GPIO_PIN_10,GPIO_PIN_SET);
delay_ms(500); /* 延迟500ms 此函数在后面才能学到 */
/* 对LED的引脚进行反转,熄灭LED */
HAL_GPIO_TogglePin(GPIOF, GPIO_PIN_10);
delay_ms(500);
}
}
delay_ms(500); 在后面时钟才能学到,这里只是表示一下。