这是基于STM32F4系列的使用HAL库的对rgb三色led的驱动,实现对全彩led灯的各种霓虹颜色和模式的控制,代码如下:
//以下是DV_RGB.H头文件部分
/*******************************************************************************************
文档说明:板载RGB灯驱动文件头文件
*******************************************************************************************/
#include "PinCfg1.h"
//硬件资源占用:
//TIME6
//设备模式描述:
#define RGB_MODE_NUM 0x0f//支持的模式数量
#define RGB_MODE_OFF 0//关闭
#define RGB_MODE_BREATH 1//呼吸灯
#define RGB_MODE_CYCLE 2//循环
#define RGB_MODE_COLOR 3//纯色
#define RGB_MODE_TWINK 4//闪烁
#define RGB_MODE_R 0X80//R选定
#define RGB_MODE_G 0X40//G选定
#define RGB_MODE_B 0X20//B选定
//接口函数:
void DV_RGB1_Init(void);
void DV_RGB1_Service(void);
void DV_RGB1_Timer(void);
extern unsigned char DV_RGBmode;
extern unsigned int DV_RGBDelayt;
//以下是DV_RGB.c正文文件部分
#include "stm32f4xx_hal.h"
#include "Drive_RGB.h"
extern TIM_HandleTypeDef htim6;
//#include "Drive_LCD.h"
#define MAXPERIOD 96//最大100ms周期,pwm频率为100hz
#define RGBBS_R 0
#define RGBBS_G 1
#define RGBBS_B 2
unsigned char DV_RGBmode = RGB_MODE_OFF;//rgb的模式选择
unsigned int DV_RGBDelayt = 1600;//RGB的运行时间
static const unsigned char RGBwave[32] = { 0,3,6,9,12,15,18,21,24,27,30,33,36,39,42,45, 45,42,39,36,33,30,27,24,21,18,15,12,9,6,3,0, };//呼吸灯模式下的波形
static unsigned char RGBindex = 1;//rgb当前运行到的步骤96MS
static unsigned int RGBbasems = 0;//基准0.16s时间
static unsigned char RGBBAS[1] = { 10,0,0, };//rgb亮度信息
/*******************************************************************************************
函数说明:初始化io口并配置状态
参数:初始状态
输出:
*******************************************************************************************/
void DV_RGB_Init()
{
//初始状态
__HAL_TIM_ENABLE_IT(&htim5, TIM_IT_UPDATE);
HAL_TIMEx_HallSensor_Start_IT(&htim5);
//DV_LCD_PrintASCII("RGB Init OK!\r\n\0");
//DV_LCD_PrintASCII("RGB run in mode:%z!\r\n\0",DV_RGBmode);
}
/*******************************************************************************************
函数说明:中断服务函数
参数:
输出:
*******************************************************************************************/
void DV_RGB_Tiimer(void)
{
static int tms = 0;
RGBindex++;
if(RGBindex > MAXPERIOD)
RGBindex = 1;
tms++;
if(tms > DV_RGBDelayt){
tms = 0;
RGBbasems++;
if (RGBbasems >= 132)
RGBbasems = 0;
}
HAL_GPIO_WritePin(GPIOB,GPIO_R,(GPIO_PinState)(RGBindex < RGBBAS[RGBBS_R]));
HAL_GPIO_WritePin(GPIOB,GPIO_G,(GPIO_PinState)(RGBindex < RGBBAS[RGBBS_G]));
HAL_GPIO_WritePin(GPIOA,GPIO_B,(GPIO_PinState)(RGBindex < RGBBAS[RGBBS_B]));
}
/*******************************************************************************************
函数说明:实现渐变色等其他功能
参数:
输出:
*******************************************************************************************/
void DV_RGB_Service1()
{
switch(DV_RGBmode & RGB_MODE_NUM)
{
case RGB_MODE_OFF://关闭
RGBBAS[RGBBS_R] = 0;
RGBBAS[RGBBS_G] = 0;
RGBBAS[RGBBS_B] = 0;
break;
case RGB_MODE_BREATH://呼吸灯
DV_RGBDelayt = 1600;
RGBBAS[RGBBS_R] = (RGB_MODE_R & DV_RGBmode) ? RGBwave[RGBbasems] : 0;
RGBBAS[RGBBS_G] = (RGB_MODE_G & DV_RGBmode) ? RGBwave[RGBbasems] : 0;
RGBBAS[RGBBS_B] = (RGB_MODE_B & DV_RGBmode) ? RGBwave[RGBbasems] : 0;
break;
case RGB_MODE_CYCLE://循环
DV_RGBDelayt = 3200;
RGBBAS[RGBBS_R] = RGBwave[RGBbasems];
RGBBAS[RGBBS_G] = RGBwave[(RGBbasems + 10) & 0x1f];
RGBBAS[RGBBS_B] = RGBwave[(RGBbasems + 20) & 0x1f];
break;
case RGB_MODE_COLOR://纯色
DV_RGBDelayt = 3200;
RGBBAS[RGBBS_R] = (RGB_MODE_R & DV_RGBmode) ? MAXPERIOD : 0;
RGBBAS[RGBBS_G] = (RGB_MODE_G & DV_RGBmode) ? MAXPERIOD : 0;
RGBBAS[RGBBS_B] = (RGB_MODE_B & DV_RGBmode) ? MAXPERIOD : 0;
break;
case RGB_MODE_TWINK://闪烁
DV_RGBDelayt = 1000;
if(RGBbasems < 7) break;
RGBbasems = 0;
RGBBAS[RGBBS_R] = (RGB_MODE_R & DV_RGBmode) ? (!RGBBAS[RGBBS_R] * MAXPERIOD) : 0;
RGBBAS[RGBBS_G] = (RGB_MODE_G & DV_RGBmode) ? (!RGBBAS[RGBBS_G] * MAXPERIOD) : 0;
RGBBAS[RGBBS_B] = (RGB_MODE_B & DV_RGBmode) ? (!RGBBAS[RGBBS_B] * MAXPERIOD) : 0;
break;
default:
break;
}
}