最近在做一个简单的ws2812b灯珠的功能,从网上看到大多数人都是采用PWM+DMA方式驱动ws2812b,这种方式优点是脉冲波形准确,CPU占用小。
但是驱动过程中遇到一点问题,首先,单独使用PWM输出800KHz脉冲波形能正常输出不同占空比波形,但是当我想添加DMA做一下静态PWM输出驱动ws2812b时,设置了一组固定数据,mcu对应的引脚并没有正确输出。
1、使用STM32CUBEMX配置了一个简单的定时器PWM输出以及打开定时器的dma功能。
2、生成的DMA配置
[C] 纯文本查看 复制代码 hdma_tim23_ch2.Instance = DMA1_Stream0;
hdma_tim23_ch2.Init.Request = DMA_REQUEST_TIM23_CH2;
hdma_tim23_ch2.Init.Direction = DMA_MEMORY_TO_PERIPH;
hdma_tim23_ch2.Init.PeriphInc = DMA_PINC_DISABLE;
hdma_tim23_ch2.Init.MemInc = DMA_MINC_ENABLE;
hdma_tim23_ch2.Init.PeriphDataAlignment = DMA_PDATAALIGN_HALFWORD;
hdma_tim23_ch2.Init.MemDataAlignment = DMA_MDATAALIGN_HALFWORD;
hdma_tim23_ch2.Init.Mode = DMA_NORMAL;
hdma_tim23_ch2.Init.Priority = DMA_PRIORITY_HIGH;
hdma_tim23_ch2.Init.FIFOMode = DMA_FIFOMODE_DISABLE;
if (HAL_DMA_Init(&hdma_tim23_ch2) != HAL_OK)
{
Error_Handler();
}
__HAL_LINKDMA(tim_baseHandle,hdma[TIM_DMA_ID_CC2],hdma_tim23_ch2);
3、静态测试数据
[C] 纯文本查看 复制代码 uint16_t testPwmData[]={
70 ,35,70,35,35,70,35,70
};
uint16_t len = sizeof(testPwmData)/sizeof(testPwmData[0]);
//定时500ms调用该函数
HAL_TIM_PWM_Start_DMA(&htim23,TIM_CHANNEL_2,(uint32_t*)testPwmData,len);
4、DMA回调,确定完成后关闭
[C] 纯文本查看 复制代码 void HAL_TIM_PWM_PulseFinishedCallback(TIM_HandleTypeDef *htim)
{
if(htim == &htim23)
{
/*关闭DMA传输以及PWM*/
HAL_TIM_PWM_Stop_DMA(&htim23,TIM_CHANNEL_2);
}
}
根据以上的配置以及测试,我无法正常从逻辑分析仪上接收到正确的脉冲波形,查阅了一下网上的,大多数都是差不多配置,只是使用的芯片不同,是STM32H7系列的芯片使用DMA功能还需要做其他的相关配置功能吗?
|