你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM32+PWM+DMA实现周期、频率可变的波形输出

[复制链接]
z258121131 发布时间:2016-11-21 17:25
工作中有时候用到需要对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;
" X' T- r5 w" b/ ITIM_OCInitTypeDef        TIM_OCInitStructure;

/ M) K0 x+ |" J* d1 F  uint16_t SRC_Buffer[9] = {4000-1,1,800,10000-1,0,8500,4000-1,2,2000};
- p* e0 ~4 B# S* [) T  /* TIM1 and GPIOA clock enable */
( Z' M, y" I) s  RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1 | RCC_APB2Periph_GPIOA, ENABLE);0 W1 H1 r* X, s' o+ j

! P. i" Y- B6 Z+ s  D  ]  F  /* DMA clock enable */
8 f  H* g2 N2 r* E  RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);
9 H# }" h# v% c. L  
6 q, M* v! ]5 V' F8 o1 U/ F8 V  /* GPIOA Configuration: Channel 1 as alternate function push-pull */- C5 @8 [5 F# |' D6 p
  GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_8;
% ]0 A' k8 o$ o+ n  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);  
3 J  ^& q9 l0 {+ I: O, Q7 X9 t& `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

8 @3 \4 N& c1 W- N* ^% c  /* DMA1 Channel5 Config */4 L( i+ P4 a9 Z  o
  DMA_DeInit(DMA1_Channel5);0 F0 z' g/ C# `  _* v

, S! J2 V5 u0 q1 m1 Z  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;
  F$ a7 b7 O+ A8 g9 C& y& Y  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;
  ?) T" ]0 I. O) H  V$ f# Q4 Z  DMA_Init(DMA1_Channel5, &DMA_InitStructure);
; {8 u" ?7 {; c: t! E  k- [& W  3 G( G" C, G4 k7 z) R, q
  /* Time base configuration */
4 O9 v; k& c) R2 x! J  /* -----------------------------------------------------------------------5 F7 g! p  `5 y% i
    TIM1 Configuration: generate 1 PWM signal using the DMA burst mode:
- `" Q, f" N) X& O3 d3 b1 @  k3 d( d    The TIM1CLK frequency is set to SystemCoreClock (Hz), to get TIM1 counter
1 y) u8 O; J( g7 f) {: v    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
7 v: ?6 h: z) {( ^    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
) s% Y5 X8 @3 H, I4 z9 p0 ^% v    Medium-Density Value line devices- H" |# Z/ v' C

: ]# u/ {5 T" r! n8 T# W    The TIM1 period is 5.8 KHz: TIM1 Frequency = TIM1 counter clock/(ARR + 1)
! r/ k6 Q4 }8 S. D8 r! E( c/ t, |                                               = 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( ^
  ----------------------------------------------------------------------- */  
" P& f2 u, S# d( ?  TIM_TimeBaseStructure.TIM_Period = 0xFFFF;         
; Y* V8 ^6 e/ W3 S5 V% a3 E  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;   
( g8 Y& H# T, [- O1 [  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;         
7 i* C; l: C; h9 q% y( z  TIM_OCInitStructure.TIM_Pulse = 0xFFF;  ! H6 R4 u3 x. I/ Q
  TIM_OC1Init(TIM1, &TIM_OCInitStructure);
- H) \3 V1 |. M0 Z0 v
. {' M) G6 N1 f9 D: Y9 L' b' N1 ~! l  /* TIM1 DMAR Base register and DMA Burst Length Config */( J  r2 W, {' z# N( c
  TIM_DMAConfig(TIM1, TIM_DMABase_ARR, TIM_DMABurstLength_6Transfers);
' R$ \8 i6 B6 w; J% ?7 S& |6 i, m% ^
0 x0 L# @1 R. E6 W+ t  /* 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 */
% b! z# U# y" J" b# S9 y  TIM_Cmd(TIM1, ENABLE);
; O) r' m: m) K7 n/ U1 O/ e% x! f  
1 F9 A/ s! t1 Y4 w  /* TIM1 PWM Outputs Enable */1 c. N, S% v* ~
  TIM_CtrlPWMOutputs(TIM1, ENABLE);
3 i- g& Q  \3 g3 F$ L. S' J- V( @& `  u5 R5 ]4 `
  /* DMA1 Channel5 enable */: j! u, V' \& W% i: D2 o) {6 a
  DMA_Cmd(DMA1_Channel5, ENABLE);
9 U; x8 b7 F) b' s
& J' G. F* s2 H! E# F: Y* }  /* Wait until DMA1 Channel5 end of Transfer */6 u! |! `9 b4 D+ o1 ?6 g: b4 j
  while (!DMA_GetFlagStatus(DMA1_FLAG_TC5))
0 O# v& {4 A+ e: f6 a- n9 c. I: R  {# o1 A* J' S+ o, |! o. J
  }
+ B& V: C9 j. n- Y$ T# X) s}

5 l: `6 z  }, c. G; B
赞 收藏 3 评论3 发布时间:2016-11-21 17:25

举报

3个回答
z258121131 回答时间:2016-11-21 17:27:58
调试时遇到一个问题,在TIM1-CH1测试通过,但是改成TIM8-CH1的时候却不行,有波形输出但是频率、周期不变,求赐教。
z258121131 回答时间:2016-11-24 09:55:05
TIM8使用TIM_DMACmd(TIM8, TIM_DMA_CC1, ENABLE);测试OK。
冬天下雪 回答时间:2017-7-31 15:26:49
我现在自己只会产生一个pwm波,还不会精确控制波形个数。我想问一下有没有完整的工程文件,我是初学者,想修改修改能用的。

所属标签

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版