一个DMA向4个PWM的通道传输数据
定时器的通道一定要配置成**PWM生成通道**才可以,
配置成 生成PWM不输出 在程序中是开启不了的。
DMA配置:
循环发送,连续不断的向外发送,只需初始化时开启一次。
外设地址增加,4个通道
内存地址增加,4个数据
/* TIM3 DMA Init */
/* TIM3_CH1_TRIG Init */
hdma_tim3_ch1_trig.Instance = DMA1_Channel6;
hdma_tim3_ch1_trig.Init.Direction = DMA_MEMORY_TO_PERIPH;
hdma_tim3_ch1_trig.Init.PeriphInc = DMA_PINC_ENABLE;
hdma_tim3_ch1_trig.Init.MemInc = DMA_MINC_ENABLE;
hdma_tim3_ch1_trig.Init.PeriphDataAlignment = DMA_PDATAALIGN_WORD;
hdma_tim3_ch1_trig.Init.MemDataAlignment = DMA_MDATAALIGN_WORD;
hdma_tim3_ch1_trig.Init.Mode = DMA_CIRCULAR;
hdma_tim3_ch1_trig.Init.Priority = DMA_PRIORITY_HIGH;
if (HAL_DMA_Init(&hdma_tim3_ch1_trig) != HAL_OK)
{
Error_Handler();
}
/* Several peripheral DMA handle pointers point to the same DMA handle.
Be aware that there is only one channel to perform all the requested DMAs. */
__HAL_LINKDMA(tim_baseHandle,hdma[TIM_DMA_ID_CC1],hdma_tim3_ch1_trig);
__HAL_LINKDMA(tim_baseHandle,hdma[TIM_DMA_ID_TRIGGER],hdma_tim3_ch1_trig);
PWM.c
#include "main.h"
#include "PWM.H"
#include "tim.h"
u32 pwm[4]={200,200,200,200};
void Pwm_Strat()
{
HAL_TIM_PWM_Start(&htim3,TIM_CHANNEL_1);
HAL_TIM_PWM_Start(&htim3,TIM_CHANNEL_2);
HAL_TIM_PWM_Start(&htim3,TIM_CHANNEL_3);
HAL_TIM_PWM_Start(&htim3,TIM_CHANNEL_4);
HAL_TIM_PWM_Start_DMA(&htim3,TIM_CHANNEL_1,&pwm[0],4);
}
void Pwm_Stop()
{
/*
HAL_TIM_PWM_Stop(&htim3,TIM_CHANNEL_1);
HAL_TIM_PWM_Stop(&htim3,TIM_CHANNEL_2);
HAL_TIM_PWM_Stop(&htim3,TIM_CHANNEL_3);
HAL_TIM_PWM_Stop(&htim3,TIM_CHANNEL_4);
*/
HAL_TIM_PWM_Stop_DMA(&htim3,TIM_CHANNEL_1);
HAL_TIM_PWM_Stop_DMA(&htim3,TIM_CHANNEL_2);
HAL_TIM_PWM_Stop_DMA(&htim3,TIM_CHANNEL_3);
HAL_TIM_PWM_Stop_DMA(&htim3,TIM_CHANNEL_4);
}
PWM.h
#ifndef _PWM_H
#define _PWM_H
#include "tim.h"
extern void Pwm_Strat();
extern void Pwm_Stop();
extern u32 pwm[4];
/*************使用时只需改下面a的值******************/
//不用DMA:
// #define Pwm1(a) __HAL_TIM_SET_COMPARE(&htim3,TIM_CHANNEL_1,(a))
// #define Pwm2(a) __HAL_TIM_SET_COMPARE(&htim3,TIM_CHANNEL_2,(a))
// #define Pwm3(a) __HAL_TIM_SET_COMPARE(&htim3,TIM_CHANNEL_3,(a))
// #define Pwm4(a) __HAL_TIM_SET_COMPARE(&htim3,TIM_CHANNEL_4,(a))
//用DMA
#define Pwm1(a) (pwm[0]=(u32)(a))
#define Pwm2(a) (pwm[1]=(u32)(a))
#define Pwm3(a) (pwm[2]=(u32)(a))
#define Pwm4(a) (pwm[3]=(u32)(a))
#endif