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

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

[复制链接]
z258121131 发布时间:2016-11-21 17:25
工作中有时候用到需要对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;
; S6 ]/ a; X0 ?. _. FTIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
8 Z9 `: H2 L$ nTIM_OCInitTypeDef        TIM_OCInitStructure;

( F7 d- `- }4 R+ G4 Y0 L2 I  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 */
# T, Q' b% j+ Z  RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1 | RCC_APB2Periph_GPIOA, ENABLE);% L; K8 L2 s* t
* a1 c# j* U: p! ?% d# ?
  /* DMA clock enable */
6 \+ k/ P* k) N2 i$ w! \) J  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;
# U: s. y9 V  _9 [" p8 a  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
/ a  h; r0 V$ A% T2 e) D3 o  v7 h  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;- O8 d( o# k3 g# H" p# C
  GPIO_Init(GPIOA, &GPIO_InitStructure);  
2 B# f2 @  f" w8 P$ X
0 }! d. P- @6 m& k' a  /* TIM1 DeInit */
. M1 U8 Q+ G" O+ s! ^: U0 M  TIM_DeInit(TIM1);
' v" x( h/ ~/ r5 h/ x8 z
, E. R+ V5 P) I" i* P  /* DMA1 Channel5 Config */
5 Q% w- t# I! T/ J  DMA_DeInit(DMA1_Channel5);) W: ?, E' I, X; k; o& X7 m4 ^* [

2 L  {# s( W( W, b  y) Z  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;
! n) E% S& \& u2 I  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;
, U( a5 t; E2 z6 E, S  DMA_InitStructure.DMA_Priority = DMA_Priority_High;
4 a! h- {* T; D; X7 L  DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
, [/ N. p4 m9 C; v' G  DMA_Init(DMA1_Channel5, &DMA_InitStructure);
4 w9 B: {8 v4 P2 C& W' s  3 p( Y3 q3 ~  @" b# \" ?3 ^# u2 W
  /* Time base configuration */
3 `8 x0 C* X8 a- f7 o2 b& R  /* -----------------------------------------------------------------------
( P, A: \2 h, F) C4 A, U    TIM1 Configuration: generate 1 PWM signal using the DMA burst mode:
- K  D' z* P3 u, o    The TIM1CLK frequency is set to SystemCoreClock (Hz), to get TIM1 counter
) X/ d  a$ r  Y; j' r    clock at 24 MHz the Prescaler is computed as following:" a% b  f, ~3 d7 l5 N
     - Prescaler = (TIM1CLK / TIM1 counter clock) - 1
+ m. T2 d' w( D2 ^" N" Q3 t/ ^1 n* a; M    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

' N: K5 H. V% e4 ?2 q2 P: {  F    The TIM1 period is 5.8 KHz: TIM1 Frequency = TIM1 counter clock/(ARR + 1)
' r/ L! f4 i4 D' q                                               = 24 MHz / 4096 = 5.8KHz KHz
* `' b4 }0 |. g$ T    TIM1 Channel1 duty cycle = (TIM1_CCR1/ TIM1_ARR)* 100 = 33.33%
, l1 |: _: f( a/ `' v" I7 d5 _2 l  ----------------------------------------------------------------------- */  
, }3 E5 e. B; M2 g+ ?* n/ Q, |  TIM_TimeBaseStructure.TIM_Period = 0xFFFF;         
6 S+ f& P7 _( l* Z4 D" {  G4 _8 Y  TIM_TimeBaseStructure.TIM_Prescaler = (uint16_t) (SystemCoreClock / 24000000) - 1;         W; K% ~+ ?  m' N
  TIM_TimeBaseStructure.TIM_ClockDivision = 0x0;   
/ O) @+ c/ ^" _& \$ O  U( c  TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;   
, C0 V& s9 ]. W) Z: f  TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure);5 H7 y& \) ?: F

+ ~3 z7 h  n; C3 B2 ~; j  /* TIM Configuration in PWM Mode */
) j2 _% m4 C/ Z  TIM_OCInitStructure.TIM_OCMode =  TIM_OCMode_PWM1;    ( N4 K/ `' n* s
  TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;         
8 T* q9 H9 o- ~  TIM_OCInitStructure.TIM_Pulse = 0xFFF;  * R2 U& a" T5 a
  TIM_OC1Init(TIM1, &TIM_OCInitStructure);
& q7 ^. J4 ~+ p( l1 N" ^) n0 W8 \" ^7 d. q; E
  /* TIM1 DMAR Base register and DMA Burst Length Config */
7 F% v6 ^  C6 X5 C3 y  TIM_DMAConfig(TIM1, TIM_DMABase_ARR, TIM_DMABurstLength_6Transfers);/ a: A2 @: D# I) [9 l) M

/ z, f$ k- D  e6 @0 s7 c  /* TIM1 DMA Update enable */
* l) }( g) u# y. T/ ~7 t  TIM_DMACmd(TIM1, TIM_DMA_Update, ENABLE);, Q+ X3 D" w4 _% J& A

9 R2 z, B, j' W2 [6 G& E5 C  /* TIM1 enable */  u; b2 p# q0 A. u; }
  TIM_Cmd(TIM1, ENABLE);- N9 {7 \6 c4 p6 Z  R$ P8 b
  
. A  I* ?7 @# _& Y& l  /* TIM1 PWM Outputs Enable */) _' e$ z- z+ f. N8 a. w
  TIM_CtrlPWMOutputs(TIM1, ENABLE);
9 @* u  ?6 R0 }1 \8 Y- @5 i/ p/ s, f* w
  /* DMA1 Channel5 enable */7 {! N- p" Q( D$ `7 C* A
  DMA_Cmd(DMA1_Channel5, ENABLE);
# [$ i' H( }7 z
7 @4 u2 [( ?' J( b% M  /* Wait until DMA1 Channel5 end of Transfer */4 F( e) d& y; T" _
  while (!DMA_GetFlagStatus(DMA1_FLAG_TC5))
) o) B0 P3 f) ~  {
/ I* \% y9 U5 \  }
" Q) r) J$ z2 g6 c}
5 M' v$ V9 ~7 N5 G
收藏 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管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版