使用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);
}
微信扫码关注
更新实时通知

