通用外设驱动模型(四步法)
1、初始化
时钟设置、参数设置、IO设置、中断设置(开中断、设NVIC)
2、读函数(可选)
从外设读取数据(可选)
3、写函数(可选)
往外设写入数据(可选)
4、中断服务函数(可选)
根据中断标志,处理外设各种中断事务(可选)
GPIO配置步骤
1.使能时钟
__HAL_RCC_GPIOx_CLK_ENABLE()
//小写的x代表A、B、C等等
//宏
2.设置工作模式(八种)
HAL_GPIO_Init()
//函数
3.设置输出状态(可选)
HAL_GPIO_WritePin()
HAL_GPIO_TogglePin()
//函数
4.读取输入状态(可选)
HAL_GPIO_ReadPin()
//函数
HAL库驱动函数 | 主要寄存器 | 功能 |
---|---|---|
__HAL_RCC_GPIOx_CLK_ENABLE() | F:RCC_APB2ENR F4:RCC_AHB1ENR F7:RCC_AHB1ENR H7:RCC_AHB4ENR | 开启GPIO时钟 |
HAL_GPIO_Init(…) | F1:CRL、CRH、ODR F4/F7/H7:MODER、OTYPER、 OSPEEDR、PUPDR | 初始化GPIO |
HAL_GPIO_WritePin(…) | BSRR | 控制IO输出高/低电平 |
HAL_GPIO_TogglePin(…) | BSRR | 每次调用IO输出电平翻转一次 |
HAL_GPIO_ReadPin(…) | IDR | 读取IO电平 |
一、宏__HAL_RCC_GPIOx_CLK_ENABLE()
//stm32f1xx_hal_rcc.h
#define __HAL_RCC_GPIOA_CLK_ENABLE() do { \
__IO uint32_t tmpreg; \
SET_BIT(RCC->APB2ENR, RCC_APB2ENR_IOPAEN);\
/* Delay after an RCC peripheral clock enabling */\
tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_IOPAEN);\
UNUSED(tmpreg); \
} while(0U)
//stm32f1xx.h
#define SET_BIT(REG, BIT) ((REG) |= (BIT))
//第一个参数RCC->APB2ENR,主要寄存器
//第二个参数RCC_APB2ENR_IOPAEN, 1<<2 1左移两位
//stm32f103xe.h
#define RCC_APB2ENR_IOPAEN_Pos (2U)
#define RCC_APB2ENR_IOPAEN_Msk (0x1UL << RCC_APB2ENR_IOPAEN_Pos) /*!< 0x00000004 */
// 寄存器 |= 1<<2,也就是将寄存器的位2设置为1
//APB2 外设时钟使能寄存器
查看手册中APB2第二个位,为1表示IO端口A时钟开启
二、void HAL_GPIO_Init(…)函数
声明
void HAL_GPIO_Init(GPIO_TypeDef *GPIOx, GPIO_InitTypeDef *GPIO_Init)
函数描述
用于配置GPIO功能模式,还可以设置EXTI功能
函数形参
形参1是端口号,可以有以下的选择
#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)
形参2是GPIO_InitYypeDef类型的结构体变量,其定义如下:
typedef struct
{
uint32_t Pin; /* 引脚号 */
uint32_t Mode; /* 模式设置 */
uint32_t Pull; /* 上拉下拉设置 */
uint32_t Speed; /* 速度设置 */
} GPIO_InitTypeDef;
成员 Pin 表示引脚号,范围:GPIO_PIN_0 到 GPIO_PIN_15,另外还有 GPIO_PIN_All 和
GPIO_PIN_MASK 可选。
成员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_AF_INPUT GPIO_MODE_INPUT
#define GPIO_MODE_ANALOG (0x00000003U) /* 模拟模式 */
#define GPIO_MODE_IT_RISING (0x10110000u) /* 外部中断,上升沿触发检测 */
#define GPIO_MODE_IT_FALLING (0x10210000u) /* 外部中断,下降沿触发检测 */
/* 外部中断,上升和下降双沿触发检测 */
#define GPIO_MODE_IT_RISING_FALLING (0x10310000u)
#define GPIO_MODE_EVT_RISING (0x10120000U) /*外部事件,上升沿触发检测 */
#define GPIO_MODE_EVT_FALLING (0x10220000U) /*外部事件,下降沿触发检测 */
/* 外部事件,上升和下降双沿触发检测 */
#define GPIO_MODE_EVT_RISING_
成员Pull用于配置上下拉电阻,有以下选择项:
#define GPIO_NOPULL (0x00000000U) /* 无上下拉 */
#define GPIO_PULLUP (0x00000001U) /* 上拉 */
#define GPIO_PULLDOWN (0x00000002U) /* 下拉 */
成员 Speed 用于配置 GPIO 的速度,有以下选择项:
#define GPIO_SPEED_FREQ_LOW (0x00000002U) /* 低速2M */
#define GPIO_SPEED_FREQ_MEDIUM (0x00000001U) /* 中速 10M*/
#define GPIO_SPEED_FREQ_HIGH (0x00000003U) /* 高速50M */
返回值
无
三、HAL_GPIO_WritePin(…)函数
HAL_GPIO_WritePin 函数是 GPIO 口的写引脚函数。其声明如下:
void HAL_GPIO_WritePin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState);
函数描述:
用于设置引脚输出高电平或低电平,通过BDRR寄存器复位或置位操作。
函数形参:
形参1是端口号,可以选择范围:GPIOA~GPIOG。
形参2是引脚号,可以选择范围:GPIO_PIN_0到GPIO_PIN_15。
形参3是要设置输出的状态,是枚举型有两个选择:GPIO_PIN_SET表示高电平,GPIO_PIN_RESET表示低电平。
返回值
无
四、HAL_GPIO_TogglePin(…)函数
HAL_GPIO_TogglePin函数是GPIO口的电平翻转函数。其声明如下:
void HAL_GPIO_TogglePin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin);
函数描述
用于设置引脚的电平翻转,也是通过BSRR寄存器复位或者置位操作。
函数形参
形参1是端口号,选择范围:GPIOA~GPIOG。
形参2是引脚号,选择范围:GPIO_PIN_0到GPIO_PIN_15。
返回值
无
五、HAL_GPIO_ReadPin(…)函数
声明
GPIO_PinState HAL_GPIO_ReadPin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin)
函数描述
读取指定GPIO端口和引脚号的电平状态。
函数形参
形参1是端口号,选择范围:GPIOA~GPIOG。
形参2是引脚号,选择范围:GPIO_PIN_0到GPIO_PIN_15。
返回值
GPIO_PIN_SET :高电平1
GPIO_PIN_RESER :低电平0
参考:《STM32F103 精英开发指南V1.3》正点原子