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

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

[复制链接]
Cody-2045860 发布时间:2013-10-15 15:40
 
  [9 d# Q: n) q. l# W) R4 O1 H本例程出自STM32MED1开发板附带光盘,其工程目录路径为:\Code Package\Peripheral Devices\06 TIM\0603_PWM_Output" S6 U) J( h# |6 _2 E
 / H) K. a7 z4 z! O* {  S
高级定时器TIM1的通道1位于GPIOA.8引脚,此管脚正好与开发板上LED1相连,这样就可以通过观察LED1亮度变化来判断TIM1PWM输出波形变化情况。/ r. d0 i9 O) E' P/ u% K6 T; [. t
通过调用函数TIM1_PWMOutputConfig()可对TIM1PWM输出进行配置。其代码定义如下:, K& D& O# L5 H0 P: S, c7 ^
 9 y0 o7 f( `# F: ]" a
void TIM1_PWMOutputConfig(u16 Period). J1 S+ ~& F! y5 N" Y: \) u8 T
{
, H: m2 R$ M+ |" H! s" b9 a  TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
5 O+ `2 r. n1 v9 V4 U; k3 y  GPIO_InitTypeDef GPIO_InitStructure;
8 e* A4 X. a4 U  g* G; ~  TIM_OCInitTypeDef  TIM_OCInitStructure;
' v. \  z- V2 s  y- P4 y  NVIC_InitTypeDef NVIC_InitStructure;
" n$ [6 M, O7 I6 n$ S  Q- | 
( u9 ^0 Z; `% _6 I( x, g  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_TIM1, ENABLE);     // 1)
/ k. k9 Z5 t& n/ A" q 
! ^) w/ @  ^0 }/ B: t5 L. V7 ^% |& {  // (2$ _3 A, \+ E. {3 r$ K
  GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_8;
" }, g1 Z0 H) h* ]  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
0 O$ v3 ^/ M( O3 i5 X0 a9 B  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;! R+ |; R+ T! P6 Q
  GPIO_Init(GPIOA, &GPIO_InitStructure);
- T) e8 `# n; W! y, I. f( g  // 2)
2 z4 O1 w6 I1 C7 A" X & s  {# q  ?5 e. E" d  [7 G
  // (3
% A6 b  D6 F4 V+ w5 N6 N# F' @  TIM_TimeBaseStructure.TIM_Period = Period;
5 c, t. `# G6 {  TIM_TimeBaseStructure.TIM_Prescaler = (u16)(SystemCoreClock / 100000) - 1;0 Q0 Q' G3 f( W) d, Y' E
  TIM_TimeBaseStructure.TIM_ClockDivision = 0;$ i; M  R6 C1 ?
  TIM_TimeBaseStructure.TIM_RepetitionCounter = 0;
1 ^- Z7 b# r, \  ?5 s  TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;9 N* c& m7 W, _$ G; ?
  TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure);) y0 s" A; ?% W7 V/ F. o: D  w
  // 3)
% y2 ~9 w' {7 g0 ^' p $ z, y: M# A: W  H
  // (4
" Q  A1 O7 v/ @. ?1 x- U3 S  TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2;
' A* g6 j) F: G8 E( e: J  TIM_OCInitStructure.TIM_Pulse = 0;
. Z. p, m1 a. ~+ {  TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
: C: }$ d, G: s  TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Disable;, h  D' p# I. ~+ @
  TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
8 V% y% |9 B6 L/ S4 S" t7 H* k  TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_High;
4 P: Y9 |5 V6 x7 y% |& Y  TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Reset;
$ x* R1 i4 S7 b. c2 {( w  TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCNIdleState_Reset;4 @; h+ n3 F# h: j$ F  d5 G# ~
  TIM_OC1Init(TIM1, &TIM_OCInitStructure);! k" N' ~- e2 t" }( }- b" z
  // 4)' o# U8 Z+ @- O8 Y! O) P0 h
 ) |) J6 B+ @  V: ^
  TIM_OC1PreloadConfig(TIM1, TIM_OCPreload_Disable);       // 5)
& _; p6 ^( t) s ! n' S+ F' d- E" A3 f" F: v7 x5 {" L
  TIM_ClearFlag(TIM1, TIM_FLAG_Update);                       // 6)8 Z+ ]( y$ q( l
  TIM_ITConfig(TIM1, TIM_IT_Update, ENABLE);                 // 7)
* n+ E$ [" J3 d! V4 R  TIM_UpdateRequestConfig(TIM1, TIM_UpdateSource_Global); // 8)0 ?9 s4 w4 i0 p9 |; \7 ?" U
 3 a7 V( a5 X  `; O! F0 S
  // (9
8 g, M& U" t4 Y& g0 m  NVIC_InitStructure.NVIC_IRQChannel = TIM1_UP_IRQn;
" q- d4 K2 }, H0 e! O; i  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;6 E$ h. u6 J  ^- _3 K* Y
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;3 U' ]) x. L  \' m* b
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
. p& r; }' @4 j$ L3 n6 _( Z  NVIC_Init(&NVIC_InitStructure);
1 m8 z. [+ o" K! e: ?( S% U( W  // 9)
5 O" Z- x6 `- [) J " d) _+ p" ?( A1 I
  TIM_CtrlPWMOutputs(TIM1, ENABLE);  // 10)
) m2 Q% b, A' e! |( f& x 
, w# s/ u' o& W/ `6 t  TIM_Cmd(TIM1, ENABLE);  // 11)
% H% z6 X" z0 D/ n& P}1 E/ E* w2 N' W; M! A! X! v3 z7 T
 % w6 T1 y- I( |) z
代码行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外设。4 p8 D$ [  ?* s/ F  ^. N+ F
TIM1计数器的值达到最大时就会产生更新中断,其中断处理函数定义如下:
+ H6 u1 s! g6 J , ?. a# k3 {- G& F+ @* _
void TIM1_UP_IRQHandler(void)- C/ [* Q; k* W; p" C
{
+ E5 G7 v: e: k# A9 |+ q0 i  if (TIM_GetITStatus(TIM1, TIM_IT_Update) != RESET)
8 S( z7 U* M  M1 q  {
) g1 b+ c0 B2 c, }. A4 c( j+ I. m: ~
<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 手机版