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

STM32G431RBT6之Timer

[复制链接]
STMCU小助手 发布时间:2023-3-3 14:00
67686d0bb75a447bb00e445ecb8e8fbe.png / x& Q: }8 p% i6 @0 a/ T
: B7 `9 i4 _9 V, v
前面在讲LED模块的时候可以用HAL_DLAY()这个函数实现,但是当时间控制得多了,用这个函数就不方便了,因此我们用定时器来实现计时的功能& k) i$ k' h- i: V- T
9 g+ o; Z9 d* z9 v. U0 z
一、定时器原理3 Y6 y. z0 h% ]/ }
1.定时器资源有许多,但是常用的就有几个
7 P% g- n1 J( s- Y: y& }
* h! Z" X! J# K: }1 k0 @% k
c69a617131504c33b80daf12e93d36f8.png 0 x0 Y5 F' l& ]& a
$ A& v$ d0 M6 z: B* \
2.定时器只有内部计时功能,没有输出功能,因此不用配置GPIO引脚
) u( R+ Z: I# p6 W5 U& V. G2 O- I4 R( @! K2 Y% L% O! T7 K
3.Timer原理
. Y. Q9 T7 L( w$ N% r; g2 M- k+ W4 `  |+ |8 N% V
94013c8a198940ec97a91cc702f2cf3f.png ' ]. w2 B0 D, \. G

: N7 w' H, N- a% Y, _# K( Z
7bf14f2ea69842e8b25859d444b25f29.png ( P! t. N; B0 c/ G$ p  L, P

4 [5 a7 R/ G" ~8 C/ ?
4.CubeMX配置
3 {! R; T5 U& e- f: o6 p: Y# j6 P0 d  p* h2 \  Y9 [4 G
94c3f2e8755d4ec59a126c5713ae29a2.png % l, d- m* T8 j( x; _/ i* f! w
$ V1 |8 g) ~6 B' K
Prescaler:预分频;相当于第一次分频,降到80*10^3) C% [! T6 J5 V* f8 @- w/ P2 p
Counter Period:计数周期;相当于第二次分频,讲到1000& [# e& D* }0 H
通过这两次分频,就实现了最终的分频效果,每1毫秒中断一次频率就降下来了。这样0.1s就要中断100次,5s就中断5000次。7 w6 @5 B; P. F) U" W$ p( S4 P4 O
5.定时器的本质就是中断,因此要配置中断的优先级内容:5 A2 M, j% |3 A7 ^+ D) o

' f4 d' L. N" l" i3 ?
a3cc1d401d1a4744afc375875ed74682.png 3 h! k9 d6 j: W/ g5 C; o, L+ h' G

. B7 x/ f7 L: z: D1 v2 A. Y二、打开工程,添加必要代码# w5 ~& s/ J* k  l3 ^$ C* |9 |+ E4 ~
1.tim.c就是配置完CubeMX之后自动生成的文件
# p5 e2 {  b5 f" i) t1 s, `7 o0 E: p1 [' p& z
8ccd172def3c4575bd1d6b96baea18d3.png
0 Y. T: r- Y# x  J

/ O$ u' O8 V7 q6 \2 }- f5 I& G 2.添加必要的代码8 _% R0 i9 s5 ~2 W
$ C8 T. E1 g# Q7 N  A- X
167071c20bec46da92c5c2c673701b20.png " H/ A/ i+ n5 H) A7 G
% R" V8 o9 Q' b0 z! \' V7 g
此函数定义的位置:# T% e( l- }0 U; K- F/ X
4 [* w' Y4 Y0 l; b( ?
eba2e27012ad405eb29c579ee71f9e4e.png 8 \) ?( ^( Z! s) j, v, q# r+ y6 O( e
* n8 H1 `6 J! J5 p
发生定时器中断之后就会跳到回调函数,实际上该函数便是发生时钟中断后处理的函数(中断处理子程序):$ U3 E+ |' l/ j6 K8 E& m

3 t! J% U7 `% [9 D+ A
27c56a6f6c5e41a99bea95488c3516f2.png 0 E- N. n, G7 ^
/ o+ H  T7 I) t9 U% D& W9 N
/ a" J9 ^) s* Q6 \, k: L
3.子函数/ X2 O6 y% b7 n7 C- ?
  1. void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
    4 x9 p5 b3 {/ w) N( ~' H2 `
  2. {, O+ b& [8 x* t$ y
  3.   if(htim->Instance==TIM2)//是timer2,且过了1ms. A9 G( c" O9 e0 f. C! ?; v6 Z
  4.   {
    , [1 ^. N5 f: H( z9 `
  5.     if(led1_flag==1)//led1要用定时器了
    , J3 V2 D" H# v: d( H, O
  6.     {: {( Q# w6 }) K  R( T8 _# Y
  7.       led1_count++;$ j. f: M0 J, {& z% }& C
  8.     }" D& Z$ M; g, [) W4 X
  9.     if(led2_flag==1)//led2要用定时器了: J0 Z% `5 A3 ?& V
  10.     {
    : S7 |, D% V$ Z# L+ ]
  11.       led2_count++;
    ' K3 a* n" v; o, O$ U' m8 p, P
  12.     }
    2 |. Q9 s$ ~# \! u
  13.   }
    6 W" _5 w  a; K
  14. }, ~6 d( L: L6 G6 Y' O3 X
  15. void led_proc(void)//led1的控制函数
    * O% n8 k7 q1 V/ C
  16. {
    # d, q( l7 T$ G5 F2 L
  17.   if(led1_flag==1)
    3 J4 O. |1 ~1 b$ P% L) H
  18.   {
    & a) Q( R8 v" r  I" r, T& f
  19.     Control_LED(LED1,ON);# g: K' s& h' ~) L: R
  20.     if(led1_count>=5000)//计数5000,即亮了5s9 r# x/ w8 n) W# Z
  21.     {8 u- N: ]: ?+ n4 A( }
  22.       led1_flag = 0;
    - s: {9 F9 h; }' Z$ G* r, \# `6 i
  23.       led1_count = 0;
    % e  \7 l% R3 G# B) U
  24.       Control_LED(LED1,OFF);
    8 ^0 E2 d/ N3 X" X3 s' Y8 a
  25.     }) g: r$ c5 F" q% [# [* P4 w
  26.   }- G+ T  G% f5 M7 B# ]" i

  27. ' F0 {9 D1 o$ a2 f* J
  28. }
    $ t! b( {! Q8 ?- s$ Z; r3 d
  29. void bulingbuling(void)//led2的闪烁函数
    5 f# o1 @. r/ N9 c
  30. {1 F  h% V, `9 `6 H' U
  31.   if(led2_flag==1)% \. A2 N5 T/ g6 o* {7 [
  32.   {( C' Y3 t" Q! S( j4 v
  33.     if(led2_count>=100)//0.1s' Q! _/ h1 Z( h9 F* C" `* K- E
  34.     {1 G0 {! ?0 D  d2 I; X% u  F
  35.       led2_count = 0;
    + t5 m- W$ |, h! `) K7 h5 w0 T
  36.       HAL_GPIO_TogglePin(GPIOC,LED2);//翻转
    - G. H( p3 @8 E
  37.       HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_SET);4 B; u4 U: e2 ?: h- X  j7 d1 L
  38.                         HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_RESET);
    7 S+ e: e2 N' {
  39.     }
    $ }$ u- M# l4 R: a( n* @
  40.   }: \' u/ z  {) C- |+ Y8 Y3 u+ w
  41.   else" e7 ^# h5 L; \& w7 C  v4 B' v/ b% a
  42.   {
    : G; \# V4 u3 N; L/ C
  43.     Control_LED(LED2,OFF);7 z% E: l% M" l% H! k7 K
  44.   }- w! w6 m2 \% Z  z% x) x; m
  45. }1 l$ c" d; M) Z9 n0 f/ K4 A1 F
  46. void key_proc(void); ~& D, o* b" F
  47. {, }2 A' q9 ^$ M
  48.   char value = Key_Scan();
    : ~0 Z, c4 V" ]1 x% o* ~
  49.   switch(value); J  Y" Q: k& G1 Z6 M4 ]$ g
  50.   {
    + N/ q& Y+ T' \( n
  51.     case 3:
    ; `4 O0 p& j( x
  52.       led1_flag = (led1_flag+1)%2;( p, n" D# x: R
  53.       break;+ P+ u; C+ L# l: c' `' w3 C
  54.     case 4:, ?5 `9 w+ ]% ]- ^$ q* e! A
  55.       led2_flag = (led2_flag+1)%2;
    ; z9 V+ V' ?4 ]$ C! x+ d' k: U
  56.       break;& _& L7 C. ?) F. R
  57.   }
    1 {0 O0 K/ D  z9 E; ~* o: E/ d
  58. }
复制代码

1 [& S( f% u. \, }( O4.主函数2 u0 l1 O( R* h: z$ a! k* R

3 q0 m! |4 q/ O/ |9 E  L& h. W/ P9 H  a3 `
cca7fb2268a04c419e595d5dfc396b06.png
* G& {3 U: f; O) k: K
& Q& o( s5 `5 B0 m$ O' t) e) V

5 `- V9 k: D% ?' E 变量声明:- A& B% k# K" T3 N% i8 G
  r9 o! F' g6 D2 Z* M9 Z
10b289372ccb4564b4db5424fe8785ad.png " w  L6 X8 k: m9 ^6 G9 q/ |
: K2 j' U/ w5 N( u
警告:一开始led1_count函数类型是char类型的,在后面计数判断的时候出现了警告。并且LED1灯不能通过按键控制亮灭。& Q! T: K+ l. z" k; o0 ^/ O
# A2 d: S8 o: |' ], N; [! n9 V
三、实现功能4 P; \8 @# V$ s) |1 j

2 A2 W& V; h7 V, O3 D 1.png 8 `: l7 `4 ^% h* Z! w( w
  H) J; {2 d( H/ G, W" `
————————————————
7 o8 b1 l% O) Z6 ]版权声明:想要优秀点儿
* V1 S1 O9 ~" n* a! z. _$ i' T
  o0 q( c6 o. p: h# M$ Q% G: ?" `
收藏 评论0 发布时间:2023-3-3 14:00

举报

0个回答

所属标签

相似分享

官网相关资源

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