1949啦网--小小 痛苦,是因为能力和欲望不匹配造成的

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);    }

 







使用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);  	  }

微信扫码关注

更新实时通知

作者:xiao 分类:软件笔记 浏览: