
工作中有时候用到需要对PWM波形进行频率和周期的变化,利用DMA Brust时一个比较好的选择,将ST提供的基于F3的例程改到基于F103实现,没什么难度,但是调试的时候最先使用Normal模式导致不宜观察,后改为Circular模式。代码如下:5 v* J, d6 Y; a( r& S0 a8 |/ P void TIM1_Init()) L* J. y; d" v, ? {% U3 M* b9 T; k( j$ ]3 q& m GPIO_InitTypeDef GPIO_InitStructure;! i7 B0 k# w% B" s4 K& A 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};. J5 k+ v7 [7 t3 Y8 A /* TIM1 and GPIOA clock enable */ RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1 | RCC_APB2Periph_GPIOA, ENABLE);% L; K8 L2 s* t * a1 c# j* U: p! ?% d# ? /* DMA clock enable */ RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);( i& N! k/ z- N/ x4 m5 x / v0 i$ W+ g; L4 T /* GPIOA Configuration: Channel 1 as alternate function push-pull */! M3 |0 z. U- h$ Q/ H GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;- O8 d( o# k3 g# H" p# C GPIO_Init(GPIOA, &GPIO_InitStructure); /* TIM1 DeInit */ TIM_DeInit(TIM1); /* DMA1 Channel5 Config */ DMA_DeInit(DMA1_Channel5);) W: ?, E' I, X; k; o& X7 m4 ^* [ DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)TIM1_DMAR_ADDRESS; 1 I$ C& A# y7 M: j$ M! S( E DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)SRC_Buffer; 3 Z) \# ^* C+ _3 G- H; ?$ G9 |; k DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST; DMA_InitStructure.DMA_BufferSize = 18;/ U% u9 T, w$ b6 G3 O) j DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;$ i3 @) `/ l5 O: q+ Q, s DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;3 z1 Z. i5 ` W$ X9 s: u* M( O DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;% T7 j5 d ^ T4 Q DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;% N; Y }- n2 M 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); 3 p( Y3 q3 ~ @" b# \" ?3 ^# u2 W /* 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:" a% b f, ~3 d7 l5 N - Prescaler = (TIM1CLK / TIM1 counter clock) - 1 SystemCoreClock is set to 72 MHz for Low-density, Medium-density, High-density& M4 L, _& R0 X and Connectivity line devices and to 24 MHz for Low-Density Value line and( x V) l* a' v% M Medium-Density Value line devices1 E( f' H ~( L$ D5 C9 H# T 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; W; K% ~+ ? m' N TIM_TimeBaseStructure.TIM_ClockDivision = 0x0; TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure);5 H7 y& \) ?: F /* TIM Configuration in PWM Mode */ TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; ( N4 K/ `' n* s TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; TIM_OCInitStructure.TIM_Pulse = 0xFFF; * R2 U& a" T5 a TIM_OC1Init(TIM1, &TIM_OCInitStructure); 0 W8 \" ^7 d. q; E /* TIM1 DMAR Base register and DMA Burst Length Config */ TIM_DMAConfig(TIM1, TIM_DMABase_ARR, TIM_DMABurstLength_6Transfers);/ a: A2 @: D# I) [9 l) M /* TIM1 DMA Update enable */ TIM_DMACmd(TIM1, TIM_DMA_Update, ENABLE);, Q+ X3 D" w4 _% J& A /* TIM1 enable */ u; b2 p# q0 A. u; } TIM_Cmd(TIM1, ENABLE);- N9 {7 \6 c4 p6 Z R$ P8 b /* TIM1 PWM Outputs Enable */) _' e$ z- z+ f. N8 a. w TIM_CtrlPWMOutputs(TIM1, ENABLE); 8 Y- @5 i/ p/ s, f* w /* DMA1 Channel5 enable */7 {! N- p" Q( D$ `7 C* A DMA_Cmd(DMA1_Channel5, ENABLE); /* Wait until DMA1 Channel5 end of Transfer */4 F( e) d& y; T" _ while (!DMA_GetFlagStatus(DMA1_FLAG_TC5)) { } }5 M' v$ V9 ~7 N5 G |
调试时遇到一个问题,在TIM1-CH1测试通过,但是改成TIM8-CH1的时候却不行,有波形输出但是频率、周期不变,求赐教。 |
TIM8使用TIM_DMACmd(TIM8, TIM_DMA_CC1, ENABLE);测试OK。 |
我现在自己只会产生一个pwm波,还不会精确控制波形个数。我想问一下有没有完整的工程文件,我是初学者,想修改修改能用的。 |