OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3055|回复: 1

STM32——LED的另一种实现

[复制链接]

10

主题

62

帖子

0

精华

初级会员

Rank: 2

积分
152
金钱
152
注册时间
2016-9-6
在线时间
25 小时
发表于 2016-9-22 09:12:58 | 显示全部楼层 |阅读模式
本帖最后由 1838039453 于 2016-9-22 09:14 编辑

[mw_shl_code=c,true]#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_ */[/mw_shl_code]
[mw_shl_code=c,true]#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.GPIOx, led_port.pos, GPIO_Mode_Out_PP);
            GPIO_ResetBits(led_port.GPIOx, led_port.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.GPIOx, led_port.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.GPIOx, led_port.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.GPIOx, led_port.pos) == 0)
            {
                 GPIO_SetBits(led_port.GPIOx, led_port.pos);
            }
            else
            {
                GPIO_ResetBits(led_port.GPIOx, led_port.pos);
            }
        }

        mask <<= 1;
    }
}[/mw_shl_code]
http://blog.csdn.net/wqx521
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

10

主题

62

帖子

0

精华

初级会员

Rank: 2

积分
152
金钱
152
注册时间
2016-9-6
在线时间
25 小时
 楼主| 发表于 2016-9-27 09:48:37 | 显示全部楼层
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-5-24 18:37

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表