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

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

[复制链接]
slotg 发布时间:2019-1-30 20:45
本帖最后由 slotg 于 2019-1-30 20:47 编辑
6 ^; m6 }: W# r" T& W0 N9 O) q1 L4 u
STM8S001 内部有 3 个定时器 TIM1、TIM2、TIM4,其中 TIM4 是一个 8 位的定时器,架构与功能算是比较简单的一个,很适合做为时基的使用,基本用法如下:
* C4 ~; ^! `/ e1 b0 b+ I0 j3 N
& A5 A( T" k9 Umain 回圈:, o0 N9 t" l1 M: N9 m4 O
  1. void main(void)
    4 |7 A/ H$ k% O( T
  2. {2 F8 Q4 Q6 g$ x- U* b( m
  3.   /* Clock configuration -----------------------------------------*/) `" [* Y% Q+ u2 C6 h
  4.   CLK_Config();  / i% n# {  ^. Y3 z3 z7 ^0 [

  5. * f7 }5 C0 E, T8 @* U# C' a2 t, o
  6.   /* TIM4 configuration -----------------------------------------*/$ `: y( R0 i( v. z. g: j, X
  7.   TIM4_Config();    , x8 r) i. ^$ }4 J7 I0 {7 O
  8.   
    3 L& l: g5 d; v; R
  9.   while (1)
    1 c+ B$ c6 @' T! k7 _
  10.   {
    3 M& W" d* q8 y% h1 J
  11.   }
    + l3 q4 b1 q$ y2 R$ w: R4 Z
  12. }
    $ b. }, @1 Y; d/ `/ h
复制代码
% P' G' L0 a9 Q9 Q+ d1 l
将系统时钟主频设定在 16Mhz:
: o; \3 {$ E: c/ i: N; {
  1. static void CLK_Config(void)
    ! p; C8 I2 g  P2 e" @: B" e
  2. {
    " [( [# F3 B9 s: J; {
  3.   /* Initialization of the clock */
    $ S# V& ^; O! p: o& j; w& {3 M
  4.   /* Clock divider to HSI/1 */3 E6 _/ h4 e1 Y1 W$ X# V8 ]
  5.   CLK_HSIPrescalerConfig(CLK_PRESCALER_HSIDIV1);: d+ C7 q  L) Z9 a% a$ s' E  c! V% {& `- ~$ v
  6. }  [) W6 s/ R! d  t4 Z5 @; C
复制代码

9 W4 I% X) C$ k% g# W- c3 L将 TIM4 中断设定在 1ms 中断一次:
( y3 j3 F& @2 B3 Y* u7 N' k( M
  1. #define TIM4_PERIOD       1243 m: s5 u7 I. D' K5 G* X; f/ I
复制代码
  1. static void TIM4_Config(void)
      L) C+ S8 q* O1 @3 J
  2. {. t  [% [, n  Q. |4 R
  3.   /* Time base configuration */0 }6 K$ U( b. x3 v# D% e" H+ W0 y
  4.   TIM4_TimeBaseInit(TIM4_PRESCALER_128, TIM4_PERIOD);9 U0 _# f! f% }* F
  5.   /* Clear TIM4 update flag */' ?; d- m  q9 Z) }5 i
  6.   TIM4_ClearFlag(TIM4_FLAG_UPDATE);
    * G8 O8 _8 v: ]3 f% \
  7.   /* Enable update interrupt */
    # w# [7 {0 G! ^- i; H3 D9 Q
  8.   TIM4_ITConfig(TIM4_IT_UPDATE, ENABLE);3 t1 k% j* ]& s9 B" V2 i/ H
  9.   ! W- k2 {. ]" w5 u5 D
  10.   /* enable interrupts */
    , a5 K' k* D3 W- v8 _$ m
  11.   enableInterrupts();
    9 v3 H/ u, [1 N- l2 h; `

  12. - n- Q2 ?2 ?+ w/ J* h" M
  13.   /* Enable TIM4 *// @, K  B$ J+ U6 [( [  g
  14.   TIM4_Cmd(ENABLE);
    6 P5 S2 o6 A. P1 |. d  A
  15. }
    : a9 O8 L8 V; V6 G' S3 _. F) r& P
复制代码
$ R$ ]0 L7 A8 p- ]) Y
16Mhz / 128 = 125Khz
5 c, r7 J4 E$ L  x1 k125Khz / 125 = 1Khz --> 1ms ) G- j6 }( F* _2 X  x! p5 i  Q8 v

  u. M: O: [3 GTIM4 中断程序在 stm8s_it.c 这里: % M0 `8 ?& H8 G& O+ }
  1. INTERRUPT_HANDLER(TIM4_UPD_OVF_IRQHandler, 23)
    9 A" I" V! k1 D" b* E1 \' B, O
  2. {) v- o% f$ b% A# ]+ \: Y( [$ S) c* u4 E

  3. . v' V! ]: \' v7 h
  4.   /* Clear Interrupt Pending bit */
    ! I4 Y: f7 J3 Z/ M1 }* j8 }
  5.   TIM4_ClearITPendingBit(TIM4_IT_UPDATE);
    6 p" E2 P# x& N3 C- i
  6. }
    4 f% m. |* s' G
复制代码
; M( V, {) R1 Q$ U; h# K" N
前面的 LAB 有使用到按键输入的功能,对于按键输入的判断我习惯上都会搭配时基计数器的方式,在这一个程序当中我用这种方式再来实现一个按按键让 LED 翻转显示的功能。
: p3 @8 k3 y9 d2 R$ F7 h4 ^5 {/ ?: r4 u0 ^4 \7 M3 b
P01.JPG , C) D( X7 X  X: l
8 O  ?, g1 [3 V
uint8_t key_cnt;
! v6 K. ~3 E& }2 U" Q7 v/ o: u! O1 A* O% F1 U4 }
宣告一个全局变量 key_cnt 做为按键 KEY 的状态计数,按键放开时 key_cnt 清除为 0,按键按下时每一个时基 key_cnt 就会加一,在主回圈判断 key_cnt 等于 20 时为按键初按下状态。LED1 固定以 0.5s 的周期闪烁,而按下按键 KEY 之后 LED2 翻转显示。+ P! [' Q# W; V* m1 q. }
( o) j5 x# ]7 S7 T* f8 F; ~8 e) r
main 回圈:
; c$ T5 t2 `+ @4 P$ a' l5 `
  1. void main(void)
    ; L1 X, \8 i. v8 z, E0 c1 {
  2. {
    - c9 w* }3 d. O- F7 ]' u
  3.   /* Clock configuration -----------------------------------------*/- s. l8 I% K3 |' N* z5 l# j
  4.   CLK_Config();  
    : Z  [+ }# R. _1 R5 c
  5. 5 V* ]  c+ [0 ]& ^
  6.   /* TIM4 configuration -----------------------------------------*/9 `0 n" Y: k/ o. V' y) Z" R  P3 k
  7.   TIM4_Config();
    % T0 _8 e0 ]# c. O/ Y( ?! K  @' w- v  R

  8. ' `' V' B3 |4 F% v: N# E
  9.   GPIO_Init(LED1_GPIO_PORT, LED1_GPIO_PINS, GPIO_MODE_OUT_PP_LOW_FAST);/ r) Q' v$ U" M; c, w  l* n/ b
  10.   GPIO_Init(LED2_GPIO_PORT, LED2_GPIO_PINS, GPIO_MODE_OUT_PP_LOW_FAST);0 l3 {% X& K/ h! i1 `* @
  11.   GPIO_Init(KEY_GPIO_PORT, KEY_GPIO_PINS, GPIO_MODE_IN_PU_NO_IT);, k& j; i  _$ g& W* Z, u) x; `
  12.   - ~: G. w4 Z% s4 q- |
  13.   while (1)
    # m& h: T3 i* o' r( `0 h' n
  14.   {
    4 [* Z' ^! c8 r& k6 x) j! Q
  15.     if(key_cnt == 20)& o1 y3 T3 c5 M) g" x/ O: l
  16.     {
    5 ]4 i' s: G' W6 f, b0 m, ]3 y
  17.       key_cnt++;. a5 J4 g9 o; F
  18.       GPIO_WriteReverse(LED2_GPIO_PORT, LED2_GPIO_PINS);
    + a: S2 N. h9 B
  19.     }
    - D- g1 c. W# ^  ?% ^+ _
  20.   }
    * `) V, @' j% }1 j! {3 Z2 t1 \
  21. }
    / z6 P$ z% Z! A" o$ @3 I
复制代码

$ A# q- `# q4 H  I0 y1 E1 _TIM4 中断程序:
/ a  L8 T" f& b6 Z% C; k1 Y, q
  1. INTERRUPT_HANDLER(TIM4_UPD_OVF_IRQHandler, 23), t# w9 F) C2 N8 B6 n& M3 e
  2. {
    # y) y% ~3 t; y$ j5 o4 p
  3.   static uint16_t x = 0;3 ]; U& X0 H9 K1 {$ ^
  4.     5 \; _- k1 B7 [$ Z, a6 [. P
  5.   if(++x == 500)      // 0.5s
    % |+ [6 f$ I; v- f0 G1 L7 h( \, [
  6.   {# Y# |' ]" x# J; H' L& ?' m
  7.     x = 0;
    ) c# _7 V4 x8 X4 V1 @
  8.     GPIO_WriteReverse(LED1_GPIO_PORT, LED1_GPIO_PINS);        // LED1 flash9 x  R; D7 W  N: q  V& P, E
  9.   }
    & N8 k( |$ i7 q
  10.    
    7 S. f0 U6 H+ j% ~
  11.   if(GPIO_ReadInputPin(KEY_GPIO_PORT, KEY_GPIO_PINS))
    ! ~  K( D" w! ~" g  t; Z0 A  L
  12.   {: Q* y" s' a$ s( H3 c. m# \3 `
  13.     key_cnt = 0;
    * j; t0 D) ]0 S0 _$ W
  14.   }" E* X# L8 f' X+ W
  15.   else
    ! G, T1 q7 t. R0 Y4 l
  16.   {! U6 b0 H1 e3 B
  17.     if(key_cnt != 0xff)
    , S, l. J% f+ x, c" O9 h0 X' K  e
  18.       key_cnt++;
    % E2 h1 Y* B) [1 m; g
  19.   }1 C6 |5 Z0 v3 ?; X
  20.   x. \- y* L) E; j9 i  S# {/ Y9 j; `
  21.   /* Clear Interrupt Pending bit *// Z$ A2 a0 M1 b1 C4 x
  22.   TIM4_ClearITPendingBit(TIM4_IT_UPDATE);
    0 a( F& R3 a8 k& B, \
  23. }$ O2 G( I: U& |/ {; D% x
复制代码
2 v, ?1 D  B( u5 X2 \$ m
运行结果:
% K1 f; k- `9 @ 20190130205830.gif
& _. @) P$ b$ w: q- X3 V7 P
6 c" R, a$ Z3 y- P源代码:( T8 [  o( F' P' m, P7 q( V
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:30
6 h6 W7 N- E! @- Y7 m学习了

0 o  T; ?( [7 W7 C+ e感谢关注
wangdexin 回答时间:2019-7-17 14:10:18
学习了。。。
linjue 回答时间:2019-8-22 14:27:13
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版