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

【STM8-SO8】04-定时器TIM4的使用

[复制链接]
slotg 发布时间:2019-1-30 20:45
本帖最后由 slotg 于 2019-1-30 20:47 编辑 $ i, s1 ^  Q) }7 `8 c
5 T$ L: k  h7 q7 `* X' a- C  j
STM8S001 内部有 3 个定时器 TIM1、TIM2、TIM4,其中 TIM4 是一个 8 位的定时器,架构与功能算是比较简单的一个,很适合做为时基的使用,基本用法如下:. U/ |6 f; f6 P: ]* }5 V( f

! K+ X) W/ f9 R( R7 d3 Z, B* Mmain 回圈:9 g7 [: U& |. ^
  1. void main(void)3 \* w) m, `  L3 j& B0 ~4 J0 ~2 S
  2. {
    , g8 h9 a% d# B( K9 b$ b
  3.   /* Clock configuration -----------------------------------------*/
    , D! M- P% A% j7 F
  4.   CLK_Config();  
    9 G6 t) H+ S3 T' ?/ m3 b

  5. 4 Y9 o1 r& b% g+ o2 r6 j
  6.   /* TIM4 configuration -----------------------------------------*/
    $ ^1 W: C$ B1 Y0 t0 X* T: H9 Y
  7.   TIM4_Config();   
    1 \/ T; S. n7 l" U4 \/ C, j
  8.   ( s( K$ R5 I- k# R8 r
  9.   while (1)% c$ I' H6 o1 G8 O* w  U0 k
  10.   {
    * E: `% M7 C6 i. }
  11.   }3 u+ G3 J  ]/ q* q# S
  12. }+ a9 }0 \) |; o" z4 _* ~7 ?4 l6 T
复制代码

5 M0 {8 Q3 C, `& m* q将系统时钟主频设定在 16Mhz:6 \2 X5 |. x5 d. ~5 u7 `
  1. static void CLK_Config(void)- M% Q( V2 n* c# Z/ M
  2. {- N8 l+ w% s$ E, w
  3.   /* Initialization of the clock */
    ) }0 \3 e- F! `/ Y# `* C7 g* ]
  4.   /* Clock divider to HSI/1 */
    4 U5 d. Q4 A/ T; a- _$ i5 D
  5.   CLK_HSIPrescalerConfig(CLK_PRESCALER_HSIDIV1);
    0 l* t2 T2 U6 j
  6. }
    3 J" v, p: d  o/ ~4 N
复制代码

5 |$ x, ?) {5 D2 ~将 TIM4 中断设定在 1ms 中断一次:
' p5 ]! a3 o* x9 D* z' I9 g
  1. #define TIM4_PERIOD       124! L# `. ]2 `5 B- B/ i# r
复制代码
  1. static void TIM4_Config(void)6 M( S+ O8 A% T5 Z+ a8 J& g, T( w* V) ?+ w
  2. {! }7 b* ~& u# B% ^
  3.   /* Time base configuration */# }- L: {6 ?! L  f
  4.   TIM4_TimeBaseInit(TIM4_PRESCALER_128, TIM4_PERIOD);! a- j$ ~- H- g6 }1 k5 W% R4 D9 e, q
  5.   /* Clear TIM4 update flag */  Y$ n+ X$ W( v9 X2 o6 D0 {" g
  6.   TIM4_ClearFlag(TIM4_FLAG_UPDATE);
    5 U  o/ J4 C$ E! T0 J7 [# {$ e0 l; H
  7.   /* Enable update interrupt */
    ' [: C$ k/ J9 K( }% r4 |0 x
  8.   TIM4_ITConfig(TIM4_IT_UPDATE, ENABLE);
    2 L# c  [- O: b$ ?5 u" F3 g
  9.   
    , f! j$ p; K5 d7 `
  10.   /* enable interrupts */
    4 e  K$ l( F% m5 X, D
  11.   enableInterrupts();
    $ n% h, W4 q- R- B; X
  12. # W6 I9 M( t9 f% p- k1 O
  13.   /* Enable TIM4 */
    2 t3 k, t* `; s7 _( s: r) Q
  14.   TIM4_Cmd(ENABLE);& o$ S% }+ r+ Y. t+ F, w
  15. }9 m* P4 M' c) I0 S6 m1 g
复制代码
8 |" |4 f6 V# Z* w
16Mhz / 128 = 125Khz$ A( H' |; s- {  T. r/ H- b
125Khz / 125 = 1Khz --> 1ms
4 d8 M7 V' H' K
6 l  A' f+ `8 ?( M- P$ }: jTIM4 中断程序在 stm8s_it.c 这里: 1 D, C+ o3 V& v8 n, b6 B
  1. INTERRUPT_HANDLER(TIM4_UPD_OVF_IRQHandler, 23)* Q2 G6 v+ y# B* ~
  2. {4 A9 l8 y& S0 C' v, v

  3.   h+ r" j# ?1 [$ e4 l* V
  4.   /* Clear Interrupt Pending bit */' n( t7 ^' o, c- |# E* m: a9 }
  5.   TIM4_ClearITPendingBit(TIM4_IT_UPDATE);
    % \& Q* Z( B2 ~$ N
  6. }
    ( c9 h. z, W/ z+ w# l: U" u
复制代码
! M  T8 M8 |1 n! J' w$ S. c( o
前面的 LAB 有使用到按键输入的功能,对于按键输入的判断我习惯上都会搭配时基计数器的方式,在这一个程序当中我用这种方式再来实现一个按按键让 LED 翻转显示的功能。
# t: F, c; o" G" m. v
- |4 P3 |% l" `9 b8 w. u/ | P01.JPG
) D& ]0 S# j1 \. K- w7 D, @
: Z8 I% f4 S' q/ ^- juint8_t key_cnt;4 _$ I) A+ O- P9 }( ^

3 ~; _5 C$ M/ q# z: [% w" A& }宣告一个全局变量 key_cnt 做为按键 KEY 的状态计数,按键放开时 key_cnt 清除为 0,按键按下时每一个时基 key_cnt 就会加一,在主回圈判断 key_cnt 等于 20 时为按键初按下状态。LED1 固定以 0.5s 的周期闪烁,而按下按键 KEY 之后 LED2 翻转显示。: }) ]# s9 Q- R, D% M  l5 K
7 v. Z, u$ i7 j) o: Q
main 回圈:
: i8 L6 Y8 H4 ^3 O
  1. void main(void)% z- W- ^1 x2 T& j
  2. {
    + l7 A  X* `: p. h; ]) ]$ P
  3.   /* Clock configuration -----------------------------------------*/
    7 M3 F: M6 R1 W$ X5 {- o4 Y4 W2 j% Q
  4.   CLK_Config();  ) D& D2 G. N0 \

  5. , I  G0 m- W) J+ k! G
  6.   /* TIM4 configuration -----------------------------------------*/
    - ~, D! u4 w# w. v5 D2 a
  7.   TIM4_Config();
    : a; ^0 S* z, d3 k! P. i6 M

  8. % v3 Y2 |" k1 g" z" s
  9.   GPIO_Init(LED1_GPIO_PORT, LED1_GPIO_PINS, GPIO_MODE_OUT_PP_LOW_FAST);( A9 k7 a( `) ?; y9 s
  10.   GPIO_Init(LED2_GPIO_PORT, LED2_GPIO_PINS, GPIO_MODE_OUT_PP_LOW_FAST);' Q/ ?: Q: l8 `3 I+ D
  11.   GPIO_Init(KEY_GPIO_PORT, KEY_GPIO_PINS, GPIO_MODE_IN_PU_NO_IT);- v/ P6 k5 n. i. [
  12.   + }6 u1 {4 O9 _0 b5 x- h
  13.   while (1)3 R& W! q6 y9 r: z" M; E
  14.   {! H3 g; ~3 a# W. K( W. K- B
  15.     if(key_cnt == 20)
    + ^. L+ Q$ }  h4 z9 H: u, G
  16.     {" C( A& L* K- y9 B
  17.       key_cnt++;! p5 S, _* v1 \6 J6 [& _8 L
  18.       GPIO_WriteReverse(LED2_GPIO_PORT, LED2_GPIO_PINS);
    8 g. d* ]$ S" K7 B" R
  19.     }
    + Z3 `7 v9 @% q2 N2 s
  20.   }4 y1 s9 @; \9 {& k1 u# ?! Q
  21. }
    . u( Y' V. z" ?6 f1 O4 S
复制代码
, `1 K# z; Y  K" l! R! _+ I
TIM4 中断程序:
$ \4 v& K4 [/ Z# p2 }& E
  1. INTERRUPT_HANDLER(TIM4_UPD_OVF_IRQHandler, 23)
    6 X1 a- x* X* I
  2. {
    6 u9 ?+ ~0 C* h
  3.   static uint16_t x = 0;
      W4 C; z0 ]$ P* h& G. f/ W
  4.     : @, o' h2 Y+ c- l* \6 v7 Q( v
  5.   if(++x == 500)      // 0.5s
    6 q0 @1 f+ O+ M, G- w4 }5 s* t1 f
  6.   {
      V! a8 y8 _0 g* U9 ^
  7.     x = 0;7 p) |+ O+ \+ M1 b
  8.     GPIO_WriteReverse(LED1_GPIO_PORT, LED1_GPIO_PINS);        // LED1 flash
      E+ O4 U, A8 o3 d, Y0 I
  9.   }
    ! u; u; r3 H  `
  10.    
    " i8 w9 ?5 t, m2 v" d8 h6 l$ a/ |" x
  11.   if(GPIO_ReadInputPin(KEY_GPIO_PORT, KEY_GPIO_PINS))
    . h$ y- [0 n9 d, K3 J
  12.   {! I1 s; d4 u/ A+ @
  13.     key_cnt = 0;
    5 D9 Q: Z3 @2 y7 G6 c  F. [" g. x: h
  14.   }! e' S% k- f# D
  15.   else
    5 D5 q3 f2 m. u7 H
  16.   {
    - m5 F- j/ R- A' ~  f: D4 X
  17.     if(key_cnt != 0xff)
    " Y8 S- s  h9 I5 J0 f# H/ k  A
  18.       key_cnt++;
    ( q" m# z9 _9 _( h: B( W# y
  19.   }
    ) h) d; b8 \: i8 V$ Y

  20. 4 j6 I; M. T! y
  21.   /* Clear Interrupt Pending bit */
    - A# ]; k* E9 l8 X& I7 g- ~( G
  22.   TIM4_ClearITPendingBit(TIM4_IT_UPDATE);+ f- K5 G6 D9 t& `0 a
  23. }
    ' j" q, D; C* _0 S  `
复制代码

( w: f8 J# r9 R- B. I运行结果:( }/ d& X" h+ m
20190130205830.gif   D# Y$ R" y) w( S4 X
5 _3 d# A$ }. z; H
源代码:
8 e! W! B3 F8 e6 k1 ~5 {+ Z B06.rar (966.02 KB, 下载次数: 10)
收藏 评论6 发布时间:2019-1-30 20:45

举报

6个回答
mzy2364 回答时间:2019-1-31 08:59:19
交通灯
lwg8458 回答时间:2019-1-31 10:53:32
xujiantj 回答时间:2019-2-1 09:30:06
学习了
slotg 回答时间:2019-2-1 10:23:37
xujiantj 发表于 2019-2-1 09:302 h+ ^0 v0 a8 j( h: S
学习了
4 C2 M$ C; U) \9 r6 n; x
感谢关注
wangdexin 回答时间:2019-7-17 14:10:18
学习了。。。
linjue 回答时间:2019-8-22 14:27:13
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版