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

【STM8-SO8】07-秒表计时器

[复制链接]
slotg 发布时间:2019-2-17 18:08
本帖最后由 slotg 于 2019-2-18 00:39 编辑
& @3 u1 `5 U6 \0 U2 p* |% B& O, q7 c6 Q$ A2 Z3 w; d
整合前面几个 LAB 的功能我们来实现一个秒表计时器,STM8S001J3 扣除了 SPI 使用的引脚之外可用的 GPIO 就只剩下 pin1 跟 pin6 了,以秒表计时器所需要的功能我们规划 pin1 做为计时开始/停止按钮,按下按钮后计时器以 10ms 间隔加 1 累积,再按一次则停止计时,而 pin6 为清零按钮,按下按钮后计时器清零。
7 B) `6 z+ z3 h3 B6 n$ [2 {$ C" J# N' P5 H0 u$ G: W
先建立一个显示的函数,参数为 0 时显示 0.00:
" K# F' ~) w) b2 ~( ]
  1. // Display TIMER data
    5 ]; R) d+ o6 B! J! j- h# g8 n
  2. void DS_TIMER(uint32_t dta)
    - B, I% I) j2 _3 u. g9 O7 r
  3. {  O. Y: v5 n& ^; N* e/ f! W
  4.   uint8_t buf[8];
    7 E, }: M. F9 z1 D* V
  5.   int8_t x,y;3 L# C7 \+ A9 H: ]6 r
  6.   bool fg;3 Y# _3 u9 |# H; e
  7. , _, G1 J/ ^% b2 @" T
  8.   for(x=0; x<8; x++)7 @  {5 z( R3 H) X4 M
  9.   {
    6 I2 m! b+ Q# m2 V. p( k. n& r8 a4 m
  10.     buf[x] = dta%10;
    ! p6 H4 H5 k8 @& O5 b
  11.     dta /= 10;! ?( _! p6 R% T/ Q
  12.   }
    * M# A) Q9 x: M# ]& i

  13. $ G3 j! a. B# g) p/ m) X7 B/ Z
  14.   fg = FALSE;
    ) ~* Q: l& E& Y; p& b/ j
  15.   for(x=7; x>=0; x--): k; a1 U" H0 h
  16.   {
    & b& ^% Z1 q0 B( _
  17.     if(buf[x] != 0 || fg==TRUE || x<=2)3 ^- |5 k2 ^$ a+ X! |- b6 k, z/ x: C
  18.     {8 z8 J3 H0 x7 @3 w& X' D8 s5 a) y
  19.       y = buf[x];( K, ^" z- X2 X1 ]* V! I0 P
  20.       if(x==2)
    6 u' M; d  w+ E) {
  21.       {( b, t" X, W! a2 K3 n: Q
  22.         y |= 0x80;
    ! r) l+ X- o+ `' v; z6 J3 a
  23.       }! U4 g& v+ c1 C7 M7 T% v/ Q2 H
  24.       TX_MAX7219(x+1,y);7 w# D7 B6 O: m, s0 _
  25.       fg = TRUE;
    2 m! Y* l( E: K& M+ u; `5 F+ C, o& u
  26.     }. I( D$ m7 c7 ~
  27.     else( J* F: [% g- a
  28.       TX_MAX7219(x+1,0x0f);
    * e* ]* y) @8 p3 y! h
  29.   }( B4 U* Z: E: E! \2 z
  30. }
复制代码

0 q. j" `+ r3 |: O按钮的处理方式可参考 【STM8-SO8】04-定时器TIM4的使用 内容。在这里我们设定 TIM4 每 2ms 中断一次,程序中宣告一个 fg_action 变量做为 TIM4 中断时是否累积计时器 tmr_cnt,当 fg_action 为 FALSE 不计数,为 TRUE 时每隔 10ms 计数加 1。. \) d% f/ }9 ^* P5 B( g7 Z  I

- S" O3 ], y( @% x8 z9 gTIM4 中断程序:
6 c: r' A4 p" f. O7 ~: t2 N
  1. INTERRUPT_HANDLER(TIM4_UPD_OVF_IRQHandler, 23)8 V. n5 n7 Y+ w/ L3 o5 O
  2. { , {( v, _1 u! H, H, F$ q1 R
  3.   static uint8_t x;% N! n- L  }7 Q0 \7 D* P# O+ b
  4.   5 |6 B, U: ^7 B8 N- v6 f
  5.   // for TIMER count/ z% |( Q% j! ?- [: N
  6.   if(fg_action)
    5 y# ^2 H% f3 a- k6 ^
  7.   {
    $ x9 V8 P4 ~) Y5 W
  8.     if(++x >= 05)
    . E1 W9 T/ B# D
  9.     {
    : Y- ~, U% D! ]  ^; g. N- |& P
  10.       x = 0;
    8 M3 Y1 J" u6 P

  11. ; i8 f0 w+ r1 x+ f
  12.       tmr_cnt++;  |0 ?& p& T( I/ n6 u! V& `- C
  13.       fg_ref_tmr = TRUE;& y+ i- {! u3 @3 ]1 V8 A
  14.     }& X8 G8 A# T, L$ U
  15.   } 9 S0 u4 U& J; i% p% H/ ?

  16. 6 ?' g- }6 z4 `
  17.   // for key sw
    7 q9 k4 t0 [. a! Z& R' Q1 e
  18.   if(GPIO_ReadInputPin(KEY1_GPIO_PORT, KEY1_GPIO_PINS))
    ) v! [: |9 F* W2 m* l
  19.   {% H/ f; q; s: |( M: t7 {
  20.     key1_cnt = 0;/ \1 w5 y' i2 i- {
  21.   }
      {) L6 K/ j2 @# }
  22.   else6 b% a/ e2 t, d4 _4 h/ j6 e- O# J
  23.   {- c6 R& Z2 z1 U3 Y& v& {
  24.     if(key1_cnt != 0xff)/ d2 r/ A8 Z& }6 f, D
  25.       key1_cnt++;% @. G5 b: o+ R3 F) T) Z
  26.   }
    & H( x. c& V- S

  27. / @* O, C/ \$ V6 S( L5 U
  28.   if(GPIO_ReadInputPin(KEY2_GPIO_PORT, KEY2_GPIO_PINS))) ~% Y. w  R4 Q; e1 a9 |  B
  29.   {/ f/ P3 ]7 ]& Q7 z2 s4 @
  30.     key2_cnt = 0;
    / w8 S1 E+ [4 H2 ?  {" P
  31.   }
    + ~4 A2 G/ H% r
  32.   else. `2 G  c6 l; `- }2 z& b
  33.   {1 Z! W0 P. O; i" \
  34.     if(key2_cnt != 0xff)
    ' r% T; y! D9 T- u  i
  35.       key2_cnt++;
    0 l. ?/ O. p% |! Y% |9 F! l- R
  36.   }
    % x: B9 k  e! d' [

  37. 0 ]+ D) ?# k* j7 Y+ r
  38.   /* Clear Interrupt Pending bit */5 x+ F3 c* q" R
  39.   TIM4_ClearITPendingBit(TIM4_IT_UPDATE);
    ) p5 P  }  I5 ^! X& M- \
  40. }
复制代码
" v3 T' N% u9 b) m% |! ^- m# {0 t
main 回圈:
  1. void main(void)7 v. s# a1 y( c0 u
  2. {6 E! N- D4 _  s0 ~, u6 u- `* \
  3.   /* -------------STM8S001 startup-------------- */
    ! w- J9 j/ G* V: e& F- R
  4.   /* delay for SWIM connection: ~5seconds */
    ; i( O$ T1 i$ E6 J# \
  5.   STARTUP_SWIM_DELAY_5S;8 Q! t' G. \' E$ e
  6.   
    1 m  k+ t9 a  g+ ^( U* a
  7.   /* configure unbonded pins */( L* t! }" O" y1 M/ x; B
  8.   CONFIG_UNUSED_PINS_STM8S001;/ v! Q+ @- u1 I4 x: a2 g# s
  9.   
    " {# R( K% g+ {& b
  10.   GPIO_Init(GPIOA, GPIO_PIN_3, GPIO_MODE_OUT_PP_HIGH_FAST);     // NSS/ R) v6 C9 {& @6 d( _/ n
  11.   GPIO_WriteHigh(GPIOA, GPIO_PIN_3);
      o& A+ |, Z  D6 Z+ T1 _  a+ B
  12.   1 w& c% B/ d) W( w
  13.   GPIO_Init(KEY1_GPIO_PORT, KEY1_GPIO_PINS, GPIO_MODE_IN_PU_NO_IT);     // pin1
    , F. N7 D3 W2 D7 G
  14.   GPIO_Init(KEY2_GPIO_PORT, KEY2_GPIO_PINS, GPIO_MODE_IN_PU_NO_IT);     // pin6
    7 f# d: M+ c; i& v1 Z' d+ j
  15.   /* ------------------------------------------- */6 B, U9 G: r6 B0 F# S1 s# |* K# k  w
  16. & f2 W" f, ^& D- U& n9 z; n
  17.   /*High speed internal clock prescaler: 1*/
    9 o# v  p+ g4 }$ N
  18.   CLK_HSIPrescalerConfig(CLK_PRESCALER_HSIDIV1);
    2 ~( Y0 B/ }% H' o3 U' M

  19. , `2 s% }, d/ G" f9 J2 ]
  20.   /* TIM4 configuration -----------------------------------------*/7 X! X+ X. G$ v4 B, o7 U
  21.   TIM4_Config();
    * E% v5 `* x2 L0 e0 j$ x7 ]* D

  22. + ^2 M$ z& B. m
  23.   /* SPI configuration */6 n- j4 H6 G* @* b' i* H
  24.   SPI_DeInit();
    : f3 w8 r+ y* p, m; v" G
  25. / ?% O! x3 f/ B5 j- @4 K5 L% \
  26.   /* Initialize SPI in Slave mode  */
    1 }2 i5 M  I; v+ p! e: T
  27.   SPI_Init(SPI_FIRSTBIT_MSB, SPI_BAUDRATEPRESCALER_2, SPI_MODE_MASTER, SPI_CLOCKPOLARITY_LOW,
    5 O6 V: Q- ^3 _5 _
  28.            SPI_CLOCKPHASE_1EDGE, SPI_DATADIRECTION_2LINES_FULLDUPLEX, SPI_NSS_SOFT,0x07);
    ( s2 U9 D6 J- b
  29. 7 M/ v- ?4 F% e/ @0 ]
  30.   /* Enable the SPI*/5 O% \! I3 Z# G
  31.   SPI_Cmd(ENABLE);
    3 N" B$ H, b( V/ ~; L) n

  32. & R% p" e+ ], V
  33.   MAX7219_Init();       // Init MAX7219
    " ?5 r# _+ `1 O$ R9 G
  34.   Blank_SEG();          // Blanking SEGMENT  4 N2 t1 X' I) r' q7 b& w

  35. ) H$ W4 w3 W& o3 J. ^' }4 \& K! o
  36.   fg_action = FALSE;
    ; I! B- d1 I9 ]
  37.   fg_ref_tmr = TRUE;1 W4 U# @6 u( u, v
  38.   tmr_cnt = 0;
    5 e0 @) U* N6 d) f7 i: S

  39. ' h! G! G" t3 b9 |" l4 z4 J% D
  40.   while (1)
      A9 X0 p9 X4 z/ A" e. B* Q
  41.   {
    # ]+ }  P1 Q; d& c9 g3 e
  42.     if(fg_ref_tmr)$ Y0 [4 K$ n0 Z+ N9 b0 o( c% d: g9 t6 ~
  43.     {0 F, _5 {, [% \* s
  44.       fg_ref_tmr = FALSE;7 V0 X. |( a3 c) Q) {1 ^
  45.       DS_TIMER(tmr_cnt);- r( l6 h8 `2 Z1 m$ z/ T0 p
  46.     }
    : R- I$ P* ~. E
  47.     $ D$ P* F" b" x7 J( @: r
  48.     if(key1_cnt == 10)          // pin10 e  P+ Z/ z% Z: {9 K* l6 ~  [' D
  49.     {
    - H" R  Y' a( E/ a
  50.       key1_cnt++;
    ' `, I' c1 f6 D: i$ h9 [' e

  51. + u0 I0 R' @2 X0 Q
  52.       if(fg_action), W7 a" i) l; A( @& O0 q* {
  53.         fg_action = FALSE;7 K  [3 x& p/ D" n$ H- E  R
  54.       else
    6 c+ O. d3 I3 \
  55.         fg_action = TRUE;
    : r3 O' ~# g& s1 s& K. j3 ]1 z& v- a
  56.     }
    8 m7 x# O6 a' F; D1 ^
  57. ' t, B" ?6 z& C% b3 A
  58.     if(key2_cnt == 10)          // pin6- O' t- M$ _9 \7 ~5 E: X
  59.     {5 P4 |+ n+ \6 r3 ^0 m
  60.       key2_cnt++;  i) g5 N8 U8 ]$ [
  61. 3 e1 O; i  D3 H2 a6 J" a0 d* g
  62.       fg_action = FALSE;
    % Z8 J+ U; n  Z
  63.       tmr_cnt = 0;
    $ Z1 S9 Q* B( B) m* Y
  64.       fg_ref_tmr = TRUE;
    + ~% k5 P! u3 c- q3 s# I
  65.     }
    6 ^+ P. y/ H* L1 P4 ]  [7 Y- w
  66.   }
    + Z$ g/ [) T' V5 ~' t# q4 O
  67. }
复制代码
' m0 a; K  l: l% f. C% E
程序下载运行后发现 pin6 的清零功能不太正常,查了一下规格书里面的说明:# Q# Q- m, Q7 V0 b6 V, r
$ s1 t; V; O) ]5 O2 O
P01.jpg 5 V: Q$ x8 ], r) a: z) Q# A, s
wpu = weak pull-up
4 @; Z9 W2 m# A  a% w; A4 y6 m# U( ^& B6 U' ?
原来这支引脚内部是没有上拉电阻的,我外接了一颗上拉电阻后动作就正常了。6 d" K$ m/ w$ ~8 _0 y8 e
2 i- @) K3 h1 O. d9 [
运行结果:1 r1 B) Y$ E( T4 Q
20190217180932 00_00_00-00_00_10.gif ) P+ F# `! p. I+ s5 @) n

8 [8 I2 z4 s$ O" H# b3 w/ g! K% J% Y" _源代码:
1 G/ B$ y: v0 A6 G3 X B09.rar (1.07 MB, 下载次数: 9)
收藏 评论4 发布时间:2019-2-17 18:08

举报

4个回答
STMCU-管管 回答时间:2019-2-18 15:54:17
谢谢楼主分享
slotg 回答时间:2019-2-18 22:09:50
STMCU 发表于 2019-2-18 15:54( v/ Q* `' t/ k' ^
谢谢楼主分享
1 v! U6 i* W- j5 Y9 a
感谢关注
Kevin_G 回答时间:2019-2-19 11:41:47
支持一下
slotg 回答时间:2019-2-19 11:50:58
Kevin201707 发表于 2019-2-19 11:41. `! H9 s# s3 {+ a  O
支持一下

) N6 G, ~5 P: O) j4 P感谢关注
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版