
工作中有时候用到需要对PWM波形进行频率和周期的变化,利用DMA Brust时一个比较好的选择,将ST提供的基于F3的例程改到基于F103实现,没什么难度,但是调试的时候最先使用Normal模式导致不宜观察,后改为Circular模式。代码如下: void TIM1_Init() { GPIO_InitTypeDef GPIO_InitStructure; DMA_InitTypeDef DMA_InitStructure; TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_OCInitTypeDef TIM_OCInitStructure; uint16_t SRC_Buffer[9] = {4000-1,1,800,10000-1,0,8500,4000-1,2,2000}; /* TIM1 and GPIOA clock enable */ RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1 | RCC_APB2Periph_GPIOA, ENABLE); /* DMA clock enable */ RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE); /* GPIOA Configuration: Channel 1 as alternate function push-pull */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure); /* TIM1 DeInit */ TIM_DeInit(TIM1); /* DMA1 Channel5 Config */ DMA_DeInit(DMA1_Channel5); DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)TIM1_DMAR_ADDRESS; DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)SRC_Buffer; DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST; DMA_InitStructure.DMA_BufferSize = 18; DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord; DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord; DMA_InitStructure.DMA_Mode = DMA_Mode_Circular; DMA_InitStructure.DMA_Priority = DMA_Priority_High; DMA_InitStructure.DMA_M2M = DMA_M2M_Disable; DMA_Init(DMA1_Channel5, &DMA_InitStructure); /* Time base configuration */ /* ----------------------------------------------------------------------- TIM1 Configuration: generate 1 PWM signal using the DMA burst mode: The TIM1CLK frequency is set to SystemCoreClock (Hz), to get TIM1 counter clock at 24 MHz the Prescaler is computed as following: - Prescaler = (TIM1CLK / TIM1 counter clock) - 1 SystemCoreClock is set to 72 MHz for Low-density, Medium-density, High-density and Connectivity line devices and to 24 MHz for Low-Density Value line and Medium-Density Value line devices The TIM1 period is 5.8 KHz: TIM1 Frequency = TIM1 counter clock/(ARR + 1) = 24 MHz / 4096 = 5.8KHz KHz TIM1 Channel1 duty cycle = (TIM1_CCR1/ TIM1_ARR)* 100 = 33.33% ----------------------------------------------------------------------- */ TIM_TimeBaseStructure.TIM_Period = 0xFFFF; TIM_TimeBaseStructure.TIM_Prescaler = (uint16_t) (SystemCoreClock / 24000000) - 1; TIM_TimeBaseStructure.TIM_ClockDivision = 0x0; TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure); /* TIM Configuration in PWM Mode */ TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; TIM_OCInitStructure.TIM_Pulse = 0xFFF; TIM_OC1Init(TIM1, &TIM_OCInitStructure); /* TIM1 DMAR Base register and DMA Burst Length Config */ TIM_DMAConfig(TIM1, TIM_DMABase_ARR, TIM_DMABurstLength_6Transfers); /* TIM1 DMA Update enable */ TIM_DMACmd(TIM1, TIM_DMA_Update, ENABLE); /* TIM1 enable */ TIM_Cmd(TIM1, ENABLE); /* TIM1 PWM Outputs Enable */ TIM_CtrlPWMOutputs(TIM1, ENABLE); /* DMA1 Channel5 enable */ DMA_Cmd(DMA1_Channel5, ENABLE); /* Wait until DMA1 Channel5 end of Transfer */ while (!DMA_GetFlagStatus(DMA1_FLAG_TC5)) { } } |
调试时遇到一个问题,在TIM1-CH1测试通过,但是改成TIM8-CH1的时候却不行,有波形输出但是频率、周期不变,求赐教。 |
TIM8使用TIM_DMACmd(TIM8, TIM_DMA_CC1, ENABLE);测试OK。 |
我现在自己只会产生一个pwm波,还不会精确控制波形个数。我想问一下有没有完整的工程文件,我是初学者,想修改修改能用的。 |