|
工作中有时候用到需要对PWM波形进行频率和周期的变化,利用DMA Brust时一个比较好的选择,将ST提供的基于F3的例程改到基于F103实现,没什么难度,但是调试的时候最先使用Normal模式导致不宜观察,后改为Circular模式。代码如下:; n" ^) h( W% l* A& g void TIM1_Init()9 u4 q0 {& ^' _: }4 W& x* | {4 a( t( G2 E) D1 T1 c GPIO_InitTypeDef GPIO_InitStructure;" V) F/ L6 d2 ~6 G; B/ n1 I1 D- D DMA_InitTypeDef DMA_InitStructure;$ v0 Y. o3 C- i5 n" \; M4 C; V 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);0 W1 H1 r* X, s' o+ j /* DMA clock enable */ RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE); /* GPIOA Configuration: Channel 1 as alternate function push-pull */- C5 @8 [5 F# |' D6 p GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;$ g7 P1 A! V2 ?4 y: c2 `1 { GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;9 j5 X) x- {8 ?9 n8 f; ^; m GPIO_Init(GPIOA, &GPIO_InitStructure); 5 v9 u3 I9 W8 Z% W- W- S8 X /* TIM1 DeInit */. M, P) {6 V+ Z! V9 [) ] TIM_DeInit(TIM1);9 d7 g8 S X& X( ~1 a /* DMA1 Channel5 Config */4 L( i+ P4 a9 Z o DMA_DeInit(DMA1_Channel5);0 F0 z' g/ C# ` _* v DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)TIM1_DMAR_ADDRESS; 8 c- B0 _ N" j3 K; j DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)SRC_Buffer; + O/ k% V1 ^' S, y DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;7 l+ Z$ i+ _# q& w" R3 H0 e" c DMA_InitStructure.DMA_BufferSize = 18;! q8 k1 I8 F c1 A8 G* f4 C; q DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;1 l. [' Z" Q9 K# A* n+ k5 u% p DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;: Z: O3 Z, W& ?; ?: \$ Z2 z. V DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord; DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;4 Z$ ?# Q4 q2 U DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;$ c f& q0 J& P DMA_InitStructure.DMA_Priority = DMA_Priority_High;. K6 ~# F. L1 i8 u, ?( b/ T4 o DMA_InitStructure.DMA_M2M = DMA_M2M_Disable; DMA_Init(DMA1_Channel5, &DMA_InitStructure); 3 G( G" C, G4 k7 z) R, q /* Time base configuration */ /* -----------------------------------------------------------------------5 F7 g! p `5 y% i 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:1 I7 v3 x& k2 a6 A0 l7 S - Prescaler = (TIM1CLK / TIM1 counter clock) - 1 SystemCoreClock is set to 72 MHz for Low-density, Medium-density, High-density! G# F- U4 n) N: M! Q7 j# f1 | and Connectivity line devices and to 24 MHz for Low-Density Value line and Medium-Density Value line devices- H" |# Z/ v' C The TIM1 period is 5.8 KHz: TIM1 Frequency = TIM1 counter clock/(ARR + 1) = 24 MHz / 4096 = 5.8KHz KHz5 F8 ?: G2 @" j8 |. K TIM1 Channel1 duty cycle = (TIM1_CCR1/ TIM1_ARR)* 100 = 33.33%+ Q1 ^7 B' w! |/ l; O9 W1 `* C( ^ ----------------------------------------------------------------------- */ TIM_TimeBaseStructure.TIM_Period = 0xFFFF; TIM_TimeBaseStructure.TIM_Prescaler = (uint16_t) (SystemCoreClock / 24000000) - 1; . _. {' k+ n7 A& T" o- V TIM_TimeBaseStructure.TIM_ClockDivision = 0x0; 4 i+ ~; s6 ^1 V8 T3 N4 Q# ? TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure);* K7 n- K$ V9 P" s" z/ j 2 l, ~* j/ A* X, J /* TIM Configuration in PWM Mode */* f4 ^- c) { P% h$ y3 d( ^ TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; 0 U% D% x7 e+ `9 r8 g8 T2 G, t TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; TIM_OCInitStructure.TIM_Pulse = 0xFFF; ! H6 R4 u3 x. I/ Q TIM_OC1Init(TIM1, &TIM_OCInitStructure); /* TIM1 DMAR Base register and DMA Burst Length Config */( J r2 W, {' z# N( c TIM_DMAConfig(TIM1, TIM_DMABase_ARR, TIM_DMABurstLength_6Transfers); /* TIM1 DMA Update enable */, G: A* u1 s; L' d* A5 r: c TIM_DMACmd(TIM1, TIM_DMA_Update, ENABLE);. C9 \: w( i. E& g + I ]! n9 ^6 A! O, t* P /* TIM1 enable */ TIM_Cmd(TIM1, ENABLE); /* TIM1 PWM Outputs Enable */1 c. N, S% v* ~ TIM_CtrlPWMOutputs(TIM1, ENABLE); . S' J- V( @& ` u5 R5 ]4 ` /* DMA1 Channel5 enable */: j! u, V' \& W% i: D2 o) {6 a DMA_Cmd(DMA1_Channel5, ENABLE); /* Wait until DMA1 Channel5 end of Transfer */6 u! |! `9 b4 D+ o1 ?6 g: b4 j while (!DMA_GetFlagStatus(DMA1_FLAG_TC5)) {# o1 A* J' S+ o, |! o. J } } |
| 调试时遇到一个问题,在TIM1-CH1测试通过,但是改成TIM8-CH1的时候却不行,有波形输出但是频率、周期不变,求赐教。 |
| TIM8使用TIM_DMACmd(TIM8, TIM_DMA_CC1, ENABLE);测试OK。 |
| 我现在自己只会产生一个pwm波,还不会精确控制波形个数。我想问一下有没有完整的工程文件,我是初学者,想修改修改能用的。 |
微信公众号
手机版