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

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

[复制链接]
slotg 发布时间:2019-1-30 20:45
本帖最后由 slotg 于 2019-1-30 20:47 编辑
* H9 C# B% R2 S  r7 G# V* R$ W  v) W2 a" H$ w0 g( C
STM8S001 内部有 3 个定时器 TIM1、TIM2、TIM4,其中 TIM4 是一个 8 位的定时器,架构与功能算是比较简单的一个,很适合做为时基的使用,基本用法如下:8 L& {5 h* a( O. r4 c

# I& R( j8 P' y+ H; n2 b# Z3 o6 y# H! kmain 回圈:8 n- n% f1 s' |' Z+ {
  1. void main(void)
    * c& v* d! x8 h& W0 R4 k
  2. {# \$ n9 w! R8 J" H- @3 Y. A
  3.   /* Clock configuration -----------------------------------------*/3 N  k  J8 s2 M0 ~" Y* P
  4.   CLK_Config();  
    % f  d* G) x2 V3 c% y

  5. ! X0 o& z0 \; N+ a* Y
  6.   /* TIM4 configuration -----------------------------------------*/( z, _# ]3 N; g$ s$ G  c  o8 q! s
  7.   TIM4_Config();    ) u2 B0 ~8 p, O% r+ o! X1 O
  8.   
    + E1 {6 K) a+ [- p7 L! d( L' R
  9.   while (1)
    3 k& c9 W/ i3 ~0 t2 @* L$ t
  10.   {4 X; l. h+ k- [- q: {
  11.   }5 @- p/ G! U5 m' P% \; C0 b9 W/ m
  12. }
      |  A: i; e  _+ S
复制代码
/ j+ T7 z7 l) h
将系统时钟主频设定在 16Mhz:
" l7 {  V9 c! d2 o. ?
  1. static void CLK_Config(void). y) [4 I4 S+ A4 V
  2. {& K, D6 }2 r5 j# @) i
  3.   /* Initialization of the clock */
    2 D4 Z9 U1 i- F) q* J% n! A
  4.   /* Clock divider to HSI/1 */
    ! p- L; w8 I3 C) g3 J. N: M
  5.   CLK_HSIPrescalerConfig(CLK_PRESCALER_HSIDIV1);
    % G; r, O( z- N% j
  6. }$ b/ h4 I" B" j) _- n  C
复制代码
; q. r0 D/ ?; C7 v1 B( C
将 TIM4 中断设定在 1ms 中断一次:# N% R0 ^8 T  `' [( f, ?6 ]
  1. #define TIM4_PERIOD       124" h5 {. H5 _8 O! U# m
复制代码
  1. static void TIM4_Config(void)) D/ t6 N: W8 h! F( J
  2. {
    , q; _$ c+ @# s+ q: k; O1 G
  3.   /* Time base configuration */8 s1 ]+ s8 A: J1 o/ G
  4.   TIM4_TimeBaseInit(TIM4_PRESCALER_128, TIM4_PERIOD);
    ! @7 G) l/ c+ s) U/ t3 m
  5.   /* Clear TIM4 update flag */2 E) N8 {7 B$ J/ p9 l- h) H4 g
  6.   TIM4_ClearFlag(TIM4_FLAG_UPDATE);4 ]7 i0 j/ p$ ~  {# p3 N
  7.   /* Enable update interrupt */
    6 l% x8 s: k0 h5 z
  8.   TIM4_ITConfig(TIM4_IT_UPDATE, ENABLE);3 `% e6 C8 d1 T5 o* a" S/ X# o
  9.   5 M% b- m5 W  F- S. c7 E" |8 b
  10.   /* enable interrupts */3 p% Q' t6 j2 f& o
  11.   enableInterrupts();
    * ~. m7 Y) w5 C: ?
  12. ! u6 k1 B1 @: T
  13.   /* Enable TIM4 */4 e/ ]" L, g' B4 j# K% A, i7 I& H+ q
  14.   TIM4_Cmd(ENABLE);3 `, T7 C* t0 q7 F" J0 G/ [" R% W5 x
  15. }
    2 ^& V+ D) V0 S2 w- j% M
复制代码
+ W$ f. P5 l" a# Q* w$ P/ o4 F
16Mhz / 128 = 125Khz
$ C1 j& e: ^9 A& F! \& x1 p125Khz / 125 = 1Khz --> 1ms ; R. r0 p3 c& Z
) O, K  Q/ B# Z, I' z' f
TIM4 中断程序在 stm8s_it.c 这里: 8 h, q! L3 p' M/ D/ L
  1. INTERRUPT_HANDLER(TIM4_UPD_OVF_IRQHandler, 23)' L; W0 `+ {3 A# H; }$ ^4 J
  2. {* c$ m/ g1 Z# p- j4 O

  3. 9 P# V" |' u+ f, S) R9 O0 j, W
  4.   /* Clear Interrupt Pending bit */8 b& d1 `, ^7 R" y. S; v1 |; K
  5.   TIM4_ClearITPendingBit(TIM4_IT_UPDATE);
    2 r& d; d$ M- q8 `+ G
  6. }
    4 D% w1 A  {$ A/ x& j
复制代码

# e! R! Y  Y0 b  l前面的 LAB 有使用到按键输入的功能,对于按键输入的判断我习惯上都会搭配时基计数器的方式,在这一个程序当中我用这种方式再来实现一个按按键让 LED 翻转显示的功能。" ]; O1 Q2 P% A' I4 d3 T' |
4 H. H" F- b) P8 ?! L  {
P01.JPG
. z. _8 U+ r8 t2 U# _# j& R) W7 A/ d! M8 q* t# A
uint8_t key_cnt;3 q! e. X2 Y  k4 m$ F

/ B+ d. h* Z1 s, E. q6 b0 v, R7 F宣告一个全局变量 key_cnt 做为按键 KEY 的状态计数,按键放开时 key_cnt 清除为 0,按键按下时每一个时基 key_cnt 就会加一,在主回圈判断 key_cnt 等于 20 时为按键初按下状态。LED1 固定以 0.5s 的周期闪烁,而按下按键 KEY 之后 LED2 翻转显示。) O$ _6 T0 j  J3 A8 ~

+ v7 p1 I, v4 v5 j) J! K9 R2 pmain 回圈:1 T! E8 ?9 h' U' f; w! D# I
  1. void main(void)
    ( x6 R+ H# I' w" G
  2. {2 V" p: C0 \0 X/ f
  3.   /* Clock configuration -----------------------------------------*/
    / S5 y* T# r  S$ ^6 o/ g
  4.   CLK_Config();  
    0 n' a$ r% b) \7 h$ ~
  5. : B3 }( k( _! ]( r$ N; m  g
  6.   /* TIM4 configuration -----------------------------------------*/
    6 {/ }# w5 [( z8 t) O, t
  7.   TIM4_Config();& v* @. t0 `3 A) l3 T1 K# ^
  8. % r$ |# S/ m) N$ F1 k3 F. t7 R8 y8 x4 f
  9.   GPIO_Init(LED1_GPIO_PORT, LED1_GPIO_PINS, GPIO_MODE_OUT_PP_LOW_FAST);
    0 D" a6 s9 s3 D2 w( o/ H
  10.   GPIO_Init(LED2_GPIO_PORT, LED2_GPIO_PINS, GPIO_MODE_OUT_PP_LOW_FAST);4 }  J$ k' D: v! C# M% r( o1 Q
  11.   GPIO_Init(KEY_GPIO_PORT, KEY_GPIO_PINS, GPIO_MODE_IN_PU_NO_IT);
    & r9 \# @& P: @7 o2 A. Z+ `# m+ r8 K
  12.   
    ) r, @$ C* b. W0 ?2 \7 R0 O7 {
  13.   while (1)
    * r5 a# o2 l/ G- e9 X
  14.   {+ T( I) P+ R, z4 S+ z( }% M
  15.     if(key_cnt == 20)
    0 S+ B1 I: q% c% v/ o
  16.     {  F& ?- v, Y5 l/ E. n5 s
  17.       key_cnt++;; N  e( k3 k( K* Y, [
  18.       GPIO_WriteReverse(LED2_GPIO_PORT, LED2_GPIO_PINS);) u3 u. I; Q# [6 p& a* ]
  19.     }8 U9 d. h' C9 c' K; V, e; W! H/ M% W" b
  20.   }
    % `4 {" X" _* v0 D( @8 Z
  21. }9 H6 _  W8 w3 l1 I4 a, T" N1 |- i
复制代码

6 y" H( D  w; i/ r" P& @( N! QTIM4 中断程序:. t6 G( K1 V7 m
  1. INTERRUPT_HANDLER(TIM4_UPD_OVF_IRQHandler, 23)
    4 B5 B6 b% a& l9 i  K; J
  2. {
    4 q' |( Y0 V2 ^/ U8 Z) q$ l
  3.   static uint16_t x = 0;7 q) f$ Y- e+ c  l/ M
  4.    
    " V$ A4 Z! o/ q% K: K; h# T
  5.   if(++x == 500)      // 0.5s, t* }% r; L9 e7 |6 j+ H' Y
  6.   {
    5 J, B+ p# p' I& F* T5 l& {+ J
  7.     x = 0;
    # I/ W! z+ H; g! y0 A1 _- |0 o
  8.     GPIO_WriteReverse(LED1_GPIO_PORT, LED1_GPIO_PINS);        // LED1 flash( f+ M7 \3 _9 [/ ~" g
  9.   }( e( n  T% V* @  f1 c
  10.    " F# o( O7 D& d. h" J+ X$ O  q' L
  11.   if(GPIO_ReadInputPin(KEY_GPIO_PORT, KEY_GPIO_PINS))
    ' f* J; l0 [3 m6 C% }, e# [5 {
  12.   {
    5 X% b, M) z* n& @& F
  13.     key_cnt = 0;
    ' L8 o6 D, e5 f# l" i6 L
  14.   }
    , }7 T: e7 x$ T7 ^" a+ P
  15.   else
    : }% T- {! {7 l; _5 v. `( g
  16.   {, {; ^  z) X. I0 q
  17.     if(key_cnt != 0xff)& x- S/ L: Y! }. Z0 }/ i
  18.       key_cnt++;: u/ n( y8 T7 X( G/ e$ f
  19.   }
    " l4 ?0 x* O4 b4 a, W( ^# A
  20. " P+ A# w* ~( N) S+ ^, T4 i
  21.   /* Clear Interrupt Pending bit */1 O1 a3 b; O  r% O  ?' l" L
  22.   TIM4_ClearITPendingBit(TIM4_IT_UPDATE);" N: g9 V4 ~  ~2 W
  23. }% R/ i$ l3 O# o. b2 s0 `5 g8 Q5 e
复制代码

& m2 E8 C, a3 x: \运行结果:) ^4 y+ Q" ?9 z; [7 ~. \3 t
20190130205830.gif
( T  W3 N/ J: e5 d8 j. g' v) o- X$ S" z
源代码:' E* I: I' S; F+ u+ y
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
. U: w) I4 |$ s学习了

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