硬件介绍
提示:本文是基于野火STM32F103指南者开发板所写例程,其他开发板请自行移植到自己的工程项目当中即可。
RGB-LED | Pin引脚:低电平-点亮,高电平-熄灭 |
---|---|
RED | PB5 |
GREEN | PB0 |
BLUE | PB1 |
软件介绍:结构体方式 ①
bsp_rgb.h 文件下的代码如下(示例):
#ifndef __BSP_RGB_H
#define __BSP_RGB_H
#include "stm32f10x.h"
#include "stdint.h"
//定义一个RGB_GPIO_TypeDef类型的结构体,为了方便移植修改,将需要经常修改的参数放到结构体当中
typedef struct
{
uint32_t RCC_APB2Periph; //APB2总线时钟
GPIO_TypeDef* GPIOx; //GPIO_PORT
uint16_t GPIO_Pin; //GPIO_PIN
}RGB_GPIO_TypeDef;
//定义一个结构体数组并对其进行初始化
static RGB_GPIO_TypeDef RGB_GPIO_List[]=
{
{RCC_APB2Periph_GPIOB, GPIOB, GPIO_Pin_5},
{RCC_APB2Periph_GPIOB, GPIOB, GPIO_Pin_0},
{RCC_APB2Periph_GPIOB, GPIOB, GPIO_Pin_1},
};
//计算结构体数组中结构体的个数
#define RGB_NUM_MAX (sizeof(RGB_GPIO_List)/sizeof(RGB_GPIO_List[0]))
typedef enum
{
GPIO_RGB_RED = 0,
GPIO_RGB_GREEN,
GPIO_RGB_BLUE
}RGB;
void RGB_Init(void);
void TurnOnLed(uint8_t LedNum);
void TurnOffLed(uint8_t LedNum);
void ToggleLed(uint8_t LedNum);
#endif /* __BSP_RGB_H */
bsp_rgb.c 文件下的代码如下(示例):
#include "bsp_rgb.h"
void RGB_Init(void)
{
uint8_t i = 0;
GPIO_InitTypeDef GPIO_InitStructure;
for(i = 0;i < RGB_NUM_MAX;i++)
{
RCC_APB2PeriphClockCmd(RGB_GPIO_List[i].RCC_APB2Periph,ENABLE);
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Pin = RGB_GPIO_List[i].GPIO_Pin;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(RGB_GPIO_List[i].GPIOx, &GPIO_InitStructure);
//初始化RGB上电状态,熄灭
GPIO_SetBits(RGB_GPIO_List[i].GPIOx,RGB_GPIO_List[i].GPIO_Pin);
}
}
void TurnOnLed(uint8_t LedNum)
{
if(LedNum >= RGB_NUM_MAX)
return;
else
GPIO_ResetBits(RGB_GPIO_List[LedNum].GPIOx,RGB_GPIO_List[LedNum].GPIO_Pin);
}
void TurnOffLed(uint8_t LedNum)
{
if(LedNum >= RGB_NUM_MAX)
return;
else
GPIO_SetBits(RGB_GPIO_List[LedNum].GPIOx,RGB_GPIO_List[LedNum].GPIO_Pin);
}
void ToggleLed(uint8_t LedNum)
{
if(LedNum >= RGB_NUM_MAX)
return;
else
{
if(GPIO_ReadOutputDataBit(RGB_GPIO_List[LedNum].GPIOx,RGB_GPIO_List[LedNum].GPIO_Pin) == 1)
GPIO_ResetBits(RGB_GPIO_List[LedNum].GPIOx,RGB_GPIO_List[LedNum].GPIO_Pin);
else
GPIO_SetBits(RGB_GPIO_List[LedNum].GPIOx,RGB_GPIO_List[LedNum].GPIO_Pin);
}
}
软件介绍:结构体方式 ②
bsp_rgb.h 文件下的代码如下(示例):
#ifndef __BSP_RGB_H
#define __BSP_RGB_H
#include "stm32f10x.h"
#include "stdint.h"
#define RGB_RccPeriphClockCmd RCC_APB2PeriphClockCmd
typedef struct
{
uint32_t RCC_APB2Periph;
GPIO_TypeDef* GPIOx;
uint16_t GPIO_Pin;
}RGB_GPIO_Typedef;
static RGB_GPIO_Typedef RGB_Drv_List[]=
{
//RED
{RCC_APB2Periph_GPIOA,GPIOA,GPIO_Pin_1},
//GREEN
{RCC_APB2Periph_GPIOA,GPIOA,GPIO_Pin_2},
//BLUE
{RCC_APB2Periph_GPIOA,GPIOA,GPIO_Pin_3}
};
#define RGB_NUM_MAX (sizeof(RGB_Drv_List)/sizeof(RGB_Drv_List[0]))
typedef enum
{
RED = 0,
GREEN = 1,
BLUE = 2
}RGB_Colour;
typedef enum
{
OFF = 0,
ON
}RGB_State;
void RGB_Drv_Init(void);
void RGB_Status(uint8_t RGB_Colour,uint8_t State);
void RGB_Toggle(uint8_t RGB_Colour);
#endif /* __BSP_RGB_H */
bsp_rgb.c 文件下的代码如下(示例):
#include "bsp_rgb.h"
void RGB_Drv_Init(void)
{
uint8_t i = 0;
GPIO_InitTypeDef GPIO_InitStructer;
for(i = 0; i < RGB_NUM_MAX; i++)
{
RGB_RccPeriphClockCmd(RGB_Drv_List[i].RCC_APB2Periph,ENABLE);
GPIO_InitStructer.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructer.GPIO_Pin = RGB_Drv_List[i].GPIO_Pin;
GPIO_InitStructer.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(RGB_Drv_List[i].GPIOx,&GPIO_InitStructer);
GPIO_SetBits(RGB_Drv_List[i].GPIOx,RGB_Drv_List[i].GPIO_Pin);
}
}
void RGB_Status(uint8_t RGB_Colour,uint8_t State)
{
if(RGB_Colour > RGB_NUM_MAX)
return;
else
{
if(State == OFF)
{
GPIO_ResetBits(RGB_Drv_List[RGB_Colour].GPIOx,RGB_Drv_List[RGB_Colour].GPIO_Pin);
}
else
{
GPIO_SetBits(RGB_Drv_List[RGB_Colour].GPIOx,RGB_Drv_List[RGB_Colour].GPIO_Pin);
}
}
}
void RGB_Toggle(uint8_t RGB_Colour)
{
if(RGB_Colour > RGB_NUM_MAX)
return;
else
{
if(GPIO_ReadOutputDataBit(RGB_Drv_List[RGB_Colour].GPIOx,RGB_Drv_List[RGB_Colour].GPIO_Pin) == (uint8_t)Bit_SET)
{
GPIO_ResetBits(RGB_Drv_List[RGB_Colour].GPIOx,RGB_Drv_List[RGB_Colour].GPIO_Pin);
}
else
{
GPIO_SetBits(RGB_Drv_List[RGB_Colour].GPIOx,RGB_Drv_List[RGB_Colour].GPIO_Pin);
}
}
}
软件介绍:宏定义方式
bsp_rgb.c 文件下的代码如下(示例):