学习完标准库后,现在再来学习HAL库要容易一点,虽然HAL库有些不明白的地方,但是自己还是能够看得懂这些函数都是用来干嘛的,目前阶段还是在学习如何使用,比如如何点亮一个灯,至于底层的东西,不是特别明白,比如如何操作寄存器这里,确实不是特别明白,但是在标准库与HAL库中我是能够明白如何使用的。后期自己会慢慢把底层的东西再学习一下,现在主要还是以如何实际操作起来为目标。
说了那么多,现在来开始点亮LED灯,这里只着重说明led.c以及led.h文件,主函数其实很简单,这里就不再多言。2024年4月2日21:47:06 现在每天都会更新HAL库的学习经历,感兴趣的朋友可以加群进行沟通。
2024年4月3日15:45:43 更新了代码,可读性与可移植性更高,并且添加了更加全面的注释,方便食用。
LED.H
#ifndef _LED_H
#define _LED_H
#include "./SYSTEM/sys/sys.h"
/******************************************************************************************/
/* 定义LED连接的GPIO端口, 用户只需要修改下面的代码即可改变控制的LED引脚 */
// R-红色
#define LED1_GPIO_PORT GPIOB /* GPIO端口 */
#define LED1_GPIO_PIN GPIO_PIN_5 /* 连接到红色LED灯的GPIO */
#define LED1_GPIO_CLK_ENABLE() do{ __HAL_RCC_GPIOC_CLK_ENABLE(); }while(0) /* PB口时钟使能 */
// G-绿色
#define LED2_GPIO_PORT GPIOB /* GPIO端口 */
#define LED2_GPIO_PIN GPIO_PIN_0 /* 连接到绿色LED灯的GPIO */
#define LED2_GPIO_CLK_ENABLE() do{ __HAL_RCC_GPIOC_CLK_ENABLE(); }while(0) /* PB口时钟使能 */
// B-蓝色
#define LED3_GPIO_PORT GPIOB /* GPIO端口 */
#define LED3_GPIO_PIN GPIO_PIN_1 /* 连接到蓝色LED灯的GPIO */
#define LED3_GPIO_CLK_ENABLE() do{ __HAL_RCC_GPIOC_CLK_ENABLE(); }while(0) /* PB口时钟使能 */
/* 直接操作寄存器的方法控制IO */
#define digitalHi(p,i) {p->BSRR=i;} //输出为高电平
#define digitalLo(p,i) {p->BRR=i;} //输出低电平
#define digitalToggle(p,i) {p->ODR ^=i;} //输出反转状态
/* 定义控制IO的宏 */
#define LED1_TOGGLE digitalToggle(LED1_GPIO_PORT,LED1_GPIO_PIN) /* 翻转LED1 */
#define LED1_OFF digitalHi(LED1_GPIO_PORT,LED1_GPIO_PIN) /* 关闭LED1 */
#define LED1_ON digitalLo(LED1_GPIO_PORT,LED1_GPIO_PIN) /* 打开LED1 */
#define LED2_TOGGLE digitalToggle(LED2_GPIO_PORT,LED2_GPIO_PIN) /* 翻转LED2 */
#define LED2_OFF digitalHi(LED2_GPIO_PORT,LED2_GPIO_PIN) /* 关闭LED2 */
#define LED2_ON digitalLo(LED2_GPIO_PORT,LED2_GPIO_PIN) /* 打开LED2 */
#define LED3_TOGGLE digitalToggle(LED3_GPIO_PORT,LED3_GPIO_PIN) /* 翻转LED3 */
#define LED3_OFF digitalHi(LED3_GPIO_PORT,LED3_GPIO_PIN) /* 关闭LED3 */
#define LED3_ON digitalLo(LED3_GPIO_PORT,LED3_GPIO_PIN) /* 打开LED3 */
/******************************************************************************************/
/* LED端口定义 */
#define LED1(x) do{ x ? \
HAL_GPIO_WritePin(LED1_GPIO_PORT, LED1_GPIO_PIN, GPIO_PIN_SET) : \
HAL_GPIO_WritePin(LED1_GPIO_PORT, LED1_GPIO_PIN, GPIO_PIN_RESET); \
}while(0) /* LED0翻转 */
#define LED2(x) do{ x ? \
HAL_GPIO_WritePin(LED2_GPIO_PORT, LED2_GPIO_PIN, GPIO_PIN_SET) : \
HAL_GPIO_WritePin(LED2_GPIO_PORT, LED2_GPIO_PIN, GPIO_PIN_RESET); \
}while(0) /* LED1翻转 */
#define LED3(x) do{ x ? \
HAL_GPIO_WritePin(LED3_GPIO_PORT, LED3_GPIO_PIN, GPIO_PIN_SET) : \
HAL_GPIO_WritePin(LED3_GPIO_PORT, LED3_GPIO_PIN, GPIO_PIN_RESET); \
}while(0) /* LED1翻转 */
/* 采用HAL库 LED取反定义 */
#define LED1_TOGGLE() do{ HAL_GPIO_TogglePin(LED1_GPIO_PORT, LED0_GPIO_PIN); }while(0) /* 翻转LED1 */
#define LED2_TOGGLE() do{ HAL_GPIO_TogglePin(LED2_GPIO_PORT, LED1_GPIO_PIN); }while(0) /* 翻转LED2 */
#define LED3_TOGGLE() do{ HAL_GPIO_TogglePin(LED3_GPIO_PORT, LED1_GPIO_PIN); }while(0) /* 翻转LED3 */
/******************************************************************************************/
/* 基本混色,后面高级用法使用PWM可混出全彩颜色,且效果更好 */
//红
#define LED_RED \
LED1(1);\
LED2(0)\
LED3(0)
//绿
#define LED_GREEN \
LED1(0);\
LED2(1)\
LED3(0)
//蓝
#define LED_BLUE \
LED1(0);\
LED2(0)\
LED3(1)
//黄(红+绿)
#define LED_YELLOW \
LED1(1);\
LED2(1)\
LED3_OFF
//紫(红+蓝)
#define LED_PURPLE \
LED1(1);\
LED2(0)\
LED3(1)
//青(绿+蓝)
#define LED_CYAN \
LED1(0);\
LED2(1)\
LED3(1)
//白(红+绿+蓝)
#define LED_WHITE \
LED1(1);\
LED2(1)\
LED3(1)
//黑(全部关闭)
#define LED_RGBOFF \
LED1(0);\
LED2(0)\
LED3(0)
/* 外部接口函数*/
void led_init(void); /* 初始化 */
#endif
LED.C
void led_init(void)
{
GPIO_InitTypeDef gpio_init_struct;
LED1_GPIO_CLK_ENABLE(); /* LED1时钟使能 */
LED2_GPIO_CLK_ENABLE(); /* LED2时钟使能 */
LED3_GPIO_CLK_ENABLE(); /* LED3时钟使能 */
gpio_init_struct.Pin = LED1_GPIO_PIN; /* LED1引脚 */
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(LED1_GPIO_PORT, &gpio_init_struct); /* 初始化LED1引脚 */
gpio_init_struct.Pin = LED2_GPIO_PIN; /* LED2引脚 */
HAL_GPIO_Init(LED2_GPIO_PORT, &gpio_init_struct); /* 初始化LED2引脚 */
gpio_init_struct.Pin = LED3_GPIO_PIN; /* LED3引脚 */
HAL_GPIO_Init(LED3_GPIO_PORT, &gpio_init_struct); /* 初始化LED3引脚 */
LED1(1); /* 关闭 LED1 */
LED2(1); /* 关闭 LED2 */
LED3(1); /* 关闭 LED3 */
}
main.c
int main(void)
{
HAL_Init(); /* 初始化HAL库 */
sys_stm32_clock_init(RCC_PLL_MUL9); /* 设置时钟,72M */
delay_init(72); /* 初始化延时函数 */
led_init(); /* 初始化LED */
while(1)
{
LED1(0); /* LED0 亮 */
LED1(1); /* LED1 灭 */
delay_ms(100);
LED2(1); /* LED0 灭 */
LED2(0); /* LED1 亮 */
delay_ms(100);
LED3(1); /* LED0 灭 */
LED3(0); /* LED1 亮 */
delay_ms(100);
}
}