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

STM32G431RBT6之Timer

[复制链接]
STMCU小助手 发布时间:2023-3-3 14:00
67686d0bb75a447bb00e445ecb8e8fbe.png 3 o, F3 H, t5 @+ [7 G2 L! o# H
4 Y" `1 l  ?3 e! [
前面在讲LED模块的时候可以用HAL_DLAY()这个函数实现,但是当时间控制得多了,用这个函数就不方便了,因此我们用定时器来实现计时的功能6 H5 W1 H. e) ?: d( n3 k9 {

4 R7 h- \4 x& h6 z6 e  U一、定时器原理; d3 n2 V. N: `+ c, P7 D
1.定时器资源有许多,但是常用的就有几个  w8 h: y8 e: C4 S& P9 h
8 d# _+ Y- f2 d. b. a
c69a617131504c33b80daf12e93d36f8.png . W  g- p- ]8 L" t" A) _

  R+ @; W. _" G 2.定时器只有内部计时功能,没有输出功能,因此不用配置GPIO引脚
4 r  s) U  x& E( q; d0 L5 O7 i
7 u! @5 r7 i1 @3.Timer原理
  ~. v/ b/ ?$ K; A. t% C9 w6 D* f2 e
1 q) s) _" o7 v) L1 k/ @* ^
94013c8a198940ec97a91cc702f2cf3f.png ( ^: g0 S5 ?1 t5 u- I/ q
0 _8 b) a  }3 Y5 X+ h: n! ^8 ~
7bf14f2ea69842e8b25859d444b25f29.png 6 T  ?3 y7 J0 W& [* e, @( @, ^4 \) l

) Q, L( l  ?) B1 j; v4 C$ R
4.CubeMX配置' u( H* D- ]$ e* p2 X% d* O5 I

7 o. K+ {5 M3 a8 }! ~% Q
94c3f2e8755d4ec59a126c5713ae29a2.png % C/ y' t/ \' @1 Q: d: m

; q0 Q* @" j% o7 c6 {2 e- E: i2 d# F Prescaler:预分频;相当于第一次分频,降到80*10^3) t# q' r: I* x4 N' D( c
Counter Period:计数周期;相当于第二次分频,讲到1000
8 g3 D! E5 d. h4 g3 i$ ~4 ~通过这两次分频,就实现了最终的分频效果,每1毫秒中断一次频率就降下来了。这样0.1s就要中断100次,5s就中断5000次。2 O* t  F- R7 N7 _" _/ R/ Y4 E/ j
5.定时器的本质就是中断,因此要配置中断的优先级内容:
7 E. I% `/ y, E2 }, C  d* P* @9 O
' [7 `. J" X! C& S5 Q, D7 }8 L" t
a3cc1d401d1a4744afc375875ed74682.png
& a: y1 O" f5 B. l; j( W; J, l0 q9 R' U  g8 V. l* K
二、打开工程,添加必要代码0 J7 `# ^, H! J* z- `  `3 }
1.tim.c就是配置完CubeMX之后自动生成的文件6 m2 ?# W1 U4 d3 F1 H+ A

8 T& L, e2 M4 u$ r
8ccd172def3c4575bd1d6b96baea18d3.png
3 H/ f$ ]7 c# v+ B" P

" _! I+ i+ f8 @ 2.添加必要的代码
' s' ]" I/ [: `  C0 H2 s
/ m) H9 w8 b1 y
167071c20bec46da92c5c2c673701b20.png $ L6 l8 p9 ~8 e+ n
& g- O  X. h+ v' ~
此函数定义的位置:9 U4 x9 R6 N& I( R

2 G. V4 u0 G7 }1 u# r1 l0 M
eba2e27012ad405eb29c579ee71f9e4e.png
1 f) D2 D! `& H4 t
8 }( G  d( Q- C, M) |+ U# } 发生定时器中断之后就会跳到回调函数,实际上该函数便是发生时钟中断后处理的函数(中断处理子程序):
  ]3 Z1 J8 }: ^4 o8 U
3 |% b% M, ~) V: Z
27c56a6f6c5e41a99bea95488c3516f2.png
  y7 \$ A" Y# E/ S9 m  i
* T. D9 M$ G4 J# y4 W% _! Q
0 b- g* T# t$ D, d" O
3.子函数0 f$ `9 u. c# H2 V3 l
  1. void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)4 T" _) F) Z# x& R  ~
  2. {1 a/ H2 z1 y9 h& h
  3.   if(htim->Instance==TIM2)//是timer2,且过了1ms6 F. l! X2 V8 a- B  H. x! |
  4.   {& w; |8 I5 ]! y" G5 p/ N& N
  5.     if(led1_flag==1)//led1要用定时器了9 W; r: ]; a7 }+ E
  6.     {' T  l: i( K, j5 W0 Q, Y2 I
  7.       led1_count++;8 s* M/ T/ D2 N" x2 a
  8.     }
    4 a. _. I' }4 y  k3 N8 K
  9.     if(led2_flag==1)//led2要用定时器了
    3 T/ z8 V3 n! B+ k4 g9 e/ u7 |/ q
  10.     {1 U* g$ i: v: G$ {4 {: O* K
  11.       led2_count++;% j& |# S/ b) a( w+ H6 z; K, p# @
  12.     }
    , v7 N6 X" y) o8 F
  13.   }
    - M" S5 v9 j$ j3 Q+ i
  14. }3 T, P$ o; G1 O7 ^+ I5 t
  15. void led_proc(void)//led1的控制函数8 U8 @" L" s; i  k  q6 l8 r1 q  f% B/ L# ~
  16. {
      D* i$ W) {# W6 J4 ?8 S) q
  17.   if(led1_flag==1)5 ]8 O; _4 @' v' T/ t+ k: h6 H
  18.   {" c- s; H1 V5 g
  19.     Control_LED(LED1,ON);
    ( m6 o' O# q2 D" H3 H
  20.     if(led1_count>=5000)//计数5000,即亮了5s  P! _$ \) {% i7 N- |' f
  21.     {$ M+ n9 Q% P9 S; z3 g
  22.       led1_flag = 0;
    ; B5 k3 C, I/ r3 Z6 b# {0 l
  23.       led1_count = 0;
    2 z6 H' K$ D/ R  ~
  24.       Control_LED(LED1,OFF);2 w* b) `2 _9 D6 v: @
  25.     }( K9 l7 g2 ~, A% l
  26.   }
    9 b7 T" {8 G. L9 H+ S1 ?

  27. , ?4 g3 Q% s4 I1 F  p
  28. }
    / E- P1 j) O2 h
  29. void bulingbuling(void)//led2的闪烁函数
    8 G# Z9 N! R/ a+ C  L$ s
  30. {
    ) y7 Z, B- G1 }, W$ w% B8 A
  31.   if(led2_flag==1)& f5 s+ @" ?4 {$ P- r: y% a
  32.   {
    & A" r/ g5 H2 d$ v: C* Q8 a" X
  33.     if(led2_count>=100)//0.1s
    / A! z7 Q+ c6 J4 s
  34.     {1 w: n3 n9 Y) v; v# z5 V
  35.       led2_count = 0;0 T# ?3 z( R, T1 M
  36.       HAL_GPIO_TogglePin(GPIOC,LED2);//翻转
    * U& J* f9 F6 w$ ?2 g/ I# E5 U7 f7 e
  37.       HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_SET);/ ~1 t  O; W4 `1 a
  38.                         HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_RESET);* ?0 G  M: e, r  E
  39.     }3 h7 [4 R& E& {1 M
  40.   }
    5 v. z+ @1 m) g7 D
  41.   else( E& ]- F$ G8 r$ v
  42.   {- |, s4 v. i* E/ P
  43.     Control_LED(LED2,OFF);
    9 V4 E% W. K8 m) m; O6 h
  44.   }
    6 t. r" A. M% A* ?+ ?
  45. }
    ; n: l# m6 S' x% f' i  h# A
  46. void key_proc(void)
    & Z8 V! B9 h  Q
  47. {$ A' a+ g! _* D
  48.   char value = Key_Scan();" O+ t* x: s8 d+ O% B% H# Y
  49.   switch(value)
    # q5 `7 z  k  v' g$ k: D/ M
  50.   {
    ( I" Y, Q+ h; D! R1 M9 h4 {
  51.     case 3:
    + e* s- \: ~5 w! z2 x9 x8 f
  52.       led1_flag = (led1_flag+1)%2;4 H) T% C9 H" g
  53.       break;
    4 `9 [: f2 X* K6 \5 M" i  S5 U
  54.     case 4:! v, x$ M/ Q1 E
  55.       led2_flag = (led2_flag+1)%2;
    - Z8 O) q4 T5 x9 E0 Z9 U3 P
  56.       break;
    # H0 t! P1 S2 S( h5 i5 `
  57.   }, r, Y' b. `' U% i
  58. }
复制代码
1 V# K0 h5 Z) K+ f
4.主函数
' W4 V6 Y5 H8 n( ~" V/ I( i( \4 S. u  t. \8 X* w
cca7fb2268a04c419e595d5dfc396b06.png # G' @! i: v! e4 W4 E/ L
8 K- O5 b  g; f/ T4 Q; R

5 V/ T& o! U6 i# A2 _: p 变量声明:
/ ?8 W4 [* K/ u  h$ R2 K$ T3 P5 X( d% R. s+ I+ T
10b289372ccb4564b4db5424fe8785ad.png
0 m& i$ e/ V  _/ |( N; w' k+ f! Q) t4 X
警告:一开始led1_count函数类型是char类型的,在后面计数判断的时候出现了警告。并且LED1灯不能通过按键控制亮灭。
3 s" T9 N: Y4 [2 P2 v2 t$ a5 Q

2 b3 t; e7 g2 M1 a) i5 B三、实现功能
4 U3 H: J: N( }. h8 J% @7 p) I- u/ F6 z9 Z
1.png
; x, w6 t8 k$ H7 k2 i& p- t
$ h2 n  g; ]: @$ E# [————————————————( Y, s- @, d3 }. L
版权声明:想要优秀点儿) i/ K( z/ R3 C
! o. z6 J  d" |5 B1 ^
! [/ t7 @0 ^1 T
赞 收藏 评论0 发布时间:2023-3-3 14:00

举报

0个回答

所属标签

相似技术帖

官网相关资源

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