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

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

[复制链接]
slotg 发布时间:2019-2-17 18:08
本帖最后由 slotg 于 2019-2-18 00:39 编辑
" w3 R2 M6 P- T8 u$ J( R+ B# u/ r1 q1 j
整合前面几个 LAB 的功能我们来实现一个秒表计时器,STM8S001J3 扣除了 SPI 使用的引脚之外可用的 GPIO 就只剩下 pin1 跟 pin6 了,以秒表计时器所需要的功能我们规划 pin1 做为计时开始/停止按钮,按下按钮后计时器以 10ms 间隔加 1 累积,再按一次则停止计时,而 pin6 为清零按钮,按下按钮后计时器清零。" P, ]7 G0 X! `& }) d0 ]- X& k; t, \
: B+ o# q& L% e3 _/ [+ A; ^! A
先建立一个显示的函数,参数为 0 时显示 0.00:  S# u. t0 b3 C( D0 p  {
  1. // Display TIMER data. ^6 g0 I$ |& }. H
  2. void DS_TIMER(uint32_t dta)
    - R2 N2 \) a# Y
  3. {' ^& {3 u4 M. H+ t. [0 v. d
  4.   uint8_t buf[8];0 _" a  A* {9 h/ u$ |
  5.   int8_t x,y;
    , h2 @6 _/ z* E; t  D, P
  6.   bool fg;! F9 w% [7 m" U: c

  7. 8 O& Q# o5 c! ^4 `
  8.   for(x=0; x<8; x++)) ^% R% x/ o* m# I, S/ f
  9.   {- ~! M; q3 [7 W/ L* o6 }. \
  10.     buf[x] = dta%10;) ^5 M3 E9 `4 |
  11.     dta /= 10;
    ! S% ^' e% L6 Z& F5 @* l4 D
  12.   }
    / b  r4 u2 J8 Y5 h, r: g, e) U9 J

  13. * l6 z9 @+ \, K' f) u, D3 A
  14.   fg = FALSE;
    4 R9 \' L- q* [# S  {( E
  15.   for(x=7; x>=0; x--)
    4 E* _8 M. \9 O# c$ s
  16.   {
    . A6 q" x" t* B
  17.     if(buf[x] != 0 || fg==TRUE || x<=2)
    - `2 N) c3 r$ o/ y8 x6 ]5 F" Q* d# {
  18.     {! u  N& i: z& V# k. m
  19.       y = buf[x];- V1 ?; |. Q$ |+ u! }
  20.       if(x==2)
    ' \, I( X* T; X: n- O+ e
  21.       {
    : I( n* i7 c( x1 [) i0 N5 l
  22.         y |= 0x80;' c2 b: n) l9 a7 s: h0 l
  23.       }
    1 o, O( H- j1 q
  24.       TX_MAX7219(x+1,y);, K2 M+ S5 @2 h/ f, z. E/ S
  25.       fg = TRUE;
    ; ^3 k: c& `/ b
  26.     }
    2 M& s$ E0 i% B) z
  27.     else% J# H+ u. G# d* v) x& Q) z
  28.       TX_MAX7219(x+1,0x0f);
    : W; }) Q; w: `/ [8 F4 C4 `9 A
  29.   }
    2 a' Y' o" X9 D% C- N6 K
  30. }
复制代码

4 c  Z9 T! Y* N8 ^7 r% m按钮的处理方式可参考 【STM8-SO8】04-定时器TIM4的使用 内容。在这里我们设定 TIM4 每 2ms 中断一次,程序中宣告一个 fg_action 变量做为 TIM4 中断时是否累积计时器 tmr_cnt,当 fg_action 为 FALSE 不计数,为 TRUE 时每隔 10ms 计数加 1。) o4 o7 [! _0 O  z
% @# w. b0 b' [3 g, v; T
TIM4 中断程序:+ r- H$ Y# B4 W' @4 I) O
  1. INTERRUPT_HANDLER(TIM4_UPD_OVF_IRQHandler, 23)6 B6 L+ v9 l" a0 i8 b7 M( x
  2. {
    . _; s( ~! H# z
  3.   static uint8_t x;- w/ g5 {& N' P" P0 s
  4.   9 E" t! B) m+ K8 ?* i1 n
  5.   // for TIMER count
    ! _$ b0 V% S8 V  Z) ~$ Z
  6.   if(fg_action)2 B  X! s: y9 a
  7.   {2 b8 @9 k! p( ]5 ~4 z3 z
  8.     if(++x >= 05)
    8 @4 U, `4 Z: I) C! R
  9.     {
    + c/ `: R$ N  I; m* l2 ^& q4 g
  10.       x = 0;' j0 [$ _9 B- |3 D) t  [+ t

  11. $ E1 @9 B0 M6 z
  12.       tmr_cnt++;7 ]- {, Y3 y8 J: G! @8 u
  13.       fg_ref_tmr = TRUE;" p. J" R! p' g0 w- k( r. A
  14.     }( s0 S  h( K$ T* X! P1 o2 E7 h
  15.   }
    # t: _" N) `* Q1 Y8 D! v. w- p

  16. ; s/ _' m2 {* [/ R
  17.   // for key sw$ c3 r: L- F/ M
  18.   if(GPIO_ReadInputPin(KEY1_GPIO_PORT, KEY1_GPIO_PINS))
    ! L- G! g$ @7 x  D: k. ]8 X2 h9 ?
  19.   {! r; D; A6 s+ h7 E8 k" w
  20.     key1_cnt = 0;
    ) N* Y0 S- O2 k, S
  21.   }! C5 A. c! [  t4 ~' l
  22.   else
    7 U9 S* ?; _; R2 s# k; h
  23.   {
    9 S: c  U" |* b' S* e$ D
  24.     if(key1_cnt != 0xff)
    0 c* Z8 `( L  i6 ?9 {; @* o! p  _) l
  25.       key1_cnt++;
    $ @1 v& \2 R* o& `
  26.   }' r7 C, \8 _/ e8 K  {

  27. , A' E2 j' a+ e1 `3 a
  28.   if(GPIO_ReadInputPin(KEY2_GPIO_PORT, KEY2_GPIO_PINS))9 P2 D5 C' \5 M3 A: s/ V0 T
  29.   {% X; d% F; G& l4 y
  30.     key2_cnt = 0;
    ' i' ?# M0 h3 U' D9 m* c6 B; h& ~
  31.   }
    4 T1 I  r4 [5 [) v  `$ x% r
  32.   else
    4 r1 d* d; e' I7 }9 F4 Q. M: A
  33.   {9 `% P% \& W4 a7 c$ ?
  34.     if(key2_cnt != 0xff)
    1 H3 [  U! ]3 J+ v$ I
  35.       key2_cnt++;* P5 F& ?9 @. ^. e/ w
  36.   }
    " [. v8 P' ~8 }3 a0 c1 j. ]/ M

  37. 7 {* Z: o1 m3 L2 d; ]
  38.   /* Clear Interrupt Pending bit */: J9 L8 e& G: y
  39.   TIM4_ClearITPendingBit(TIM4_IT_UPDATE);
    / M* r) D( P! X( p2 o2 L
  40. }
复制代码
% P6 {* E- F2 K( k0 ]) T
main 回圈:
  1. void main(void)- i* J9 e. g' B( M& r. ?
  2. {7 D. R" O7 _4 x( m& z
  3.   /* -------------STM8S001 startup-------------- */
    , u9 O' P; I! ?/ [  V
  4.   /* delay for SWIM connection: ~5seconds */5 X0 q$ w9 H6 S6 ]# U. Z0 O- x5 i. ~
  5.   STARTUP_SWIM_DELAY_5S;9 E( [5 M6 Z: z, Y
  6.   
    " ?, G, z* J( d
  7.   /* configure unbonded pins */
    4 e% o  t- o) I6 M+ \6 i- q5 _
  8.   CONFIG_UNUSED_PINS_STM8S001;
    % @! `7 C8 f5 o2 i" N& J) v
  9.   2 |: o1 V0 `$ z7 `
  10.   GPIO_Init(GPIOA, GPIO_PIN_3, GPIO_MODE_OUT_PP_HIGH_FAST);     // NSS
    * x3 [- E1 W% p; c" O6 j3 \
  11.   GPIO_WriteHigh(GPIOA, GPIO_PIN_3);
    ; `  B0 r7 x, P% E. F
  12.   ! h5 `( p( K7 |4 K% n1 A7 f
  13.   GPIO_Init(KEY1_GPIO_PORT, KEY1_GPIO_PINS, GPIO_MODE_IN_PU_NO_IT);     // pin1
    * e. A: ~/ h1 n2 Y. t5 n
  14.   GPIO_Init(KEY2_GPIO_PORT, KEY2_GPIO_PINS, GPIO_MODE_IN_PU_NO_IT);     // pin6; u/ ?0 I* n* c
  15.   /* ------------------------------------------- */! |8 }& r, B% \# X

  16. % S# U4 B4 D( U7 w- y+ H2 m; C' ]; b
  17.   /*High speed internal clock prescaler: 1*/& v% _. `$ X; [
  18.   CLK_HSIPrescalerConfig(CLK_PRESCALER_HSIDIV1);; d8 ?* h5 E4 T6 d0 @  R3 G' n
  19. # I9 p% |3 W/ ^% j
  20.   /* TIM4 configuration -----------------------------------------*/
    : ?7 w" D7 ?$ o' _- e7 l
  21.   TIM4_Config();
    4 t. d# }% u( i# T

  22. 4 {$ P* c2 r0 F
  23.   /* SPI configuration */4 v2 I8 e  f$ R2 [( {9 G
  24.   SPI_DeInit();
    5 {3 h8 d! i. V% `
  25. ; n- j3 f  {( T' A6 N
  26.   /* Initialize SPI in Slave mode  */0 j. Z$ y( C4 b/ w
  27.   SPI_Init(SPI_FIRSTBIT_MSB, SPI_BAUDRATEPRESCALER_2, SPI_MODE_MASTER, SPI_CLOCKPOLARITY_LOW,
    1 l& i0 t: j$ u4 y3 l9 w
  28.            SPI_CLOCKPHASE_1EDGE, SPI_DATADIRECTION_2LINES_FULLDUPLEX, SPI_NSS_SOFT,0x07);
    ! \  U4 V) g3 u% Z8 V8 B
  29. : q4 s! ~% d) Z: C; r9 h2 A
  30.   /* Enable the SPI*/
    . Z. p$ m9 w5 m, Q4 M- r0 i+ _
  31.   SPI_Cmd(ENABLE);
    + j: `. E8 Y8 X2 C' J4 a: I1 r% X( {% u
  32. , I3 D, m  y4 F
  33.   MAX7219_Init();       // Init MAX7219
    ' l- `+ X. Z6 n7 ]5 Z( `3 }
  34.   Blank_SEG();          // Blanking SEGMENT  
    ) k) K/ Z* w" p4 L
  35. 3 |* `5 F1 _' w+ n6 s3 {7 A
  36.   fg_action = FALSE;
    ( L: p! H) O3 p; T0 p2 I
  37.   fg_ref_tmr = TRUE;
    5 q) [$ e0 ^3 a6 O& B: V+ W, {# Y
  38.   tmr_cnt = 0;
    : K$ \+ s8 d& {' j: Z
  39. , X, F* {0 O* F, r4 D6 x2 w
  40.   while (1)# F: S' e' F( N( t  q$ E2 g
  41.   {
    7 n1 {3 F. S4 Q8 ]0 K
  42.     if(fg_ref_tmr)
    # K7 o" g% k8 Q  H
  43.     {$ J6 u4 w  ^2 ?* f1 U7 }
  44.       fg_ref_tmr = FALSE;
    5 C/ \6 T( _( V9 d$ ]
  45.       DS_TIMER(tmr_cnt);2 h# P0 _- }+ W# }& l; a
  46.     }# V# L6 `7 t8 b4 M+ s- F, {
  47.    
    9 r4 m$ z3 X2 Y. g% U2 f, u  D
  48.     if(key1_cnt == 10)          // pin1" L/ ?/ i- h6 a% [+ D
  49.     {
    # X+ C6 B3 a9 b
  50.       key1_cnt++;  L. ^1 Z. W* E9 U0 s3 `2 i, S4 Q! |; s

  51. ' U/ f/ A) U& f7 J1 s% o
  52.       if(fg_action)
      o* a- Q9 [+ c: Y$ H
  53.         fg_action = FALSE;
    4 B# o, a, \6 A2 |/ w$ ?
  54.       else0 q9 D! ^( M( E6 o
  55.         fg_action = TRUE;3 _- V: Q& N" ~8 l0 s( _
  56.     }! x/ n5 X) @8 D0 c! h' ]% X2 n

  57. 9 K# o0 U+ l( ~
  58.     if(key2_cnt == 10)          // pin6
    ' c9 f0 O8 T( F  e9 ]3 l" R7 I$ \
  59.     {# T; z; n9 {: Y; S: D4 j% K! [
  60.       key2_cnt++;. r3 d3 P: {+ Q5 k# Q
  61. 8 S$ G9 I3 D: m
  62.       fg_action = FALSE;
    " X5 I% h& v$ m
  63.       tmr_cnt = 0;
    ! W/ S, \( u- l  R2 ~' h2 G
  64.       fg_ref_tmr = TRUE;) Z  l+ i$ ?# p- ]
  65.     }
    % d% @% P1 I% o* Y6 `. b- b' C" `$ k
  66.   }6 F- u; V9 [, |* F" |! H1 y1 n
  67. }
复制代码

. y: b0 C- T# R+ d. e: E( L, @4 F+ A程序下载运行后发现 pin6 的清零功能不太正常,查了一下规格书里面的说明:1 t% v; a* O& }2 _! R
& m5 c# R$ _+ V- P: A; u
P01.jpg " y# Y0 o# E* I
wpu = weak pull-up
" C8 Y: h1 Z0 O, j3 ]2 i: U: `: C( r9 L. h+ s  }* L/ S) t6 u5 _
原来这支引脚内部是没有上拉电阻的,我外接了一颗上拉电阻后动作就正常了。0 l' ^# ?- z7 o: B

' x# W+ ?6 C4 G) V. `$ h# i3 U运行结果:
) J; ?9 ^" R# {9 x$ X4 N: A 20190217180932 00_00_00-00_00_10.gif
+ n, c2 e0 K" o  \+ P
1 s' K' D, j! T6 q3 E; K7 c! X: y源代码:
. P: P: J/ M5 {, M" S0 X3 e$ W B09.rar (1.07 MB, 下载次数: 8)
收藏 评论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
6 z% ?& c6 S$ p! i, h! c# s谢谢楼主分享
( G& B' K4 D% Y5 N
感谢关注
Kevin_G 回答时间:2019-2-19 11:41:47
支持一下
slotg 回答时间:2019-2-19 11:50:58
Kevin201707 发表于 2019-2-19 11:41
7 m2 {& f, i, @" d, ^支持一下

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