一个DMA向4个PWM的通道传输数据

本文详细介绍了如何使用DMA向TIM3的4个PWM通道连续发送数据,包括DMA配置步骤和如何确保TIM3设置为PWM生成模式。同时,展示了如何通过宏定义控制PWM输出频率,以及中断启用和停止的示例代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一个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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值