一、CubeMX配置
1、配置时钟 、配置STLINK下载方式
2、配置定时器,设置DMA
二、驱动WS2812
生成工程后,要添加驱动代码,主要就是把WS2812各个灯珠的颜色准备好,然后开启DMA,等传输完毕之后停止DMA.
#define WS2812_NUM 10
#define FRAME_BYTES 24*WS2812_NUM+4
//传输一次WS2812灯带数据格式
typedef struct{
uint16_t head[3]; //reset
uint16_t GRB[24*WS2812_NUM];
uint16_t tail; //传输完后为低电平
}ws2812_frame_def;
ws2812_frame_def ws2812_frame = {
.head[0] = 0,
.head[1] = 0,
.head[2] = 0,
.tail = 0
};
#define BIT0 28u
#define BIT1 61u
//颜色缓存
uint8_t G = 255;
uint8_t R = 0;
uint8_t B = 0;
//转换数据,传输WS2812灯带,开启一次传输
void WS2812_Control()
{
uint16_t i,j;
for(i=0;i<WS2812_NUM;i++){
for(j=0;j<8;j++){
ws2812_frame.GRB[i*24+j] =(G&(0x80>>j))?BIT1:BIT0;
ws2812_frame.GRB[i*24+8+j] =(R&(0x80>>j))?BIT1:BIT0;
ws2812_frame.GRB[i*24+16+j] =(B&(0x80>>j))?BIT1:BIT0;
}
}
//函数要求为32位无符号指针,但实际传输时,因为之前定义的为half word,所以还是16bit传输
HAL_TIM_PWM_Start_DMA(&htim2, TIM_CHANNEL_2, (uint32_t *)&ws2812_frame,FRAME_BYTES);
}
//PWM的DMA完成中断回调函数
void HAL_TIM_PWM_PulseFinishedCallback(TIM_HandleTypeDef *htim)
{
HAL_TIM_PWM_Stop_DMA(&htim2,TIM_CHANNEL_2);
}
int main(void)
{
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
MX_DMA_Init();
MX_TIM2_Init();
HAL_Delay(1000);
WS2812_Control();
while (1){
}
}