[STM32] 使用HAL库点亮LED灯

学习完标准库后,现在再来学习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);
    }
}

  • 18
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值