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

STM32MED1开发板例程解析(二):定时器的PWM输出

[复制链接]
Cody-2045860 发布时间:2013-10-15 15:40
 
% o( J* [9 K. d# D2 Y7 ]本例程出自STM32MED1开发板附带光盘,其工程目录路径为:\Code Package\Peripheral Devices\06 TIM\0603_PWM_Output
/ [( ?( b+ U$ w6 K5 ^  @0 X % U5 ^$ j" X" X' D; j1 M" ?, g0 |
高级定时器TIM1的通道1位于GPIOA.8引脚,此管脚正好与开发板上LED1相连,这样就可以通过观察LED1亮度变化来判断TIM1PWM输出波形变化情况。
! k- r6 s( C; J$ d通过调用函数TIM1_PWMOutputConfig()可对TIM1PWM输出进行配置。其代码定义如下:
4 r, T1 X- J# A; l3 ^2 ? 6 k! ]+ y, y& G' O7 B, u
void TIM1_PWMOutputConfig(u16 Period)- d) I, y4 u6 O! Z: u. B( X+ l* j+ ^) B
{
! e4 m8 x! L" ?  TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
+ B$ e9 @: T/ q6 C3 o; b  GPIO_InitTypeDef GPIO_InitStructure;
$ o' Q; o9 \, P. C7 _  TIM_OCInitTypeDef  TIM_OCInitStructure;
  `$ q  _9 X$ M! {  NVIC_InitTypeDef NVIC_InitStructure;
) P$ l0 H# M" d  } 
7 C5 W/ d% k3 l. X  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_TIM1, ENABLE);     // 1). Q: A; ]3 S0 ]
 
, M- N& U+ r/ d) z1 O% p  // (2
: M9 l5 s. b/ l5 s5 N  GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_8;3 |$ B& O4 J) s8 ?
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;+ R3 l( R2 _# G5 g. N1 @
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;9 |( N- F, D% U5 Q! g/ M4 U
  GPIO_Init(GPIOA, &GPIO_InitStructure);% a4 H# {; ^, V4 O% j
  // 2)6 h! c  N: G" x" C
 
" K, V4 ^0 r1 K2 n0 _  // (3
% {3 c+ `, Z: N: \" p5 u  TIM_TimeBaseStructure.TIM_Period = Period;! r5 X) M3 F* o# _( q' e! h. ^% L
  TIM_TimeBaseStructure.TIM_Prescaler = (u16)(SystemCoreClock / 100000) - 1;
8 C8 ]3 O6 v% g' I+ V4 T! l  TIM_TimeBaseStructure.TIM_ClockDivision = 0;
* i6 }& E: J" R) G# X' c  TIM_TimeBaseStructure.TIM_RepetitionCounter = 0;
- y9 I: }" t- O8 D  TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;# D& P& |! a% H* U6 p. S
  TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure);
/ l, _6 g- p/ r  // 3)2 a, @$ T& G: B6 @& H8 R* r/ C
 - \4 u. B! _1 b+ ~
  // (40 ~+ j* ~1 w: K9 I& e4 F0 u
  TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2;& ~$ H' T  b: L  a- r. Y! e
  TIM_OCInitStructure.TIM_Pulse = 0;9 S$ E/ M& T6 Z2 M
  TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;4 y0 ^$ f+ n1 J
  TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Disable;
" v! P& [+ G; q  j+ Y  TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;: M7 T3 |% J; Z8 |1 X& v" F6 V
  TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_High;   f* \7 W+ O9 g/ R  G
  TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Reset;
3 M# h. D. Y: P1 I+ L# v) m" F% z  TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCNIdleState_Reset;0 F! L4 n/ o( N8 y; I* t  `% u* Z
  TIM_OC1Init(TIM1, &TIM_OCInitStructure);) m- s9 d  L) t" k  b5 Y
  // 4)7 g4 ^3 }- b$ N6 i( U8 \% O+ x/ X
 
& h' d5 ^" J- l0 C: m3 W$ \  TIM_OC1PreloadConfig(TIM1, TIM_OCPreload_Disable);       // 5)" E5 ]1 X9 ~3 G; ^. Y9 l' P/ v
 " y* y& O/ y1 H8 v) a
  TIM_ClearFlag(TIM1, TIM_FLAG_Update);                       // 6)
7 n0 P* ^4 D6 V. ]; s  TIM_ITConfig(TIM1, TIM_IT_Update, ENABLE);                 // 7)5 L) B5 P6 l, K" Z1 }: l7 Q0 }! a- ~
  TIM_UpdateRequestConfig(TIM1, TIM_UpdateSource_Global); // 8)( f2 u0 D) b! s
 + U5 a, M" z/ ?$ C* v
  // (9
1 m# c' C0 G( e5 e  NVIC_InitStructure.NVIC_IRQChannel = TIM1_UP_IRQn;7 J( `" L3 p1 x6 J0 V" W* z& H) C
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;1 R; w$ A# E" r4 _; E# O5 K
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;% }* ?2 f( ]" k, d) C- ]
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;- D% {  e) u# m
  NVIC_Init(&NVIC_InitStructure);
, N# K/ p9 M( X  // 9)
$ D. `5 w# E, H& l 
& E/ U! z. ?# i6 t# D  TIM_CtrlPWMOutputs(TIM1, ENABLE);  // 10)
! n) N4 C" m9 w. V( l7 l ' J+ u2 u$ M$ c' @
  TIM_Cmd(TIM1, ENABLE);  // 11)
3 D! o' n, R! D9 W- H7 [5 P}/ r6 ~: `* \$ X/ z8 Z
 : [# n9 z$ U* u9 t
代码行1)开启GPIOATIM1外设的时钟。代码段2)将PA.8管脚配置为复用推挽输出,因此TIM1产生的PWM信号能输出到PA.8管脚。代码段3)是对TIM1的时间基配置。代码段4)配置TIM1的输出比较通道1,将其配置为PWM模式2;起始寄存器TIM1_CCR1的值设为0;开启OC1的输出状态,关闭OC1的互补输出状态。代码行5)关闭OC1通道的预装载功能,使得每次向捕获/比较寄存器中写入的数据立即生效。代码行6)是清除TIM1的更新标志位。代码行7)是开启TIM1的更新中断,代码行8)将更新事件源限制为计时器的上溢或下溢。代码行9)是对TIM1的中断通道进行初始化。代码行10)是开启TIM1PWM输出。代码行11)是使能TIM1外设。7 u6 P, w) j9 m+ H
TIM1计数器的值达到最大时就会产生更新中断,其中断处理函数定义如下:
' f5 q' z! A/ e2 X6 k 6 q& ?# u( y2 @7 Z  D1 {
void TIM1_UP_IRQHandler(void)
. N1 X) H4 F- L5 Y+ d" M- M) b{
. |* o9 k% p" H, M' @  if (TIM_GetITStatus(TIM1, TIM_IT_Update) != RESET)
. k. ?- z) o+ C4 w% v  {( x5 `0 A4 V' p
6 S0 y+ l0 N0 i: b  _4 p
<span style="color: rgb(0, 0, 255);">    if ((CompareValue > PRELOAD_VALUE - INCREMENTS) || (CompareValue
收藏 评论1 发布时间:2013-10-15 15:40

举报

1个回答
沐紫 回答时间:2013-10-15 15:42:57

RE:STM32MED1开发板例程解析(二):定时器的PWM输出

多谢分享,看样子楼主有一个系列。建议把(一)的帖子地址也放在帖子中

所属标签

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版