/********************************* (C) COPYRIGHT 2019 曼珠沙华 ****************************************************
* File Name : ws2812.c
* Author : @曼珠沙华
* Date : 2019/12/27
* Description : ws2812 file,led相关
*
* Includes ------------------------------------------------------------------*/
#include "WS2812.h"
#include "delay.h"
#if SYSTEM_SUPPORT_OS
#include "FreeRTOS.h" //FreeRTOS使用
#include "task.h"
#endif
// Some Static Colors
const RGBColor_TypeDef RED = {255,0,0};
const RGBColor_TypeDef GREEN = {0,255,0};
const RGBColor_TypeDef BLUE = {0,0,255};
const RGBColor_TypeDef SKY = {0,255,255};
const RGBColor_TypeDef MAGENTA = {255,0,255};
const RGBColor_TypeDef YELLOW = {255,255,0};
const RGBColor_TypeDef ORANGE = {127,106,0};
const RGBColor_TypeDef BLACK = {0,0,0};
const RGBColor_TypeDef WHITE = {255,255,255};
const RGBColor_TypeDef PURPLE = {65,105,225};
u8 pixelBuffer[ Pixel_S1_NUM][24]; //灯珠
/***********************************************************************************************
** name: WS2812b_Configuration
** function: WS2812B SPI DMA总线初始化
**parameter: void
** return: void
** date: 2019/12/27
** create: @曼珠沙华
************************************************************************************************/
void WS2812b_Configuration(void){
GPIO_InitTypeDef GPIO_InitStructure;
SPI_InitTypeDef SPI_InitStructure;
DMA_InitTypeDef DMA_InitStructure;
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE); //使能GPIOB时钟
RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2, ENABLE); //使能SPI2时钟
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA1,ENABLE); //DMA1时钟使能
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15; //PB15复用功能输出
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; //复用功能
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; //100MHz
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; //上拉
GPIO_Init(GPIOB, &GPIO_InitStructure); //初始化
GPIO_PinAFConfig(GPIOB,GPIO_PinSource15,GPIO_AF_SPI2); //PB15复用为 SPI2
SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex; //设置SPI单向或者双向的数据模式:SPI设置为双线双向全双工
SPI_InitStructure.SPI_Mode = SPI_Mode_Master; //设置SPI工作模式:设置为主SPI
SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b; //设置SPI的数据大小:SPI发送接收8位帧结构
SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low; //串行同步时钟的空闲状态为高电平
SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge; //串行同步时钟的第二个跳变沿(上升或下降)数据被采样
SPI_InitStructure.SPI_NSS = SPI_NSS_Soft; //NSS信号由硬件(NSS管脚)还是软件(使用SSI位)管理:内部NSS信号有SSI位控制
SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_8; //42M/8=5.25M
SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB; //指定数据传输从MSB位还是LSB位开始:数据传输从MSB位开始
SPI_InitStructure.SPI_CRCPolynomial = 7; //CRC值计算的多项式
SPI_Init(SPI2, &SPI_InitStructure); //根据SPI_InitStruct中指定的参数初始化外设SPIx寄存器
SPI_Cmd(SPI2, ENABLE); //使能SPI外设
DMA_DeInit(DMA1_Stream4);
while (DMA_GetCmdStatus(DMA1_Stream4) != DISABLE){} //等待DMA可配置
DMA_InitStructure.DMA_Channel = DMA_Channel_0; //通道选择
DMA_InitStructure.DMA_PeripheralBaseAddr = (u32)&SPI2->DR; //DMA外设地址
DMA_InitStructure.DMA_Memory0BaseAddr = (u32)pixelBuffer; //DMA 存储器0地址
DMA_InitStructure.DMA_DIR = DMA_DIR_MemoryToPeripheral; //存储器到外设模式
DMA_InitStructure.DMA_BufferSize = Pixel_S1_NUM * 24; //数据传输量
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; //外设非增量模式
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; //存储器增量模式
DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte; //外设数据长度:8位
DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte; //存储器数据长度:8位
DMA_InitStructure.DMA_Mode = DMA_Mode_Normal; // 使用普通模式
DMA_InitStructure.DMA_Priority = DMA_Priority_Medium; //中等优先级
DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable;
DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_Full;
DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single; //存储器突发单次传输
DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single; //外设突发单次传输
DMA_Init(DMA1_Stream4, &DMA_InitStructure); //初始化DMA Stream
SPI_I2S_DMACmd(SPI2, SPI_I2S_DMAReq_Tx, ENABLE); // 使能SPI2的DMA发送
DMA_Cmd(DMA1_Stream4, DISABLE); //关闭DMA传输
while (DMA_GetCmdStatus(DMA1_Stream4) != DISABLE){} //确保DMA可以被设置
DMA_SetCurrDataCounter(DMA1_Stream4,Pixel_S1_NUM * 24); //数据传输量
DMA_Cmd(DMA1_Stream4, ENABLE);
delay_xms(1);
RGB_BLACK(Pixel_S1_NUM); //RGB RESET
delay_xms(1);
}
/***********************************************************************************************
** name: rgb_SetColor
** function: 设定某个RGB LED的颜色
**parameter: void
** return: void
** date: 2019/12/27
** create: @曼珠沙华
************************************************************************************************/
void rgb_SetColor(u8 LedId, RGBColor_TypeDef Color){
u8 i;
if( LedId > ( Pixel_S1_NUM ) ){
return; //to avoid overflow
}
for(i=0;i<=7;i++){
pixelBuffer[LedId][i]= ( (Color.G & (1 << (7 -i)) )? (CODE1):CODE0 );
}
for(i=8;i<=15;i++){
pixelBuffer[LedId][i]= ( (Color.R & (1 << (15-i)) )? (CODE1):CODE0 );
}
for(i=16;i<=23;i++){
pixelBuffer[LedId][i]= ( (Color.B & (1 << (23-i)) )? (CODE1):CODE0 );
}
}
/***********************************************************************************************
** name: rgb_SendArray
** function: Configure colors to RGB pixel series.
RGBColor_TypeDef: pointer to a RGBColor_TypeDef structure that contains the color configuration information for the RGB pixel.
**parameter: void
** return: void
** date: 2019/12/27
** create: @曼珠沙华
************************************************************************************************/
void rgb_SendArray(void){
if(DMA_GetFlagStatus(DMA1_Stream4,DMA_FLAG_TCIF4) != RESET){ //等待DMA1_Steam5传输完成
DMA_ClearFlag(DMA1_Stream4,DMA_FLAG_TCIF4); //清除DMA1_Steam5传输完成标志,先预想DMA_FLAG_TCIF0的零,代表的是Channel
SPI_I2S_DMACmd(SPI2, SPI_I2S_DMAReq_Tx, ENABLE); // 使能SPI3的DMA发送
DMA_Cmd(DMA1_Stream4, DISABLE); //关闭DMA传输
while (DMA_GetCmdStatus(DMA1_Stream4) != DISABLE){} //确保DMA可以被设置
DMA_SetCurrDataCounter(DMA1_Stream4,Pixel_S1_NUM * 24); //数据传输量
DMA_Cmd(DMA1_Stream4, ENABLE); //开启DMA传输
}
}
//下面的几个颜色控制函数完全可以写到一起,本人太懒,就没弄
/***********************************************************************************************
** name: RGB_RED
** function: 设定颜色为RED
**parameter: Pixel_LEN 灯珠数
** return: void
** date: 2019/12/27
** create: @曼珠沙华
*****************************************************
没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
收起资源包目录
ws2812.rar (2个子文件)
ws2812
ws2812.c 14KB
ws2812.h 2KB
共 2 条
- 1
资源评论
xieyunsky_
- 粉丝: 32
- 资源: 6
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功