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

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

[复制链接]
slotg 发布时间:2019-1-30 20:45
本帖最后由 slotg 于 2019-1-30 20:47 编辑
$ f) l  C6 ?7 C3 [- f/ @2 `
) N$ X" T; ~. M8 NSTM8S001 内部有 3 个定时器 TIM1、TIM2、TIM4,其中 TIM4 是一个 8 位的定时器,架构与功能算是比较简单的一个,很适合做为时基的使用,基本用法如下:1 a2 y4 K. E% Q( N' L8 z' L: w
' U% ?  ~. z0 P) p! c
main 回圈:4 o% ^3 n3 b' `8 x3 ]: T+ s
  1. void main(void), W! z+ J& A* m  \
  2. {
    ! {, A  j7 X( e7 Z! Y# G) I$ i
  3.   /* Clock configuration -----------------------------------------*/9 ?5 I5 ^- `1 Y- `; n
  4.   CLK_Config();  
    % P' _6 W3 n' i  `$ o% t

  5. ( m: Z& S0 \3 b6 _3 q  s- G* \
  6.   /* TIM4 configuration -----------------------------------------*/, V0 M4 ]9 ?! M
  7.   TIM4_Config();    4 J; D. o  T9 D: a9 t% @
  8.   7 l  v5 m- l% g2 l) A2 x
  9.   while (1)) ]0 o' s3 S& P! v& }
  10.   {
    : P3 x" t9 d  l$ r+ G
  11.   }
    ( {7 m9 }6 D# J2 I4 B7 [" e6 z8 L
  12. }% L2 T. H7 K; D1 O/ l6 O7 }
复制代码
: ~& r1 `  z/ \- G+ L- o
将系统时钟主频设定在 16Mhz:
( D4 G% r  A, J; N
  1. static void CLK_Config(void)
    % v% L! K6 X1 K* N3 `' N
  2. {5 [. K% l" |* }9 i5 D
  3.   /* Initialization of the clock */
    6 ?7 Q4 K) Y: z' V( |% P5 [
  4.   /* Clock divider to HSI/1 */3 I8 D; g5 [& c/ S" x/ V' j! S
  5.   CLK_HSIPrescalerConfig(CLK_PRESCALER_HSIDIV1);7 M# g5 X  n: n2 t! N
  6. }
    , ^: V, M; d. U
复制代码
" [$ ^; S" @1 `
将 TIM4 中断设定在 1ms 中断一次:
: a) }2 [6 T4 Q. T
  1. #define TIM4_PERIOD       1247 ]/ Y$ @6 V' B0 s. O3 w. e, P
复制代码
  1. static void TIM4_Config(void)) b. a& T. Z" `; U
  2. {
    * v4 y) R5 V- n0 x2 p- Y
  3.   /* Time base configuration */
    6 p) W7 D# g& R8 v& W5 f$ t4 E
  4.   TIM4_TimeBaseInit(TIM4_PRESCALER_128, TIM4_PERIOD);
    : S  J0 u5 _: z) A$ P
  5.   /* Clear TIM4 update flag */) Q" J. K+ U+ p. U0 d5 m, e
  6.   TIM4_ClearFlag(TIM4_FLAG_UPDATE);" [) ?$ Z; ]' f: X0 m
  7.   /* Enable update interrupt */% A3 }; O. w: O# @' i
  8.   TIM4_ITConfig(TIM4_IT_UPDATE, ENABLE);# @0 I7 t, A, S6 B3 p+ I, M
  9.   : s/ T3 T( Z1 p" C4 I
  10.   /* enable interrupts */; r9 ?: ^' G  }7 _( o
  11.   enableInterrupts();) @0 w9 y/ P  b( h4 a
  12. % m" a8 L+ Z/ Z3 @' {, {# |3 v
  13.   /* Enable TIM4 */, a/ p, o. i0 b5 i
  14.   TIM4_Cmd(ENABLE);
    4 Z# P. o2 a9 b6 B/ ~; L
  15. }- o; p" @$ f/ a% P
复制代码
" w$ T# f4 ?4 e
16Mhz / 128 = 125Khz
/ I! X. _$ p6 U, [3 d3 ], X. Y125Khz / 125 = 1Khz --> 1ms # z; o4 k& V/ g% ?

! F  [$ A5 f2 [; gTIM4 中断程序在 stm8s_it.c 这里:
( W0 P' E4 ~  C; n* a- G
  1. INTERRUPT_HANDLER(TIM4_UPD_OVF_IRQHandler, 23), ~' ]/ s, A* L+ @; W+ k
  2. {1 C$ O. C3 y. A+ |* C  Y6 g

  3. $ @' }- o$ [. t
  4.   /* Clear Interrupt Pending bit */+ I, C. z( Y: V  G
  5.   TIM4_ClearITPendingBit(TIM4_IT_UPDATE);7 g. Y5 I! O& P( b# p
  6. }
    ( H6 ?' Z/ e6 B+ p5 R6 k
复制代码

" d$ S( z) _% f3 P前面的 LAB 有使用到按键输入的功能,对于按键输入的判断我习惯上都会搭配时基计数器的方式,在这一个程序当中我用这种方式再来实现一个按按键让 LED 翻转显示的功能。, T8 l/ E8 j; ~4 |+ P

' r! N# H4 W! G' a6 f P01.JPG   {* o. t' L4 K! N

1 x9 g: J3 C- Z! Juint8_t key_cnt;
# Q0 B9 x5 Y2 a
' Y+ d6 R% u  z' g1 [宣告一个全局变量 key_cnt 做为按键 KEY 的状态计数,按键放开时 key_cnt 清除为 0,按键按下时每一个时基 key_cnt 就会加一,在主回圈判断 key_cnt 等于 20 时为按键初按下状态。LED1 固定以 0.5s 的周期闪烁,而按下按键 KEY 之后 LED2 翻转显示。7 {! b8 L! j1 a; |- I/ y
, s# z6 i+ t7 K: h/ O/ L; t
main 回圈:9 s+ s' q! v  X: C9 k6 u
  1. void main(void)
    2 O4 l" q% Z/ z8 ?! r
  2. {
    + x* V0 t# f# a2 @
  3.   /* Clock configuration -----------------------------------------*/6 J0 N4 v5 U& q# \& I
  4.   CLK_Config();  * e% [% i4 c2 w) p. k

  5. # \1 z+ g* k4 l% J
  6.   /* TIM4 configuration -----------------------------------------*/* ?6 |& d) [1 F2 k# y
  7.   TIM4_Config();
      f  s0 {% T; g

  8. & W) Q( p! [" w: W8 x
  9.   GPIO_Init(LED1_GPIO_PORT, LED1_GPIO_PINS, GPIO_MODE_OUT_PP_LOW_FAST);
    ) z& p$ `' I% Z8 e3 A
  10.   GPIO_Init(LED2_GPIO_PORT, LED2_GPIO_PINS, GPIO_MODE_OUT_PP_LOW_FAST);
    , ?" _- L/ d- _& `7 j
  11.   GPIO_Init(KEY_GPIO_PORT, KEY_GPIO_PINS, GPIO_MODE_IN_PU_NO_IT);
    9 f2 ^6 l9 }1 z- z
  12.   
    . J/ W8 z& E  {( C, e
  13.   while (1)* @' Z5 v/ o. X' z# S# F' P
  14.   {/ M- z  x& |) ]
  15.     if(key_cnt == 20)1 b3 y9 Y5 u4 Y9 g3 F  l- D
  16.     {
    ! z" R' `4 ^0 F
  17.       key_cnt++;
    ; j9 D7 y& R4 a" D% m5 p
  18.       GPIO_WriteReverse(LED2_GPIO_PORT, LED2_GPIO_PINS);+ |6 P# d) p: z' o
  19.     }; s  i- t5 r4 Y' l
  20.   }0 h2 X2 M1 P/ X* ^: ^
  21. }
    % ~1 u8 I9 L, V! A$ q9 J' Y
复制代码

2 p! j6 c& H4 W$ [$ O% ZTIM4 中断程序:/ L" O% u1 b1 i
  1. INTERRUPT_HANDLER(TIM4_UPD_OVF_IRQHandler, 23)
    9 g( q% c- ~5 I% M9 K! u  Q
  2. {
    ! R* w( Y- I" ~  W( c* _* H5 ]/ U! A
  3.   static uint16_t x = 0;
    0 b) \: o' _8 [* h" w
  4.    
    # d2 x+ A1 W2 G4 Y  y5 h
  5.   if(++x == 500)      // 0.5s6 M2 J. D; L& r
  6.   {5 N+ f3 h6 a, `. j$ l
  7.     x = 0;/ C% [' z; ?( {1 B7 k, t/ U& W+ L* O
  8.     GPIO_WriteReverse(LED1_GPIO_PORT, LED1_GPIO_PINS);        // LED1 flash. y. I3 N# z5 @) n
  9.   }3 d* N, b, a& Q' U" c! T: I$ @
  10.    
    " u& {  p% R1 [/ I; A0 D; j; x- l
  11.   if(GPIO_ReadInputPin(KEY_GPIO_PORT, KEY_GPIO_PINS))
    6 }* C; a4 F% d3 i) |
  12.   {: Z0 |% T' v  c+ o
  13.     key_cnt = 0;+ n5 `6 y4 Z0 ]; M
  14.   }% M0 t4 p1 \. `( K" u
  15.   else' \- c: `: I/ @2 F( k' q
  16.   {* U+ V9 ~7 u& S! {2 a5 _
  17.     if(key_cnt != 0xff)
    : ?; s! M" c0 y
  18.       key_cnt++;
    7 b. z9 v. T3 K# G
  19.   }
    " r) L  z" }' Y/ O6 L7 O( \
  20. : L6 n9 Y# h. t' {0 v/ o1 I
  21.   /* Clear Interrupt Pending bit */5 Y' X$ y# I7 q& ^
  22.   TIM4_ClearITPendingBit(TIM4_IT_UPDATE);
    1 h( H6 X8 z0 s7 N+ Z& g! y0 ]
  23. }6 S% c3 C' p  J' j% ~8 A
复制代码
) Y4 A/ p- z! l( ]
运行结果:- F7 d( o  i6 [
20190130205830.gif , T$ R( y3 S$ Q' H1 }

; B% c7 a0 W1 u# R# Z9 \2 v+ u+ y7 \源代码:
: J8 P+ o: ~: O/ E7 X& k1 m B06.rar (966.02 KB, 下载次数: 11)
赞 收藏 评论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$ u- C7 V+ R- Z% x' Z3 H- n, v) U
学习了
; f9 o& D. Y; M% c9 b& M& o/ v
感谢关注
wangdexin 回答时间:2019-7-17 14:10:18
学习了。。。
linjue 回答时间:2019-8-22 14:27:13

所属标签

相似技术帖

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版