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

STM32G431RBT6之Timer

[复制链接]
STMCU小助手 发布时间:2023-3-3 14:00
67686d0bb75a447bb00e445ecb8e8fbe.png
9 V! ^( c+ p5 N% Z5 B& a

" \. B9 g  Z2 u8 ^5 P 前面在讲LED模块的时候可以用HAL_DLAY()这个函数实现,但是当时间控制得多了,用这个函数就不方便了,因此我们用定时器来实现计时的功能0 l1 g$ h. g5 b8 R8 Z& B

3 s2 Z$ j8 p2 g1 Z+ E一、定时器原理
, P* y; F7 K; r3 N1.定时器资源有许多,但是常用的就有几个
' v; w9 V! m  }- ?9 m+ e& O! a2 `: T) D" n' H6 Y7 y! ~
c69a617131504c33b80daf12e93d36f8.png 2 K0 k- A$ v- n9 p
$ [& E" Q  e; g8 c2 u
2.定时器只有内部计时功能,没有输出功能,因此不用配置GPIO引脚
$ t8 o% C3 S2 H! [6 Y& Q2 n
: ?' ~$ r9 J2 {( S4 c: {3.Timer原理+ F$ ~4 S* ?  e$ F* ]+ m) p( s

0 R% A8 k6 c. N3 ~
94013c8a198940ec97a91cc702f2cf3f.png , f6 E+ U5 R+ x+ ~% J6 N" N
4 G4 A7 R2 W) W. W
7bf14f2ea69842e8b25859d444b25f29.png
  x0 F7 ^1 N7 g+ u+ w/ X$ [+ c; M( K/ h% N7 w4 S- h3 t7 w
4.CubeMX配置
" T' L9 b6 Z2 L! @
% L# E: {0 X5 A2 P: C; d! q$ C& @
94c3f2e8755d4ec59a126c5713ae29a2.png $ D$ h3 ]( p# n! u  A* r
" H0 P1 Q" x0 q! `0 @! r6 K5 j# B
Prescaler:预分频;相当于第一次分频,降到80*10^3) B( l: o3 V2 H& U2 c
Counter Period:计数周期;相当于第二次分频,讲到1000
' s  u! R7 Q5 g* v+ Z通过这两次分频,就实现了最终的分频效果,每1毫秒中断一次频率就降下来了。这样0.1s就要中断100次,5s就中断5000次。/ m* n6 P+ @! r0 n. J; n( F$ T
5.定时器的本质就是中断,因此要配置中断的优先级内容:7 y$ T3 o7 e& ~/ M$ p: S

& S2 _1 x, V9 [9 P. A
a3cc1d401d1a4744afc375875ed74682.png
3 C! X& U; ~( [" f8 N* Z/ B0 b. x
二、打开工程,添加必要代码# b0 |& k$ l# c. W; T+ Q. w
1.tim.c就是配置完CubeMX之后自动生成的文件& L- E( i6 w. S* Y+ m
1 \: m2 ]1 o" x
8ccd172def3c4575bd1d6b96baea18d3.png 8 X* i; ]4 [2 p7 L9 t' I3 q) t- g8 k
/ ^7 z' m$ N' n. ~/ ]' N$ R
2.添加必要的代码
2 X- q% U! d) X: Y- Z" v+ Y, R3 P9 O; U  L. r. L8 d! W
167071c20bec46da92c5c2c673701b20.png
9 Q) l' M! i. t
% {* y4 M  ?4 p0 ^6 M4 ^9 ? 此函数定义的位置:
3 g. U. Z7 Z. b' c8 w( H7 A, m7 c9 B* M* x" P- n
eba2e27012ad405eb29c579ee71f9e4e.png + `; j% A2 F$ g; y5 b

( l( s! M) j* w' m3 _' v 发生定时器中断之后就会跳到回调函数,实际上该函数便是发生时钟中断后处理的函数(中断处理子程序):
9 C7 F( n& U* x! i* Y7 ]. E0 [" R" Y0 n" e: D
27c56a6f6c5e41a99bea95488c3516f2.png
1 {# F5 g6 ]7 O1 q$ k9 V
8 ~) X; G6 j, h

& ]4 ]7 M3 K$ g 3.子函数6 E4 A* @% I& }6 ]  }' V
  1. void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)% ]1 S1 s# q: o4 k" u
  2. {6 {; d% }& o  a$ r+ t3 H
  3.   if(htim->Instance==TIM2)//是timer2,且过了1ms
    5 g4 v; r0 d3 y* n1 w1 w7 {
  4.   {
    $ o$ T+ M! F8 G' [2 p% v
  5.     if(led1_flag==1)//led1要用定时器了
    ) \3 a2 z; ~+ f" d
  6.     {% v) Z6 k; W1 g; \
  7.       led1_count++;' S- W+ E/ @! q- C
  8.     }
    ; e) f! Z3 H7 a' Y: c/ c- ~
  9.     if(led2_flag==1)//led2要用定时器了
    7 I' `! _% w, M* c" @( w3 M( a
  10.     {
      U; D/ s8 F9 \! j$ W
  11.       led2_count++;
    6 f; q: \* U8 d# e& Y! P. F
  12.     }( @& Y1 k! S9 X1 @
  13.   }9 @4 {! z- W- ^1 b/ P+ [
  14. }3 _8 {) m% @& |# v9 v6 [6 U& U
  15. void led_proc(void)//led1的控制函数5 B8 ^9 _; M5 A$ n
  16. {. [2 c! s, C2 P& r, I1 }
  17.   if(led1_flag==1)
    ( L& {4 L- `1 v. i2 z
  18.   {
    : B4 f% A+ f# S2 z$ Y1 T2 c
  19.     Control_LED(LED1,ON);4 F$ D# O4 {4 i5 o7 P- [, m
  20.     if(led1_count>=5000)//计数5000,即亮了5s
    7 \/ O% Y5 k/ h: e( j7 o
  21.     {$ P4 x6 @. C/ m
  22.       led1_flag = 0;. ?* U% \) h8 K
  23.       led1_count = 0;
    : C+ v* X4 f/ v  U* C& h
  24.       Control_LED(LED1,OFF);3 _- b/ D+ M, m1 `1 g% b* }
  25.     }
    7 N. G; s& u$ z9 d
  26.   }
    6 F; Q7 x! {0 F7 z& P0 t

  27. 2 h' ]1 n" S5 N/ Y) f! i( {, t
  28. }5 \* x( F+ ~: K
  29. void bulingbuling(void)//led2的闪烁函数
    & A1 b2 n, D4 ?4 o, J6 ]1 p
  30. {
    2 L( H; L4 Z3 o5 {* p0 g9 r; B
  31.   if(led2_flag==1)
    / S& p0 p) u# P: \+ y6 b9 o
  32.   {
    8 `9 f  i3 m8 Z
  33.     if(led2_count>=100)//0.1s' o0 K7 X  x3 W+ i: k( }2 i
  34.     {/ q- {+ ~% o' v+ g3 G0 @- U: ]% T
  35.       led2_count = 0;4 k/ ^! M, y- J3 y, f- R% G
  36.       HAL_GPIO_TogglePin(GPIOC,LED2);//翻转
    3 H) C& h# _/ U  j7 i0 N' |
  37.       HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_SET);
    / B7 _+ c$ x7 i# s5 u( K
  38.                         HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_RESET);  r% c; n8 D8 |9 z1 P+ t
  39.     }
    $ @9 ~5 K3 s; b8 m
  40.   }. l1 k: }# j. a4 L
  41.   else
    2 i/ c# c/ T9 I+ |/ n1 M- }6 ~' t
  42.   {
    7 W! p. S& M0 k7 `( D! c
  43.     Control_LED(LED2,OFF);/ L3 U' a4 c2 `. s* C0 M+ _) e% @
  44.   }3 U1 n8 `+ p' ]7 y. ~
  45. }
    ( z& }% t: Q, `; N- T7 c+ A
  46. void key_proc(void)0 b! k4 z5 h7 G6 P
  47. {
    % _+ }; }# U1 m4 \- w; ^! v3 t
  48.   char value = Key_Scan();8 k0 Y1 @/ n  H
  49.   switch(value)
    . @- `! k5 p, J$ A" Q0 g
  50.   {
    " T) F% I0 [" k; ]$ r
  51.     case 3:
    + A* k1 k( _5 W: |, R4 Q& P) U
  52.       led1_flag = (led1_flag+1)%2;( P! v" B2 T8 V3 {
  53.       break;
    7 }2 u8 M6 w6 x5 c
  54.     case 4:% [! z# e( ~2 j1 C, J& E9 F1 |
  55.       led2_flag = (led2_flag+1)%2;
    4 E/ ?7 g, r/ Z, `6 p/ F: w. s
  56.       break;
    1 i1 @7 k" q' `9 I1 T
  57.   }
    ! T8 @# c# W4 X4 u6 g# e( |, k' F
  58. }
复制代码
, T/ ^  B, _  S- b3 c$ F- a2 m
4.主函数
' q: m7 z6 B  U; E& y. v6 f( g; b, w& o+ u' c
cca7fb2268a04c419e595d5dfc396b06.png
, C& X2 o$ {2 p$ ^' s( g
0 r0 s- [4 n/ I

7 B0 S, ~+ z8 r% V3 Q( v# d7 {* R 变量声明:
+ d1 S; Z7 _1 }& b. I
; Z) S' X$ }8 V& }9 v  R
10b289372ccb4564b4db5424fe8785ad.png ( u3 f5 T! w" \" B' V9 i2 H4 R  \

+ ^. l, P3 t4 y. @0 f4 Z! y( q警告:一开始led1_count函数类型是char类型的,在后面计数判断的时候出现了警告。并且LED1灯不能通过按键控制亮灭。9 \$ U2 u9 p$ |5 O( m! t* _

- j- N4 w8 j9 ?三、实现功能
  @' e( ]% H" a2 X! s& f* P, k5 l9 G6 k0 a" ^+ {
1.png
$ }# ?4 r1 |; r2 M: F# M
2 `  l( w( g& \+ i————————————————
0 s0 _) E6 G( f' ~7 o版权声明:想要优秀点儿# d; E" @; r- U! y  [6 y

. T0 l, P/ ?% a. K8 z
. `% x; G0 a8 \0 F& ^3 n
收藏 评论0 发布时间:2023-3-3 14:00

举报

0个回答

所属标签

相似技术帖

官网相关资源

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