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

STM32MED1开发板例程解析(一):多个定时器链接

[复制链接]
Cody-2045860 发布时间:2013-10-14 15:59
本例程出自STM32MED1开发板附带光盘,其工程目录路径为:\Code Package\Peripheral Devices\06 TIM\0602_Chaining6 v' }4 N* d1 t- e# N
3 m. j* I! o) S! E3 ^$ e
本例程是使用TIM3作为TIM4的预分频器。下面代码出自timer.c文件。- E4 h- J0 a/ d7 s, Q
 
% U! L% O/ l4 N3 ?void TIM3_4_ChainConfig(u16 Period1, u16 Period2)! v4 A9 F# `4 A
{
6 U+ F; f. A1 w, @! ?  TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;& q! l2 ?4 f( D& ]8 z! L, g
  NVIC_InitTypeDef NVIC_InitStructure;
  f/ p9 x, {8 m! U, p# ~ ' c" D1 e' W% r4 E
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3|* z. h1 G% u  r) n# ?. F

9 z4 E, Z4 a  P3 U/ g+ ?                                   RCC_APB1Periph_TIM4, ENABLE);   // 1)% P' A( c- J5 l+ m& h; v
 5 q  }, F" f6 f
  TIM_TimeBaseStructure.TIM_Period = Period1;    // 2)
6 ~. M2 m# }- D  TIM_TimeBaseStructure.TIM_Prescaler = (u16)(SystemCoreClock / 1000) - 1;    // 3)4 e) p+ Q3 f1 @: p) M) x3 Y2 [
  TIM_TimeBaseStructure.TIM_ClockDivision = 0;
, [: V1 A- f) _( V  TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;   // 4)% q+ J* c9 I$ C
  TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);
2 t; e$ @# d6 R# s 
  Y) z' n+ l' w9 y' O  TIM_TimeBaseStructure.TIM_Period = Period2;    // 5): i. V3 f2 ^1 v
  TIM_TimeBaseStructure.TIM_Prescaler = 0;
: g% g1 [6 e/ m+ e2 ?  TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure);' g. H" J* m/ u, A6 o- h2 U9 i% P$ o
 
9 d& B- x' V' a8 c. E  TIM_SelectOutputTrigger(TIM3, TIM_TRGOSource_Update);   // 6)
( \* i$ \5 c6 y0 x  Y  ~ 
' Z' l. U3 ^* I/ P( \* K7 |  TIM_SelectSlaveMode(TIM4, TIM_SlaveMode_External1);    // 7)
& T, [* u# u* B0 O: f  TIM_SelectInputTrigger(TIM4, TIM_TS_ITR2);    // 8)9 j: ]5 o: c/ b, {: v$ I# r0 J  G
 
% x2 W: k8 m0 H! L# \% _  TIM_ITConfig(TIM4, TIM_IT_Trigger | TIM_IT_Update, ENABLE);    // 9)2 b) V3 X- G8 z: q+ |
  TIM_UpdateRequestConfig(TIM4, TIM_UpdateSource_Global);     // 10)- `7 g' g) N( G) D' L0 r) i
 ( o6 O1 T5 x2 E6 a: a' A
  // (11
! p! \3 L1 p" T6 d' F: z0 t  NVIC_InitStructure.NVIC_IRQChannel = TIM4_IRQn;
5 w1 N/ s( _( [% L" Y8 H  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;: B+ p; x$ N. W: W3 t
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;( ?; _% T$ T% ~9 `
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;  M5 K( X- N7 f- [: x
  NVIC_Init(&NVIC_InitStructure);
3 O: g) \; c  a5 ?3 h  // 11)
9 m% J2 c: ~" |3 H2 r % ?1 N+ C) q$ q* H5 r
  TIM_Cmd(TIM4, ENABLE);     // 12)8 m# N9 e0 K. q, h' R1 P( C. {
  TIM_Cmd(TIM3, ENABLE);     // 13)
& `, p+ V$ `- l' Q- M& a3 a/ W! I}
: Q8 Y0 j4 X4 s. P. B2 H1 ]' U 
& D( i" ], L9 n在对定时器的寄存器进行配置前先应通过调用函数RCC_APB1PeriphClockCmd()使能相应定时器的时钟,如代码行1)。代码行2)是设置TIM3的周期,即设置寄存器TIM3_ARR的值。代码行3)是设置TIM3的预分频器值。由于TIM3的从模式控制器被禁止,TIM3预分频器的时钟由内部时钟CK_INT提供。全局变量SystemCoreClock定义于system_stm32f10x.c,如下代码所示:+ U( b4 U9 y' ~& p9 [/ A2 r
 
+ `- I. y* S0 v7 H  quint32_t SystemCoreClock = SYSCLK_FREQ_72MHz;8 q& M. k/ b# M5 D  T) M
 9 u  d8 Y% o8 S$ b1 w% F( j( C
由此可见,代码行3)将预分频器值设为SystemCoreClock / 2000 – 1,则预分频器的输出时钟CK_CNT=1000Hz,也就是说TIM3的计数器每1ms计数一次。代码行4)将计数器模式设置为向上计数模式。也就是说定时器使能后,计数器将从0开始计数,每1ms计数一次,计数到TIM3_ARR中值时产生更新事件,计数器将重新从0开始计数。代码行5)是设置TIM4计数器的周期,也就是寄存器TIM4_ARR的值。TIM4的预分频器值设为0,计数模式同样是设为向上计数。代码行6)将TIM3的更新事件设为其触发输出源,代码行8)则将TIM3的触发输出选为TIM4的触发输入,即每当TIM3产生一个更新事件,TIM4就将收到一个触发信号。代码行7)是选择TIM4的从模式:外部时钟源模式1,即将TIM4的触发输入脉冲作为TIM4计数器的时钟。这样一来,TIM3将每Period1 ms产生一个更新事件,此时TIM4产生一个触发事件,TIM4的计数器将计数一次,经过(Period1*Period2) ms的时间后,TIM4将产生一个更新事件。代码行9)是开启TIM4的触发及更新中断。代码行10)是指仅当TIM4计数器上溢或下溢时更新事件。代码段11)是配置并开启TIM4的中断通道。代码行12)及代码行13)分别开启TIM4TIM3
- z0 [2 {" C/ G1 } , R# \! i6 k8 |: b% T
下面是文件stm32f10x_it.cTIM4的中断处理代码:. U0 H9 b- P+ r& }5 E, R
 
! R6 G" }4 Y0 H9 v$ `3 q# F3 uvoid TIM4_IRQHandler(void)% o. Y% F  }! L
{% }9 V# O" T* ]- q* y( {4 E  r
  if (TIM_GetITStatus(TIM4, TIM_IT_Trigger) != RESET)  // 1)
1 W$ O' E- m* |9 S  r  {
; S6 E- s$ q" c5 H    LED_Toggle(LED1);
! w: C& k4 ?7 c# B 
' s5 l* G/ {! X7 Q; ?9 u0 X8 }    TIM_ClearITPendingBit(TIM4, TIM_IT_Trigger);
3 |6 R% V3 v  i9 X- ]4 Y7 B  }% h- @0 U# o0 s- g6 {0 L; O
 " Q' O& ~% I4 [1 b: B4 o
  if (TIM_GetITStatus(TIM4, TIM_IT_Update) != RESET)   // 2)
7 s" t: D* t- v: q+ b  {$ R; |$ f4 L: j" n; y: ^
    LED_Toggle(LED2);
! @- t% q9 d! [, C, L' ]5 m 
  n1 {6 k  ]6 j- Z8 Y    TIM_ClearITPendingBit(TIM4, TIM_IT_Update);3 N. ]: E+ w( m. Z
  }
$ Q! V. \* i" |! \}' P& ^( A2 v. q
 1 {" A! |* p, d( w, Z5 T
代码行1)是判断TIM4是否产生触发中断,若产生了触发中断,则反转开发板上LED1的状态,而后清除该中断的挂起状态位。同理,代码行2)是判断TIM4是否产生更新中断,若是则反转LED2的状态,然后清除中断挂起位。
; S9 ~( C9 C& N4 X9 r# V; k& ~) ^% {* S 
- ]! c9 `/ O. ~函数main()位于main.c文件中:
4 S3 O4 U' _6 I 
. q1 S% Y- i3 Fint main(void)
: X( s  o% s! T' q0 j{  v7 j/ S7 h3 n" Z
  /* Code here configures LEDs on board */( b- J4 N5 [" M, H. f! d
 
* c& M4 ~! ^' n. X  TIM3_4_ChainConfig(1000, 3);          // 1)$ z8 ~' l+ z0 `$ Y1 P! o# N
 
6 o) R% T, i# C8 u) U4 U  while (1)
6 X9 Y. n3 m2 q+ Y  {  {2 M3 z. W  J2 ?' h( U+ Y
    /* Waiting for interrupts */
: F% O9 L1 _6 ]( w* _  }
4 E2 ?1 [' G7 q9 ?9 h  U}* `/ X& Y' k/ h. M& q5 U
 ' {0 z3 Q8 `& E4 M( m6 f
代码行1)将TIM3的周期设为1000,也就是每秒TIM3将产生一个更新事件,同时TIM4产生一个触发事件,由于TIM4的触发中断已开启,其对应的中断处理代码将得以执行,即LED1的状态将翻转。TIM4的周期设为3,也就是说3秒后,TIM4将产生更新中断,LED2的状态将翻转。7 N- u5 }+ V, {+ I
 % z$ R1 l: b% \1 c# A" B
了解更多,请点击访问我们的首页* |9 o: }' k- |9 D0 S) ?
 
8 w9 Y) W2 y9 P6 m" B- n/ Q: g 
收藏 评论0 发布时间:2013-10-14 15:59

举报

0个回答

所属标签

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