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

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

[复制链接]
Cody-2045860 发布时间:2013-10-15 15:40
 # y! n1 {8 S  F7 y" t
本例程出自STM32MED1开发板附带光盘,其工程目录路径为:\Code Package\Peripheral Devices\06 TIM\0603_PWM_Output。* Q% e- R- C' `; z7 A0 y7 f
 + p( N8 |7 U7 S# V
高级定时器TIM1的通道1位于GPIOA.8引脚,此管脚正好与开发板上LED1相连,这样就可以通过观察LED1亮度变化来判断TIM1的PWM输出波形变化情况。
" j' ?! {. ]$ X/ d3 A通过调用函数TIM1_PWMOutputConfig()可对TIM1的PWM输出进行配置。其代码定义如下:
9 m5 Y" o' `& w* ~ 
; c6 G) k3 ]8 j* o) [% }; Qvoid TIM1_PWMOutputConfig(u16 Period)6 L* k$ M; d/ V3 q+ d, r2 Q
{1 n9 M9 ?7 ]$ D1 i
  TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;0 l) f  q4 D& A9 j+ e5 B1 Z; o# K
  GPIO_InitTypeDef GPIO_InitStructure;
4 f  F: u/ q/ U" q2 R: E  TIM_OCInitTypeDef  TIM_OCInitStructure;
7 K) e0 o* D; g/ w" q  NVIC_InitTypeDef NVIC_InitStructure;) K" O7 z4 g- U  D1 e
 1 S7 e: F+ k% Z! S% [. J
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_TIM1, ENABLE);     // 1)5 `7 T. Q' h5 Y5 {0 |3 J! ^+ W' B
 
- N  P- M1 Z6 M6 Z# N  // (20 c6 x0 f3 @5 Z' S9 T. V0 y# G
  GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_8;1 H) G+ v$ ]) g" X
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
1 c6 @+ M/ {: L* T  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;# ?8 u- x5 h. M: t' h
  GPIO_Init(GPIOA, &GPIO_InitStructure);
* ?0 W. F2 L7 t' R  // 2)- R+ X' F: m* j* P* z
 6 N' p! y) r) Y7 T. U
  // (3
/ \; R, f  `9 W  TIM_TimeBaseStructure.TIM_Period = Period;! b9 P( L/ ?+ \) {& H* r
  TIM_TimeBaseStructure.TIM_Prescaler = (u16)(SystemCoreClock / 100000) - 1;+ s2 ?% A  B# X6 L
  TIM_TimeBaseStructure.TIM_ClockDivision = 0;
. f4 E2 E1 s; T  TIM_TimeBaseStructure.TIM_RepetitionCounter = 0;* x$ p6 w0 p# h5 H
  TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
. H9 D4 i" F' v( r/ S0 i/ A% \  TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure);
# L/ g7 ^0 P/ ~' E$ c2 O% m$ k  // 3)
7 L; a  i# B7 X  N2 Z/ _# K5 J 4 h. }7 Q0 l  N2 ?& P
  // (4
$ R8 b2 M$ p% t: J, A1 f+ q  TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2;5 t$ m% {. d7 V4 k7 ?
  TIM_OCInitStructure.TIM_Pulse = 0;& ]2 n! k3 I+ C' a# ~) e% g
  TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
: C; e: x0 Q4 [- I7 ~% R9 b9 C4 w  TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Disable;, c8 r% A" N# Y+ a8 m. W9 l$ s/ l7 J
  TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;( L1 o4 |3 N) S& R" J
  TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_High; 7 _, s$ d/ E2 w7 y, {9 M9 r
  TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Reset;
: @; {$ }' U; Y- j; h, `  TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCNIdleState_Reset;
% b7 t* J2 c% c% G& k, @! M  TIM_OC1Init(TIM1, &TIM_OCInitStructure);' g4 f' ~0 d" L
  // 4)
6 ?6 C8 w" y8 m$ O0 u0 N& h$ ?, Z   v2 F" N$ Y6 y8 U7 ]2 b* }
  TIM_OC1PreloadConfig(TIM1, TIM_OCPreload_Disable);       // 5)% L  l2 _6 d7 N' w2 ]' X1 g& V, |& q6 J
 $ b+ F7 A5 T2 v: f
  TIM_ClearFlag(TIM1, TIM_FLAG_Update);                       // 6)( q9 Q/ X( O. R2 B& S* j
  TIM_ITConfig(TIM1, TIM_IT_Update, ENABLE);                 // 7)
; e1 n: S5 l. e  TIM_UpdateRequestConfig(TIM1, TIM_UpdateSource_Global); // 8)
: L7 n* b" B7 y7 V* x 
# j& z) R8 V% Q. @& ~( T, Z  // (99 S4 S4 y' ^. }4 n9 K6 q
  NVIC_InitStructure.NVIC_IRQChannel = TIM1_UP_IRQn;( f$ r9 v% D5 c/ P# E: N( F/ i$ r
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
+ Z/ Z5 z5 I+ e2 y. q3 ?  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
/ N) a4 n: s1 o/ ?& u  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
2 N) b0 M& i% {; w  NVIC_Init(&NVIC_InitStructure);
8 f* O/ H* p. T% {. V" @  // 9)" k. z! W$ J% @- V# [
   j8 k: d1 U& Y' E7 s3 r
  TIM_CtrlPWMOutputs(TIM1, ENABLE);  // 10)/ l  x" v  P( R1 ^2 W- g
 ! [3 u6 G$ h: ~# Y+ M7 U$ \
  TIM_Cmd(TIM1, ENABLE);  // 11). A/ x# s; b" s) ?& D
}$ L3 l4 F. l2 Q- n
 
3 E  x5 P$ d7 ^代码行1)开启GPIOA及TIM1外设的时钟。代码段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)是开启TIM1的PWM输出。代码行11)是使能TIM1外设。( n' S( L' Y% H1 w2 K5 b' B
当TIM1计数器的值达到最大时就会产生更新中断,其中断处理函数定义如下:
9 T4 `* t# w* I7 {; m6 | * _- ]4 q. i0 w9 C  P
void TIM1_UP_IRQHandler(void)% N( Z; q3 ^9 j3 Y, i/ B+ J# n& t
{5 a$ Y* j& O6 L% W# }
  if (TIM_GetITStatus(TIM1, TIM_IT_Update) != RESET)( {. V& F4 u7 i6 e8 K( I$ A' b. o6 w
  {, O2 _, N2 h& \2 @/ a$ p

1 p9 |! w9 [& y4 B! o5 n; Q<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管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版