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

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

[复制链接]
Cody-2045860 发布时间:2013-10-15 15:40
 5 h' g* D( m( B- Z
本例程出自STM32MED1开发板附带光盘,其工程目录路径为:\Code Package\Peripheral Devices\06 TIM\0603_PWM_Output: @+ t7 O& _1 R3 K( b6 K# G* }, P
 ; A: S& N3 O2 i/ T/ O% N* j) U
高级定时器TIM1的通道1位于GPIOA.8引脚,此管脚正好与开发板上LED1相连,这样就可以通过观察LED1亮度变化来判断TIM1PWM输出波形变化情况。. X' ]* `0 s9 T3 \9 e; S& r
通过调用函数TIM1_PWMOutputConfig()可对TIM1PWM输出进行配置。其代码定义如下:' T3 ]. t; h( b! `/ O- f8 O
 3 l2 A! ?5 j, i* N7 e
void TIM1_PWMOutputConfig(u16 Period)
: }  A( k, H) K" W6 m6 H{1 E1 }" v/ W  s
  TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
: h! d7 M  T0 H$ P8 }& }' i: U7 s  GPIO_InitTypeDef GPIO_InitStructure;
: ]1 ^2 `& K* z( g2 o  TIM_OCInitTypeDef  TIM_OCInitStructure;
) Y8 m! c+ D- E  NVIC_InitTypeDef NVIC_InitStructure;
  R# {# N- e8 O! I0 u) O* Q) n- e+ g 
. R- O  u' e, L  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_TIM1, ENABLE);     // 1), `6 }: K9 f, k; q' m9 G+ a0 A' L! f
 
0 }6 b9 {3 t3 ]  M) c  // (2; D/ t. g6 [2 o
  GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_8;
5 J( o2 X- a* `6 W" d& n+ |  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;# a& T, R# {6 _
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;" s6 ?8 m/ ]' Z; d+ t% \5 Z
  GPIO_Init(GPIOA, &GPIO_InitStructure);
# ^  F  [0 v1 p' U  // 2)
0 f- [$ H5 Y' E 
" ]3 O3 H, L+ Q+ v7 |+ u# U6 S  // (3
% e" _0 {9 o1 L  TIM_TimeBaseStructure.TIM_Period = Period;
- u/ n) n) Z8 G& M, R! z& K  TIM_TimeBaseStructure.TIM_Prescaler = (u16)(SystemCoreClock / 100000) - 1;) o! H( j7 g9 ?7 Y* ]/ w
  TIM_TimeBaseStructure.TIM_ClockDivision = 0;
( a' X6 z" X6 U: b9 h( a$ d  TIM_TimeBaseStructure.TIM_RepetitionCounter = 0;
$ q- e( b" h( X) [  TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
$ ^: [. \2 _6 F. K7 m: V9 F( r3 j  TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure);
* _8 q9 l2 a+ N0 d  // 3)& w* P! o1 a$ D" W
 
6 C, L& M0 U4 F  // (4/ f1 _) Q% [% g2 W! L
  TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2;4 a8 V+ a% b3 Q4 D$ V
  TIM_OCInitStructure.TIM_Pulse = 0;
; {! h$ ~4 c' \4 X" x7 K9 w  TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
" c9 d. _& @6 x8 O+ @, c; `/ M* x  TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Disable;
- m' s4 r) }/ |% H/ r  TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
' M3 q1 l+ u6 s1 n" T$ l/ b  TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_High;
: W2 a6 i2 |3 w/ |9 J6 R  TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Reset;
2 u& I2 n% h! [9 Y  TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCNIdleState_Reset;
& M( ?. \; ?4 t  TIM_OC1Init(TIM1, &TIM_OCInitStructure);$ W" ?: O! ~8 N8 a- N
  // 4)7 ^, c$ E# G. |- l- d
 
0 l- T; q3 p* y1 X  TIM_OC1PreloadConfig(TIM1, TIM_OCPreload_Disable);       // 5)
* M4 ^# {; H; {8 b- \& m 
# U( C5 w3 f; {8 s  TIM_ClearFlag(TIM1, TIM_FLAG_Update);                       // 6)
9 y; j" i  |3 d  TIM_ITConfig(TIM1, TIM_IT_Update, ENABLE);                 // 7)
3 |" ~) h6 `& u: O  TIM_UpdateRequestConfig(TIM1, TIM_UpdateSource_Global); // 8)
# ]9 F* B; L: F ) |7 q3 Q' H2 i" `1 m4 x/ m
  // (96 l& `+ ]6 L5 F$ d* r$ d
  NVIC_InitStructure.NVIC_IRQChannel = TIM1_UP_IRQn;- K+ [, K# O! M8 E7 C4 [$ n
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
4 k! ~9 H2 x7 M0 b/ k0 r  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
" Y! A. H1 m$ o* M) F6 z  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
8 i% {7 R  k& N. |8 ~+ d0 Q/ L  NVIC_Init(&NVIC_InitStructure);
3 W& Z- t( I' e* K. D9 ~; e  // 9)
$ ^* N* ?' e2 G+ k$ i 
( S+ j/ p" h( V3 P7 T  TIM_CtrlPWMOutputs(TIM1, ENABLE);  // 10)
+ g7 j0 I+ G* e* f4 P' \ 7 a, s1 s( n! h  Z) }/ d8 Y& J* Y
  TIM_Cmd(TIM1, ENABLE);  // 11)' s& |  G, t. _! h3 c
}
7 G1 R% Z' m) O* y, ? - r' m, U7 a" b7 U* @7 C6 o6 `
代码行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外设。
2 o+ t3 O$ W7 T# qTIM1计数器的值达到最大时就会产生更新中断,其中断处理函数定义如下:/ |! y3 U+ Q; q
 3 |/ J) _. T9 s# D
void TIM1_UP_IRQHandler(void)/ K* ?* ^; J3 g% I% z
{
$ K1 n0 W& t& ?% ?( l8 ~  if (TIM_GetITStatus(TIM1, TIM_IT_Update) != RESET)
/ c$ L9 S/ R' J9 g% |4 K1 ?  {( E. V, u9 z: t, k( h  C
# A9 z8 ?9 O4 o7 y6 B
<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 手机版