STM32 LED灯的另一种写法

STM32 LED灯的另一种写法

#ifndef __BSP_LED_
#define __BSP_LED_

#include <MM32x103.h> // 这个换成STM32的库文件就行
#include "type.h"

//==================================================================================
#define LED1_RUN_GRP      GPIOC
#define LED1_RUN_IDX      GPIO_Pin_6
#define LED1_RUN_OFF()    GPIO_ResetBits(LED1_RUN_GRP, LED1_RUN_IDX)
#define LED1_RUN_ON()     GPIO_SetBits(LED1_RUN_GRP, LED1_RUN_IDX)
#define LED1_RUN_IS_OFF() GPIO_ReadOutputDataBit(LED1_RUN_GRP, LED1_RUN_IDX)

#define LED2_RUN_GRP      GPIOA
#define LED2_RUN_IDX      GPIO_Pin_11
#define LED2_RUN_OFF()    GPIO_ResetBits(LED2_RUN_GRP, LED2_RUN_IDX)
#define LED2_RUN_ON()     GPIO_SetBits(LED2_RUN_GRP, LED2_RUN_IDX)
#define LED2_RUN_IS_OFF() GPIO_ReadOutputDataBit(LED2_RUN_GRP, LED2_RUN_IDX)

#define LED3_RUN_GRP      GPIOA
#define LED3_RUN_IDX      GPIO_Pin_12
#define LED3_RUN_OFF()    GPIO_ResetBits(LED3_RUN_GRP, LED3_RUN_IDX)
#define LED3_RUN_ON()     GPIO_SetBits(LED3_RUN_GRP, LED3_RUN_IDX)
#define LED3_RUN_IS_OFF() GPIO_ReadOutputDataBit(LED3_RUN_GRP, LED3_RUN_IDX)
//==================================================================================
#define LED_COUNT   3 // LED个数自己定义

typedef enum
{
  RED   = 0x04,
  GREEN = 0x02,
  BLUE  = 0x01
} led_t;

typedef struct
{
  GPIO_TypeDef *GPIOx;
  uint32_t pos;
} led_port_t;

//==================================================================================
void GPIOConfig(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, GPIOMode_TypeDef GPIO_Mode);
void LEDConfig((uint8_t value) // value:1/2/4 --- RED GREEN BLUE 
void LEDSet(uint8_t value);
void LEDReset(uint8_t value);
void LEDToggle(uint8_t value);

#endif /* __BSP_LED_ */


#include "bsp_led.h"

static led_port_t led_port[LED_COUNT] =
{
  {LED1_RUN_GRP, LED1_RUN_IDX}, /*蓝灯*/
  {LED2_RUN_GRP, LED2_RUN_IDX}, /*绿灯*/
  {LED3_RUN_GRP, LED3_RUN_IDX}, /*红灯*/
};

// GPIO配置
void GPIOConfig(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, GPIOMode_TypeDef GPIO_Mode)
{
  GPIO_InitTypeDef GPIO_InitStructure;//定义GPIO初始化结构体变量

  // 这个GPIO口需要改的,根据自己情况而定
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC | RCC_APB2Periph_GPIOA, ENABLE);  //开启GPIO时钟

  //配置连接LED的GPIO为推挽输出模式
  GPIO_InitStructure.GPIO_Pin  =  GPIO_Pin;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode;
  GPIO_Init(GPIOx, &GPIO_InitStructure);
}

// LED GPIO配置
void LEDConfig((uint8_t value) // value:1/2/4 --- RED GREEN BLUE 
{
  uint8_t i, mask = 1;

  for(i = 0; i < LED_COUNT; ++i)
  {
    if(value & mask)
    {
      GPIOConfig(led_port[i].GPIOx, led_port[i].pos, GPIO_Mode_Out_PP);
      GPIO_ResetBits(led_port[i].GPIOx, led_port[i].pos);
    }

    mask <<= 1;
  }
}

/* 根据参数来打开LED灯 */
void LEDSet(uint8_t value) 
{
  uint8_t i, mask = 1;

  for(i = 0; i < LED_COUNT; ++i)
  {
    if(value & mask)
    {
      GPIO_SetBits(led_port[i].GPIOx, led_port[i].pos);
    }

    mask <<= 1;
  }
}
/* 根据参数来关闭LED灯 */
void LEDReset(uint8_t value)
{
  uint8_t i, mask = 1;

  for(i = 0; i < LED_COUNT; ++i)
  {
    if(value & mask)
    {
      GPIO_ResetBits(led_port[i].GPIOx, led_port[i].pos);
    }

    mask <<= 1;
  }
}

// 取反
void LEDToggle(uint8_t value)
{
  uint8_t i, mask = 1;

  for(i = 0; i < LED_COUNT; ++i)
  {
    if(value & mask)
    {
      if(GPIO_ReadOutputDataBit(led_port[i].GPIOx, led_port[i].pos) == 0)
      {
        GPIO_SetBits(led_port[i].GPIOx, led_port[i].pos);
      }
      else
      {
        GPIO_ResetBits(led_port[i].GPIOx, led_port[i].pos);
      }
    }

    mask <<= 1;
  }
}



  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值