嵌入式-stm32学习:使用固件库点亮LED

本文详细介绍了如何使用STM32F4xx微控制器的GPIO接口控制RGB LED灯,包括LED的硬件配置、GPIO初始化过程以及通过宏定义实现LED的开关控制和颜色混合。提供了完整的代码示例,有助于理解STM32 GPIO模块的工作原理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

bsp_led.h

#ifndef __LED_H
#define __LED_H

#include "stm32f4xx.h"

//引脚定义
/*******************************************************/
//红色灯 R
#define LED1_PIN                  GPIO_Pin_10                //GPIO引脚号
#define LED1_GPIO_PORT            GPIOH                      //GPIO端口H
#define LED1_GPIO_CLK             RCC_AHB1Periph_GPIOH       //GPIO端口时钟

//绿色灯 G
#define LED2_PIN                  GPIO_Pin_11                 
#define LED2_GPIO_PORT            GPIOH                      
#define LED2_GPIO_CLK             RCC_AHB1Periph_GPIOH

//蓝色灯 B
#define LED3_PIN                  GPIO_Pin_12                 
#define LED3_GPIO_PORT            GPIOH                       
#define LED3_GPIO_CLK             RCC_AHB1Periph_GPIOH
/************************************************************/


/** 控制LED亮灭的宏,
  * 低电平亮,ON=0,OFF=1,
  * 高电平亮,ON=1,OFF=0
    */
#define ON  0
#define OFF 1

/* 带参宏 */
#define LED1(a) if (a)  \
                    GPIO_SetBits(LED1_GPIO_PORT,LED1_PIN);\
                    else        \
                    GPIO_ResetBits(LED1_GPIO_PORT,LED1_PIN)

#define LED2(a) if (a)  \
                    GPIO_SetBits(LED2_GPIO_PORT,LED2_PIN);\
                    else        \
                    GPIO_ResetBits(LED2_GPIO_PORT,LED2_PIN)

#define LED3(a) if (a)  \
                    GPIO_SetBits(LED3_GPIO_PORT,LED3_PIN);\
                    else        \
                    GPIO_ResetBits(LED3_GPIO_PORT,LED3_PIN)


/* 直接操作寄存器的方法控制IO */
#define digitalHi(p,i)           {p->BSRRL=i;}      //输出高电平
#define digitalLo(p,i)           {p->BSRRH=i;}      //输出低电平
#define digitalToggle(p,i)       {p->ODR ^=i;}      //输出翻转状态

/* 定义控制IO的宏 */
#define LED1_TOGGLE     digitalToggle(LED1_GPIO_PORT,LED1_PIN)  //翻转
#define LED1_OFF            digitalHi(LED1_GPIO_PORT,LED1_PIN)//关
#define LED1_ON             digitalLo(LED1_GPIO_PORT,LED1_PIN)//开

#define LED2_TOGGLE     digitalToggle(LED2_GPIO_PORT,LED2_PIN)
#define LED2_OFF            digitalHi(LED2_GPIO_PORT,LED2_PIN)
#define LED2_ON             digitalLo(LED2_GPIO_PORT,LED2_PIN)

#define LED3_TOGGLE     digitalToggle(LED3_GPIO_PORT,LED3_PIN)
#define LED3_OFF            digitalHi(LED3_GPIO_PORT,LED3_PIN)
#define LED3_ON             digitalLo(LED3_GPIO_PORT,LED3_PIN)

/* 基本混色 */
//红
#define LED_RED  \
                    LED1_ON;\
                    LED2_OFF;\
                    LED3_OFF

//绿
#define LED_GREEN       \
                    LED1_OFF;\
                    LED2_ON;\
                    LED3_OFF

//蓝
#define LED_BLUE    \
                    LED1_OFF;\
                    LED2_OFF;\
                    LED3_ON


//黄                 
#define LED_YELLOW  \
                    LED1_ON;\
                    LED2_ON;\
                    LED3_OFF
//紫
#define LED_PURPLE  \
                    LED1_ON;\
                    LED2_OFF;\
                    LED3_ON

//青
#define LED_CYAN \
                    LED1_OFF;\
                    LED2_ON;\
                    LED3_ON

//白
#define LED_WHITE   \
                    LED1_ON;\
                    LED2_ON;\
                    LED3_ON

//黑(全关)
#define LED_RGBOFF  \
                    LED1_OFF;\
                    LED2_OFF;\
                    LED3_OFF        


void LED_GPIO_Config(void); //定义LED-GPIO初始化配置函数

#endif /* __LED_H */

bsp_led.c

  #include "./led/bsp_led.h"   
 /**
  * 初始化控制LED的IO
  */
void LED_GPIO_Config(void)
{       
    /*定义一个GPIO_InitTypeDef类型的结构体*/
    GPIO_InitTypeDef GPIO_InitStructure;

    /*开启LED相关的GPIO外设时钟*/
    RCC_AHB1PeriphClockCmd ( LED1_GPIO_CLK|
                           LED2_GPIO_CLK|
                           LED3_GPIO_CLK, ENABLE); 

    /*设置引脚模式为输出模式*/
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;   

    /*设置引脚的输出类型为推挽输出*/
    GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;

    /*设置引脚为上拉模式*/
    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;

    /*设置引脚速率为20MHz*/   
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;

    /*选择要控制的GPIO引脚*/           
    GPIO_InitStructure.GPIO_Pin = LED1_PIN; 

    /*调用库函数GPIO_Init,使用配置好的GPIO_InitTypeDef对GPIO端口初始化*/
    GPIO_Init(LED1_GPIO_PORT, &GPIO_InitStructure); 

    /*选择要控制的GPIO引脚*/                       
        GPIO_InitStructure.GPIO_Pin = LED2_PIN; 
    GPIO_Init(LED2_GPIO_PORT, &GPIO_InitStructure); //初始化端口

    /*选择要控制的GPIO引脚*/                           
        GPIO_InitStructure.GPIO_Pin = LED3_PIN; 
    GPIO_Init(LED3_GPIO_PORT, &GPIO_InitStructure); 

    /*关灯*/
    LED_RGBOFF;     
}
/*********************************************END OF FILE**********************/
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值