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

STM32G431RBT6之Timer

[复制链接]
STMCU小助手 发布时间:2023-3-3 14:00
67686d0bb75a447bb00e445ecb8e8fbe.png
) V( R: }8 c4 F8 i& ]" F* ?  E
' z; E$ g) v1 X/ c8 i" R, v$ ^; R5 _
前面在讲LED模块的时候可以用HAL_DLAY()这个函数实现,但是当时间控制得多了,用这个函数就不方便了,因此我们用定时器来实现计时的功能& Q1 v: w4 @# Q+ p3 a$ ?4 Q

5 {- |/ J( Y6 W$ ]* [* [% l1 _一、定时器原理0 L) Q% A$ c5 I; [
1.定时器资源有许多,但是常用的就有几个8 k3 X; W. Y  [) ~  I7 Z
0 \8 t; h: L% L
c69a617131504c33b80daf12e93d36f8.png 8 M1 p& b! p. W5 J  |2 Y- ]$ I
+ u% {5 R0 b( A$ Q+ l
2.定时器只有内部计时功能,没有输出功能,因此不用配置GPIO引脚* x+ `8 S! s# }
, j) ~4 [- `  L& i3 o& h
3.Timer原理8 S) L& w% S9 T7 Q& V( }2 Z& E
& A: b1 q9 W4 q% g
94013c8a198940ec97a91cc702f2cf3f.png
2 ]) I* T' C; T1 z4 y( a6 s3 N
7 {+ _5 u  ]' a9 F! u: M9 `
7bf14f2ea69842e8b25859d444b25f29.png 3 B. O7 [, W1 b- |; i# w% W* s7 W3 D

; e+ ?5 L* o# \- S: V4 F
4.CubeMX配置
" G% t# }5 V& s4 i# ~- H2 h( \; s
1 d# p0 g! G- \' ~& j! i$ S
94c3f2e8755d4ec59a126c5713ae29a2.png # {9 ], F2 m- G  |& J

0 ?6 O8 `( W' `5 G Prescaler:预分频;相当于第一次分频,降到80*10^3
# {' `) j$ L5 z3 ICounter Period:计数周期;相当于第二次分频,讲到1000+ m7 s# O9 u, V5 i; |+ z$ ~3 I
通过这两次分频,就实现了最终的分频效果,每1毫秒中断一次频率就降下来了。这样0.1s就要中断100次,5s就中断5000次。
' S* j  W8 c1 M; B) Y0 |  g  G
5.定时器的本质就是中断,因此要配置中断的优先级内容:3 W( e& D) D- x+ o- Z

% v9 Q+ @% X$ G8 @/ J
a3cc1d401d1a4744afc375875ed74682.png
2 v2 M* v. `1 h5 g
2 |6 o+ z) v- y" ^* p; e二、打开工程,添加必要代码+ a% k- W( y' R# r6 b% c
1.tim.c就是配置完CubeMX之后自动生成的文件( w6 i& J6 }8 _  F

0 u! r& u* ^/ ]1 B9 q( V" S
8ccd172def3c4575bd1d6b96baea18d3.png - B* n0 W- f- U2 c. k% t
1 g: A0 b. g( d. @" o
2.添加必要的代码, M9 W9 ?% S3 I, p8 G- x: N
/ n1 t) Q! u4 R% R3 l* z$ F- m
167071c20bec46da92c5c2c673701b20.png
4 t/ X/ A8 E% Q, F- d/ ^: H4 w  g* ^' V8 e; J, M  L& g" s/ K: f
此函数定义的位置:) f) k) c9 R( d$ S; y  v# q
: x/ v3 O3 a3 C
eba2e27012ad405eb29c579ee71f9e4e.png
% e( r* x1 @3 Y# D7 f! m' F
; K3 R' B; D7 `1 q& q 发生定时器中断之后就会跳到回调函数,实际上该函数便是发生时钟中断后处理的函数(中断处理子程序):# ~4 R$ P# U8 Z4 v2 x' e, C$ z& n
; }! J6 I1 G4 x+ M. ~7 ?
27c56a6f6c5e41a99bea95488c3516f2.png
7 p: u2 Y3 ~2 U7 K+ i) O2 G6 \6 S, Q

5 s. j- K* n& a( B+ C: M 3.子函数
- @/ X8 c  ]" b* U/ F
  1. void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim); ?0 D7 l  ^2 c
  2. {
    0 e9 X6 {( M! }4 {, A
  3.   if(htim->Instance==TIM2)//是timer2,且过了1ms
    0 M5 o+ M' z3 p! W- {/ z: O2 w
  4.   {  H1 M; S! E6 j2 \8 }3 d: s
  5.     if(led1_flag==1)//led1要用定时器了2 R# Y% n5 Y  a( ^. c
  6.     {
    * e/ D( p3 \! y* W3 V- f) Z
  7.       led1_count++;
    9 I; |" [# W. L: S
  8.     }2 A# j# Y6 l  Y: v, _/ b' t! ]
  9.     if(led2_flag==1)//led2要用定时器了
    8 {/ e! j  N6 Y
  10.     {& n5 o7 u* b$ L: |5 w6 b- _
  11.       led2_count++;
    * ^! f2 \% v+ Z2 _' T# ?
  12.     }9 u5 z7 S( Y4 s$ z% ?: _% d; v7 o
  13.   }, d& t1 o: V, N. C& q; ~
  14. }
    6 [2 ?8 S2 u# f) r
  15. void led_proc(void)//led1的控制函数
    ! x: H  L, t0 ^/ k1 W& N0 f
  16. {
    / X8 q9 ?' J. Q" x4 w
  17.   if(led1_flag==1)
    7 q/ Z3 p' S. V+ P" O
  18.   {
    9 ?! I% |4 K$ k3 @" l! I9 F
  19.     Control_LED(LED1,ON);
    ! r( m! C/ K5 B: z) p" T. I, f
  20.     if(led1_count>=5000)//计数5000,即亮了5s
    ) S8 ~5 F- O9 e  r6 V8 w
  21.     {
    " w) D# u- \; t
  22.       led1_flag = 0;
    % \) l: B4 d/ Z" t! Z
  23.       led1_count = 0;
    - ~9 U$ k' B6 L' F- Q/ I
  24.       Control_LED(LED1,OFF);
    & X4 s* X# c) w2 U9 n- X
  25.     }1 {0 I" D, |# u$ S
  26.   }
    4 k0 m- q# _& c* f5 j" E( t

  27. # n- s8 X9 |' k1 ]  w
  28. }) ~; N4 K& p: f' ]
  29. void bulingbuling(void)//led2的闪烁函数+ k7 n! _$ j- i
  30. {$ g# w7 B' Y6 i* s8 u7 Z" P
  31.   if(led2_flag==1)
    ( l" _/ v4 m2 c1 F3 V
  32.   {0 p2 A$ z  v9 D. H4 q* Y
  33.     if(led2_count>=100)//0.1s
    % p/ ^, H7 e# @$ l1 q
  34.     {
    7 ^- d  [. p0 E0 B& f3 w
  35.       led2_count = 0;4 u8 {- K! U1 Y
  36.       HAL_GPIO_TogglePin(GPIOC,LED2);//翻转9 [0 [' B: M5 Z0 U4 _  O4 N
  37.       HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_SET);
    * h  L7 H! @! ]6 H; {! k
  38.                         HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_RESET);
    ; u, m/ y6 b: p) @
  39.     }
    ; a" P5 d( c) x) a* J+ z- Q
  40.   }
    6 u; J+ o1 ~9 U9 i+ {& P
  41.   else' Y& n; p  @+ O7 T8 c
  42.   {7 }4 [+ h+ H( \5 e1 d
  43.     Control_LED(LED2,OFF);
    6 P+ o* S  [: b9 Y- x
  44.   }% R0 D1 |2 ?; ?; F+ J
  45. }
    6 Z3 g2 f: L0 ~( I( _: D
  46. void key_proc(void)) x6 ]# [; U5 x) b; P
  47. {
    * y  s9 V  R" ]7 R" H8 c
  48.   char value = Key_Scan();
    - R/ [6 H2 F( `
  49.   switch(value)
    2 a6 {7 i) U( |! m
  50.   {  [+ S( S! f" y9 D" ^. G% m
  51.     case 3:  q4 i6 l: [+ B1 @; U/ b. v& ?1 k
  52.       led1_flag = (led1_flag+1)%2;5 D$ L6 s$ D  t4 h
  53.       break;  X* M, z, _* N$ o( M
  54.     case 4:2 ^, T, h6 J1 n, s: |5 R5 e% l
  55.       led2_flag = (led2_flag+1)%2;
    ! }, }" F* `, z! b4 H9 K' G
  56.       break;
    " F0 a  A2 |+ j4 Y2 d
  57.   }4 j4 l4 z5 U" \1 u
  58. }
复制代码
% h7 U* [% w0 p
4.主函数& ~( A; b9 |! J: M4 s2 }

. q# U% w! u1 c& T" @% g
cca7fb2268a04c419e595d5dfc396b06.png   G3 Y9 B+ x( h
5 E+ B! ^8 w8 D% H6 k

0 Y1 J5 T% t1 G 变量声明:2 [/ ^$ A/ `; B& O4 I/ ~% I' A" k1 o1 o

5 b, H: J; C  D8 `
10b289372ccb4564b4db5424fe8785ad.png
6 p3 B3 K. [" g% |+ C2 Q/ u; x
: f  ~7 H, [) R8 L8 V  q4 g. r警告:一开始led1_count函数类型是char类型的,在后面计数判断的时候出现了警告。并且LED1灯不能通过按键控制亮灭。
4 X  }' I6 y! ?& D' ]

5 W6 E2 i4 v3 v三、实现功能# J8 S$ h9 G' {/ j. @3 A2 Q

0 X7 L6 ^9 w* ^. A& @0 { 1.png
2 n; r4 y3 W4 V! n8 }/ f6 B% C0 c" f5 y4 c
————————————————
5 ?+ z' O( N# ^: {. j版权声明:想要优秀点儿
" n0 i. s; Z( F7 e! g
. u# x1 N* V' X  F$ A9 v/ T
: }  J* `# Z8 {& g: O0 C
赞 收藏 评论0 发布时间:2023-3-3 14:00

举报

0个回答

所属标签

相似技术帖

官网相关资源

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