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

微信扫码关注
更新实时通知