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

【经验分享】STM32CubeIDE自平衡小车教程3.通过滴答定时器完成LED的定时闪烁

[复制链接]
STMCU小助手 发布时间:2022-3-14 22:38
以LED100HZ闪烁为任务,过程如下:
% F- j" {* A1 ]& _! N: ?$ E: y- ~' |  q
% r; x  x  [# g1 z5 _/ A1.第一步首先要对GPIO引脚和IOC文件进行设置,详细步骤可参考上一教程。1 Q. p$ d& [/ z' o
1 q7 z& ]2 r% f
   GPIO设置和LED点亮教程
' o( ^& |. J  z! W  M
) a( X$ W6 q$ _" A, G2.在工程下新建一个文件夹并命名。
# k0 F% g6 k! @/ Z. U' h& y+ u+ n: O9 U3 z' a8 q: x
18ITNI_VLW2`BNCLOL]AQVD.png
5 q3 z. n8 ]$ B/ T
0 L+ A! `; `! s3 A, y3 _ 4WH9N)W8P[Q]DQ8W]N9IBZP.png
2 S4 s0 ~: Y. @) z8 _0 Z/ S& ~2 p' o
3.在User文件夹下新建Inc和Src文件夹。* T: {) @0 o. ^- W. m" d
- v0 ?: b; x6 L2 f  W  `
C17%Q])W8FYK0MZ~{_)1V_W.png , C. n3 S2 I! M, x( M; U
# g' \+ l8 |+ d
4.在Src中新建.c文件,在Inc中新建.h文件。
: z' @0 i' m( r6 c/ y
4 A% p6 R  {+ R' w(注意新建的文件夹需要设置路径)5 l" F/ u3 s- N* I$ K5 G

, V$ H, Q' T: i; e. `( ?先设置路径:2 T3 a2 C8 G6 ~0 {1 Q2 H
, y" a' Z, r( B7 C# F& T8 e  p& j
QO@XZ_JY`54$P5FW$_O4SYI.png   [! |  X) v  R
+ b1 e, y# ~  C, `
R87`BO}X@X[`86BG(GE($XT.png
& o$ _; P4 L) g! t- n  E% |; G
/ }$ y8 h0 z3 q 5.在.c文件中加入以下代码:! k* W% T: ~/ p
4 ?, Y! K9 [2 e- n
  1. /*
    ( ^& T$ {. E, \) m
  2. * hal_systick.c  H+ r3 m$ T5 g2 G; c- a& P
  3. *
    0 t$ `$ [2 K; W' |* o; y) ]. G; F+ B- Y
  4. *  Created on: May 25, 2021
    8 Z! v" E3 G7 r) Y: ^3 c- w6 T" m
  5. *      Author: Administrator4 Y7 f- E) v! h. ~% g4 [
  6. */
    8 E  I' b' n/ t. T' N: i
  7. #include "main.h"+ P# ]0 y- N8 J: ~; j

  8.   B$ m; n$ n( }$ L7 ?+ p' H; l
  9. static volatile uint32_t UsTicks = 0;
    0 b5 p  ^) ]* J2 K
  10. - X; h. C  a7 `8 h* ?
  11. void GetUsTicks(void)
    9 g1 T5 ]2 F( P0 s  A' T
  12. {
    2 w" m  v! E1 |. @+ E
  13.         UsTicks = HAL_RCC_GetSysClockFreq()/1000000;" H- I* V1 i; m
  14. }! w$ k/ ^" l- s& v$ H7 J* X$ a( R

  15. 8 h% g  b. t0 {$ E5 d
  16. void HAL_Systick_Init(void)  A2 g1 M$ E* T
  17. {% @% \4 s" D) \/ \
  18.         GetUsTicks();! i" _6 K: O7 C0 t7 a. p$ P; j
  19. }' V. `* H) ~" ?3 b% C# x

  20. 1 R6 n# Y$ I, e) \
  21. uint32_t HAL_Systick_Millis(void)
    - w0 r) r/ M. Q" d" H# c$ D
  22. {; m9 {+ _: R1 e% Y$ e
  23.         return HAL_GetTick();  R5 Y8 O5 f' }* i' l
  24. }' q$ [( `/ h$ L
  25. ( S( c8 G- g* J" f0 S# E" {# q
  26. uint32_t HAL_Systick_Micros(void)
    $ P0 z$ A9 Z2 [' w% i
  27. {
    ! Y0 O. [: t2 d( v9 @8 c0 k- ]
  28.         register uint32_t ms,SystickCycle;
    & [, `  b. L$ C3 n
  29.         do
    7 B8 s& _, s9 j$ e! u; ]/ z
  30.         {
    ( C# i( z2 k* @5 G+ {
  31.                 ms = HAL_GetTick();
    - F% B3 z! Z! ?9 G( i3 X1 e
  32.                 SystickCycle = SysTick->VAL;
    # Y7 K) g( r7 ~! q9 ~0 B
  33.         }while(ms != HAL_GetTick());, r4 l0 u6 W  }' U# E' o
  34.         return (ms * 1000) + (UsTicks * 1000 - SystickCycle) / UsTicks;  s+ y6 {/ ^4 P
  35. }
    : e- H8 w! |; `0 M- z$ [1 _
  36. * K9 ?9 y  h$ H: e( T& f) Q- s
  37. void HAL_Systick_DelayUs(uint32_t us)4 f, K& i2 W$ i8 V: A
  38. {8 {/ ~% O: w5 e* U: C1 \
  39.         uint32_t now = HAL_Systick_Micros();
    0 p+ d( X; }! U4 l9 V6 g; O. V! ]
  40.         while(HAL_Systick_Micros() - now < us);, ?+ B8 E) f# a2 S. z1 n8 O1 i
  41. }7 Y& Y( d  y& V) n1 H! S

  42. 2 L  `: f. G/ `: b
  43. void HAL_Systick_DelayMs(uint32_t ms)( j* F. \' l% c5 \& B9 t
  44. {
    - M. ]# h4 Z" v4 p$ F% O! ]+ y
  45.         while(ms--)
    6 O" v  m( q3 G) x' y+ K
  46.                 HAL_Systick_DelayUs(1000);
    / B. m- M4 K) c8 I: _" h& C3 D" @
  47. }
    ; C6 x, y: K  a* K/ B$ W/ R& g
复制代码
. x7 Q) p+ j  Q# O
6.在.h文件中加入以下代码。
8 g: a9 I3 s0 A( V" J4 u! d: P5 }8 U8 N$ M
  1. /*% g) `! ]% o) K% ^% u1 v/ A! P
  2. * hal_systick.h2 \3 E4 |; a- a/ \1 H. [+ g+ I
  3. *2 ?0 _# A  `! K. Z1 D/ |3 n9 s. o
  4. *  Created on: May 25, 20216 C# B- p: }- g* B$ `
  5. *      Author: Administrator
    5 U0 M" U0 o! G) D/ t  q
  6. */
    3 M& X/ i5 k& Y: ]$ Z  W# C: d8 Q, K& Z2 N; I
  7. 1 N. T+ ?$ ]" h- Z' _/ W& P
  8. #ifndef INC_HAL_SYSTICK_H_/ s( @! ]6 f5 n+ N, K3 [4 r
  9. #define INC_HAL_SYSTICK_H_
    6 s  l0 r/ R! b$ _
  10. . z3 i5 w* W) p- ^& V! G
  11. void GetUsTicks(void);
    # c( Y$ N$ c; r( f2 c
  12. void HAL_Systick_Init(void);
    0 f& Q1 M; Y, e- l, d
  13. uint32_t HAL_Systick_Millis(void);9 x- R$ [/ _9 Z2 f
  14. uint32_t HAL_Systick_Micros(void);
    2 C& `! L6 p2 i6 [) X& a0 e- A
  15. void HAL_Systick_DelayUs(uint32_t us);% u* {8 M4 v2 B; D) V, N' g
  16. void HAL_Systick_DelayMs(uint32_t ms);% u9 t% O# R& n8 Z6 W8 j9 R( R8 f
  17. 5 ?7 c, L1 a$ H; M
  18. #endif /* INC_HAL_SYSTICK_H_ */
复制代码
, K3 Y6 z$ T# `- H# j9 a8 S( z8 s
7.在mian.c文件的/* USER CODE BEGIN Init */和/* USER CODE END Init */中加入以下代码:
% M, \# Y2 t6 @* e. F6 `. \0 X; I# X) r8 q+ J/ W+ ^2 J
W2AAC[74P}SM(K_W7_~J.png 7 h7 S; W/ C7 m! l* ]) g
# j! S% i6 I6 ?5 E! _; f* N( j
  1.   uint32_t Timer1ms=0;' U5 M; c; T. F& o+ A6 {; T) M
  2.   uint32_t Timer_1_100Hz=0;5 Y* H+ J2 ~0 E7 h  Q5 C& C- z9 Z
  3.   Timer1ms=HAL_Systick_Micros();
复制代码
% P/ N, o* O& J; _/ }9 y
8.在main.c的while函数中加入以下代码:1 E$ I# _' U4 }# E$ {& d
/ F  S4 ?% @. e3 D0 o$ X
~FS23GZJZSBW8~R$XF[4JOB.png $ Z( j- t# m- p& u8 E4 j4 {9 g
  W1 \/ z  j* {' a
  1.           if(HAL_Systick_Micros() - Timer1ms >=1000)//微秒
    / y# ^$ h* Z  n9 Q2 s
  2.           {& L% G# ?6 `: b3 ?
  3.                   Timer1ms=HAL_Systick_Micros();4 V# }! V! v' f# @
  4.                   Timer_1_100Hz++;8 q4 y' z* |. |; ^# O) r( s
  5.           }
    8 e  \4 K* @: \1 w7 P% r% L" I
  6.           if(Timer_1_100Hz>=100)
    4 y' m- `2 j% d9 _8 ?' a
  7.           {1 u( j0 ^/ {# S1 t
  8.                   Timer_1_100Hz=0;
    % w) [( l: J2 @- m+ q! A3 J
  9.                   HAL_GPIO_TogglePin(LE_GPIO_Port, LED_Pin);
    ! {' T4 Y1 Y0 K/ f* {% X6 g
  10.           }
复制代码
8 ^8 b2 k) e+ Y& d- ]
9.点击编译,不报错再进行烧录,实现LED100HZ闪烁任务。
! q! R7 G# _$ ^5 h$ F) U: i: k$ u6 W
/ I' X* p$ x3 V" @) r- g
赞 收藏 评论0 发布时间:2022-3-14 22:38

举报

0个回答

所属标签

相似技术帖

官网相关资源

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