新手入门
- 积分
- 7
- 金钱
- 7
- 注册时间
- 2024-5-30
- 在线时间
- 0 小时
|
1金钱
我在使用STM32F072x8通过DMA发送PWM控制RGB灯,遇到一个问题:外部时钟8M,RCC_PLL_MUL4 = 32M。
然后用的TIM15,
htim1.Init.Prescaler = 1 - 1;
htim1.Init.CounterMode = TIM_COUNTERMODE_UP;
htim1.Init.Period = 40 - 1; //频率为800k。
Pulse为20,15。
但是我通过dma发送2个数据时,实际发出去的波形为 PMW1正常占空比,0,PWM正常占空比,0;
当把Period改成1000时,数据就正常了,感觉是DMA发送完一个数据以后,第二个数据没有给过去。
有了解的帮忙看下code,不胜感激。
hdma_tim.Instance = DMA1_Channel2; //使用哪个DMA通道
hdma_tim.Init.Direction = DMA_MEMORY_TO_PERIPH; //方向:存储区到外设寄存器
hdma_tim.Init.PeriphInc = DMA_PINC_DISABLE; //外设寄存器不递增
hdma_tim.Init.MemInc = DMA_MINC_ENABLE; //存储区地址递增
hdma_tim.Init.PeriphDataAlignment = DMA_PDATAALIGN_HALFWORD;//外设寄存器数据位宽度,2字节
hdma_tim.Init.MemDataAlignment = DMA_PDATAALIGN_HALFWORD;//存储区数据位宽度,2字节
hdma_tim.Init.Mode = DMA_NORMAL; //单次
hdma_tim.Init.Priority = DMA_PRIORITY_MEDIUM; //优先级中等
__HAL_LINKDMA(htim1,hdma[TIM_DMA_ID_CC2],hdma_tim); //DMA双向LINK连接
HAL_DMA_Init(&hdma_tim);
HAL_NVIC_SetPriority(DMA1_Channel2_3_IRQn, 3, 0); //设置优先级
HAL_NVIC_EnableIRQ(DMA1_Channel2_3_IRQn); //打开中断
htim1.Instance = TIM15;
htim1.Init.Prescaler = 1 - 1;
htim1.Init.CounterMode = TIM_COUNTERMODE_UP;
htim1.Init.Period = 40 - 1; //自动重载值是10,刚好是800k
htim1.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
htim1.Init.RepetitionCounter = 0;
htim1.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
if (HAL_TIM_PWM_Init(&htim1) != HAL_OK)
{
Error_Handler();
}
//__HAL_TIM_CLEAR_FLAG(&htim1, TIM_FLAG_UPDATE);
sConfigOC.OCMode = TIM_OCMODE_PWM1;
sConfigOC.Pulse = 0;
sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
HAL_TIM_PWM_ConfigChannel(&htim1, &sConfigOC, TIM_CHANNEL_1);
|
|