15
2025
06

stm32使用PWM+DMA控制呼吸灯与PWM+DMA+TIM控制呼吸灯

使用PWM+DMA+TIM控制呼吸灯,此种办法DMA搬运速度与另外定时器触发周期有关
使用PWM+DMA控制呼吸灯,此种办法DMA搬运速度与PWM周期有关
如下:
此是PWM+DMA
void Pwm_Config(void)
{
   GPIO_InitTypeDef GPIO_InitStructure;
   TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
   TIM_OCInitTypeDef  TIM_OCInitStructure;
	/* TIM3 clock enable */
   RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
   /* GPIOA and GPIOB clock enable */
   RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA 
                          |RCC_APB2Periph_AFIO, ENABLE);
	
   GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_6;
   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
   GPIO_Init(GPIOA, &GPIO_InitStructure);
	GPIO_ResetBits(GPIOA, GPIO_Pin_6);
	
	TIM_TimeBaseStructure.TIM_Period = 500-1;//200hz
	TIM_TimeBaseStructure.TIM_Prescaler = 720-1;//72000000/72=1Mhz
	TIM_TimeBaseStructure.TIM_ClockDivision = 0;
	TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
	TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);
	

	/* Channel 3 Configuration in PWM mode */
	TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
	TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
	TIM_OCInitStructure.TIM_Pulse = pwm_buff[0];
	TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;
	TIM_OC1Init(TIM3, &TIM_OCInitStructure);

	/* TIM3 Update DMA Request enable */
	TIM_DMACmd(TIM3, TIM_DMA_CC1, ENABLE);
    TIM_OC1PreloadConfig(TIM3, TIM_OCPreload_Enable);

    TIM_ARRPreloadConfig(TIM3, ENABLE);

	/* TIM3 counter enable */
	TIM_Cmd(TIM3, ENABLE);

}
Dma_Config()
{
    DMA_InitTypeDef dma_InitStruct;
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1,ENABLE);
/* DMA1 Channel5 Config */
DMA_DeInit(DMA1_Channel6);
    dma_InitStruct.DMA_PeripheralBaseAddr = (uint32_t)&TIM3->CCR1;//当内存传内存时可看作数据的源
    dma_InitStruct.DMA_MemoryBaseAddr = (uint32_t)pwm_buff;
    dma_InitStruct.DMA_DIR = DMA_DIR_PeripheralDST;
    dma_InitStruct.DMA_BufferSize = PWM_SIZE; //传输数目
    dma_InitStruct.DMA_PeripheralInc = DMA_PeripheralInc_Disable; //外设地址增量模式
    dma_InitStruct.DMA_MemoryInc = DMA_MemoryInc_Enable;
    dma_InitStruct.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;
    dma_InitStruct.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;
    dma_InitStruct.DMA_Mode = DMA_Mode_Circular;
    dma_InitStruct.DMA_M2M = DMA_M2M_Disable;
    dma_InitStruct.DMA_Priority = DMA_Priority_High;
    DMA_Init(DMA1_Channel6,&dma_InitStruct);

    DMA_Cmd(DMA1_Channel6, ENABLE);

}

 

Snipaste_2025-06-15_17-58-13.jpg




使用PWM+DMA+TIM控制呼吸灯,此种办法DMA搬运速度与另外定时器触发周期有关
#include "pwm.h"
#include "math.h"


extern volatile uint16_t new_pwm;
uint16_t pwm_buff[PWM_SIZE]={0};

void Led_PwmBuff()
{
	int i=0;
	for( i=0;i<(PWM_SIZE/2);i++)
	{
		pwm_buff[i]=i;
	}
	for(;i<PWM_SIZE;i++)
	{
		pwm_buff[i]=PWM_SIZE-i;
	}	
}
void Pwm_Config(void)
{
   GPIO_InitTypeDef GPIO_InitStructure;
   TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
   TIM_OCInitTypeDef  TIM_OCInitStructure;
	/* TIM3 clock enable */
   RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
   /* GPIOA and GPIOB clock enable */
   RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA 
                          |RCC_APB2Periph_AFIO, ENABLE);
	
   GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_6;
   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
   GPIO_Init(GPIOA, &GPIO_InitStructure);
   GPIO_ResetBits(GPIOA, GPIO_Pin_6);
	
	TIM_TimeBaseStructure.TIM_Period = 500-1;//2khz
	TIM_TimeBaseStructure.TIM_Prescaler = 72-1;//72000000/72=1Mhz
	TIM_TimeBaseStructure.TIM_ClockDivision = 0;
	TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
	TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);
	

	/* Channel 3 Configuration in PWM mode */
	TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
	TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
	TIM_OCInitStructure.TIM_Pulse = pwm_buff[0];
	TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;
	TIM_OC1Init(TIM3, &TIM_OCInitStructure);


    TIM_OC1PreloadConfig(TIM3, TIM_OCPreload_Enable);

    TIM_ARRPreloadConfig(TIM3, ENABLE);

	/* TIM3 counter enable */
	TIM_Cmd(TIM3, ENABLE);

}

void Time_init()//为了控制dma搬运
{
	TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
	TIM_OCInitTypeDef  TIM_OCInitStructure;
	NVIC_InitTypeDef NVIC_InitStructure;
	/* TIM2 clock enable */
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);

	TIM_TimeBaseStructure.TIM_Period = 500-1;//200hz
	TIM_TimeBaseStructure.TIM_Prescaler = 720-1;//72000000/72=1Mhz
	TIM_TimeBaseStructure.TIM_ClockDivision = 0;
	TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
	TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);


	NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
	NVIC_Init(&NVIC_InitStructure); 
	TIM_DMACmd(TIM2, TIM_DMA_Update, ENABLE);
	TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE);
	/* TIM3 counter enable */
	TIM_Cmd(TIM2, ENABLE);
	
}

void TIM2_IRQHandler()
{
	if(TIM_GetITStatus(TIM2,TIM_IT_Update)==SET)
	{
		TIM3->CCR1=new_pwm;
		TIM_ClearITPendingBit(TIM2,TIM_IT_Update);
	}
}

void Dma_Config()
{
    DMA_InitTypeDef dma_InitStruct;
	RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1,ENABLE);
	 /* DMA1 Channel5 Config */
	DMA_DeInit(DMA1_Channel2);
    dma_InitStruct.DMA_PeripheralBaseAddr = (uint32_t)&new_pwm;
    dma_InitStruct.DMA_MemoryBaseAddr = (uint32_t)pwm_buff;
    dma_InitStruct.DMA_DIR = DMA_DIR_PeripheralDST;
    dma_InitStruct.DMA_BufferSize = PWM_SIZE; 
    dma_InitStruct.DMA_PeripheralInc = DMA_PeripheralInc_Disable; 
    dma_InitStruct.DMA_MemoryInc = DMA_MemoryInc_Enable;
    dma_InitStruct.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;
    dma_InitStruct.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;
    dma_InitStruct.DMA_Mode = DMA_Mode_Circular;
    dma_InitStruct.DMA_M2M = DMA_M2M_Disable;
    dma_InitStruct.DMA_Priority = DMA_Priority_High;
    DMA_Init(DMA1_Channel2,&dma_InitStruct);

    DMA_Cmd(DMA1_Channel2, ENABLE);
	
}

Snipaste_2025-06-15_18-05-03.jpg

gzh

微信扫码关注

更新实时通知

« 上一篇

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。