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

STM32G431RBT6之Timer

[复制链接]
STMCU小助手 发布时间:2023-3-3 14:00
67686d0bb75a447bb00e445ecb8e8fbe.png 0 L3 d* L+ w% H' S* Q: d
/ Q- ?& I. L5 D/ S7 U+ ?# g
前面在讲LED模块的时候可以用HAL_DLAY()这个函数实现,但是当时间控制得多了,用这个函数就不方便了,因此我们用定时器来实现计时的功能  g4 J8 b" s& e& d
* C/ Y) d# ?- O( H! z4 \
一、定时器原理9 Q) Z- C0 M; N4 c; c$ l
1.定时器资源有许多,但是常用的就有几个
  c6 y. N( L, _) S$ i4 l5 @6 u/ Y" b& F/ i2 X7 _  W* d
c69a617131504c33b80daf12e93d36f8.png 2 G2 O) _( G% ?* n$ v" F# J" t

% k. Q% `) n* M  h4 _+ u' v4 j. S" K8 T 2.定时器只有内部计时功能,没有输出功能,因此不用配置GPIO引脚& a9 V) A9 d5 |. p$ M5 s
4 c# M. E3 ?3 S
3.Timer原理: u) @5 O) J2 q! @5 m% X; D% q" M

5 W  \7 b. t/ ^8 P0 E
94013c8a198940ec97a91cc702f2cf3f.png
9 R1 `+ ]: A8 E3 C! L: s' H% a+ q: y; a* I$ q
7bf14f2ea69842e8b25859d444b25f29.png
* L3 M" r3 d: C/ e, n  s, \8 f1 P9 ^& c
4.CubeMX配置! [/ H9 F2 z6 `9 a: j# a
$ A; w& H5 w- |5 Q$ B
94c3f2e8755d4ec59a126c5713ae29a2.png 3 N/ ]$ I* z; M2 ^- T: E: Q+ `

" O1 Z+ m  |% G! K% \# L7 P! q Prescaler:预分频;相当于第一次分频,降到80*10^3+ L6 D) F& a3 L, i0 {% g3 d0 u5 F
Counter Period:计数周期;相当于第二次分频,讲到1000
4 Q4 d% J' }" c' J9 T通过这两次分频,就实现了最终的分频效果,每1毫秒中断一次频率就降下来了。这样0.1s就要中断100次,5s就中断5000次。. Y) ]- v% g; v  x) I. H
5.定时器的本质就是中断,因此要配置中断的优先级内容:1 T( a1 z% y5 v2 ^# _

( A2 S* I  X  M% {4 d7 v
a3cc1d401d1a4744afc375875ed74682.png
/ F1 l- r" _5 W! Q$ e6 O
0 }( C  `. M" x1 u' m二、打开工程,添加必要代码  ?8 r' F  [' y! d0 @9 `# b. P$ O( ^
1.tim.c就是配置完CubeMX之后自动生成的文件
+ ?0 g  J; B1 `! m, @5 B( k: o# R( v( v6 u: K6 t
8ccd172def3c4575bd1d6b96baea18d3.png 7 X0 c7 r2 E# X% {* Q
9 A+ o0 R; z. D9 ]/ L8 m
2.添加必要的代码
0 \/ J' ^1 [4 B6 u- f8 d0 `3 [
167071c20bec46da92c5c2c673701b20.png
2 k  E. l. R% v' Z0 C2 V, g
$ g% Y; {9 c4 a* J8 m  i8 E0 b 此函数定义的位置:- A( [& c3 ]& u* ]- p' B- [# E
* P4 w1 D# C1 |0 D) k: A
eba2e27012ad405eb29c579ee71f9e4e.png 9 x( \5 C0 R$ n5 m' f$ C
) L$ h6 J8 L0 r2 `1 b: X
发生定时器中断之后就会跳到回调函数,实际上该函数便是发生时钟中断后处理的函数(中断处理子程序):+ ^  ]3 t& U, u* ^( g  o
# O3 s1 y6 A8 b
27c56a6f6c5e41a99bea95488c3516f2.png ; d# Y# I' B2 m. a2 |. R% j
0 X0 {* l; }% Q7 B

3 x) {+ D. L, y7 }& x, L 3.子函数
0 O# b% D0 M# S2 W) u
  1. void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
    : H) n  l7 B* ?5 n' F  n7 ?2 W
  2. {
    4 u) ^4 B" B" g2 e
  3.   if(htim->Instance==TIM2)//是timer2,且过了1ms
    8 e) v; |, q" a3 B% k4 n; A
  4.   {  |2 Q8 t3 y; G" S
  5.     if(led1_flag==1)//led1要用定时器了* U& _4 A7 B: C2 }) |8 q
  6.     {
    4 R" B7 Q1 Q+ I4 B: t
  7.       led1_count++;
    & L& e7 _5 g! c; ~! z6 ^# Y
  8.     }4 o; g# ?- Y. b7 y6 h
  9.     if(led2_flag==1)//led2要用定时器了( m" ?- i9 |8 T) ?  Q" }" j4 a
  10.     {3 M" o) `8 _5 X3 A
  11.       led2_count++;2 n& R# \  C1 d" |5 b
  12.     }% D$ L% D6 ~- ~' A/ M+ C
  13.   }
    " m+ P: c8 N$ E$ R1 }5 l1 M
  14. }& k5 r$ a( I6 p& M. N( h& F
  15. void led_proc(void)//led1的控制函数
    9 C+ W7 q% _: m' G& D
  16. {7 B: G8 I! O, M6 q# d% z" {
  17.   if(led1_flag==1)+ R2 O+ {* Y  L6 h$ ~
  18.   {
    0 G# u% x8 R& b0 X+ o
  19.     Control_LED(LED1,ON);
    4 N) Y4 G) A( B6 f  Y9 ~
  20.     if(led1_count>=5000)//计数5000,即亮了5s
    2 n8 a! k& \2 G5 a( G8 L
  21.     {$ G/ G6 z( l& k3 y
  22.       led1_flag = 0;: d( Y$ d: m0 O" L2 k
  23.       led1_count = 0;
      D4 n2 @" I6 r: ?: P% h) V( E
  24.       Control_LED(LED1,OFF);" s+ s( j: f+ @
  25.     }( v; w5 f% V0 O; }$ E6 L( B+ g
  26.   }
    * K: H" y8 I' N  i0 s! v
  27. + S& b. E1 V# Z" D
  28. }
    1 a& D/ e4 C/ J+ |
  29. void bulingbuling(void)//led2的闪烁函数
    % ^) F5 @* x3 |* Y
  30. {
    5 m9 Q( M, I- ~. U
  31.   if(led2_flag==1)9 x- @( V% Z4 a& l
  32.   {
    ' a3 @# R% e7 R+ |2 n( B# H
  33.     if(led2_count>=100)//0.1s8 ^2 [0 g  y% I% O
  34.     {, ~  X, ?9 J, L' T
  35.       led2_count = 0;
    7 K; V+ b3 O4 O4 l1 S5 u0 [& g. u1 T
  36.       HAL_GPIO_TogglePin(GPIOC,LED2);//翻转
    9 |+ n2 N- J! u( Q7 e- j: b
  37.       HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_SET);
    # g7 }: S6 o! h4 _
  38.                         HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_RESET);- v4 S' S/ `7 y2 y2 O+ v
  39.     }
    ! o0 t$ U3 \- q! D/ Y
  40.   }
    7 g* M3 ?5 Z2 [4 y- h* \
  41.   else+ C+ Q: N% H/ J2 K
  42.   {& f3 q+ h. V. @8 v* R: R
  43.     Control_LED(LED2,OFF);0 i" q: H  @. x5 x
  44.   }/ U+ h  r6 d0 u
  45. }$ \- N. f, V" H5 t: `9 t, R
  46. void key_proc(void)
    ; T$ H" L0 o( C1 G& `1 r4 r/ H
  47. {
    " s: [1 X2 }" T; r0 r8 ]% @  e
  48.   char value = Key_Scan();' Q) D3 Y4 m( v) D
  49.   switch(value)  v3 V$ E4 o, g( |" `+ W
  50.   {# e6 R, B8 a" D
  51.     case 3:
    ( n: w  j* B) X
  52.       led1_flag = (led1_flag+1)%2;
    7 a$ J. T* y, O7 O
  53.       break;4 Z6 c5 ~! t# L  a! W2 h  d& d
  54.     case 4:* |: B4 q; W# l" ?! ^: y+ S! ~, |$ I
  55.       led2_flag = (led2_flag+1)%2;# z# V, X% u7 ?% F  j
  56.       break;
    1 I0 l$ ^! @) m5 j- H
  57.   }
    2 N4 N! R0 ~  Y
  58. }
复制代码
$ H' n4 ~, @% l9 B, y6 i, E- N
4.主函数1 K' k) A# [! R& n+ Q  Y/ l3 K" t

. b  j1 Y! U2 c8 f( p; C( _
cca7fb2268a04c419e595d5dfc396b06.png 5 j6 F3 |$ A; h5 v7 F" m

- t) @* e- Z  Z3 W5 E) ?

- \% k% M' T* w) z& \0 Y  Q0 _  L6 U* L 变量声明:' q4 }" l2 p1 ~0 F' @& `* q
2 `9 z6 K) F8 E. h2 d; h
10b289372ccb4564b4db5424fe8785ad.png 6 I' E8 o  u7 ?2 }: E9 y

' H5 u+ P$ u; g* @, t3 Q- x& `警告:一开始led1_count函数类型是char类型的,在后面计数判断的时候出现了警告。并且LED1灯不能通过按键控制亮灭。3 F, s2 P  g9 O6 S' k9 v% O
& @% [+ N% ~. f
三、实现功能
7 [4 [3 m; J* r4 c8 J9 n
! u" |: r, r! l1 m2 A 1.png
1 M$ G  Z2 A  ~* Y( P3 B( H* K" B4 B4 L
————————————————
4 G' r. J3 z" g6 n  a( G* _/ O版权声明:想要优秀点儿, _& A* |8 L2 Z. r, `" [0 m" \: t

6 N& D1 g* c/ K( P5 w& y+ W5 `. P5 i. `
收藏 评论0 发布时间:2023-3-3 14:00

举报

0个回答

所属标签

相似分享

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版