以STM32F407VGT6为例
使用Time4的通道1(PB6)和通道2(PB7)
-
打开一个配置好的系统时钟工程。可参考STM32CubeMX使用1 配置系统时钟
-
寻找通道1和通道2对应引脚PB6和PB7

-
打开Tim4的PWM控制引脚

-
详细介绍配置参数


-
配置DMA

-
生成代码
-
常用
cppuint16_t pwm1_buf1[10] = {10,11,12,33,34,36,67,68,69,104}; uint16_t pwm1_buf2[10] = {20,21,22,43,44,46,77,78,79,94}; uint32_t dma_ch1_num = 0;//记录进入中断的次数 uint32_t dma_ch2_num = 0;//记录进入中断的次数 int main(void) { int count = 1; MX_DMA_Init(); rt_thread_mdelay(1000); MX_TIM4_Init(); rt_thread_mdelay(1000); HAL_TIM_PWM_Start_DMA(&htim4, TIM_CHANNEL_1, (uint32_t*)pwm1_buf1, 10); HAL_TIM_PWM_Start_DMA(&htim4, TIM_CHANNEL_2, (uint32_t*)pwm1_buf2, 10); while (count++) { LOG_D("CCR1=%d, CCR2=%d [%d:%d]\r\n", TIM4->CCR1, TIM4->CCR2,dma_ch1_num,dma_ch2_num); } void DMA1_Stream0_IRQHandler(void) { /* USER CODE BEGIN DMA1_Stream0_IRQn 0 */ dma_ch1_num++; /* USER CODE END DMA1_Stream0_IRQn 0 */ HAL_DMA_IRQHandler(&hdma_tim4_ch1); /* USER CODE BEGIN DMA1_Stream0_IRQn 1 */ /* USER CODE END DMA1_Stream0_IRQn 1 */ } /** * @brief This function handles DMA1 stream3 global interrupt. */ void DMA1_Stream3_IRQHandler(void) { /* USER CODE BEGIN DMA1_Stream3_IRQn 0 */ dma_ch2_num++; /* USER CODE END DMA1_Stream3_IRQn 0 */ HAL_DMA_IRQHandler(&hdma_tim4_ch2); /* USER CODE BEGIN DMA1_Stream3_IRQn 1 */ /* USER CODE END DMA1_Stream3_IRQn 1 */ } void HAL_TIM_PWM_PulseFinishedCallback(TIM_HandleTypeDef *htim) { //如果想让dam传输完成后保存最后一个CCR值继续输出PWM,屏蔽以下即可 //如果想只发送一次后就关闭PWM输出,打开即可 #if 1 HAL_TIM_PWM_Stop_DMA(&htim4, TIM_CHANNEL_1); /* 传输完成后手动停止PWM */ HAL_TIM_PWM_Stop_DMA(&htim4, TIM_CHANNEL_2); /* 传输完成后手动停止PWM */ #endif }