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

【经验分享】STM32Cube HAL 定时器中断

[复制链接]
STMCU小助手 发布时间:2022-4-7 16:37
  实验内容:使用基本定时器,实现LED灯以1S间隔进行亮灭切换。9 e, E4 V( ^2 x3 C) \
6 x3 A, U1 R  w; Y+ v. s; D
一、原理图
2 P7 f* }# V5 M2 M9 U5 ^" u2 w
* ^: T- ~! X- o 2B[9WHRVIOP4IR5Y8CAY0Y2.png
; q! h  V. c8 r/ R4 ~" W8 A% a: |# Z& R6 U
二、 CubeMX配置
- n: F, Z# c3 t2 b& f$ ^( u' E) d4 E9 D  G4 L1 j
Step1.打开 STM32CubeMX,点击“New Project”,选择芯片型号,STM32F103VETx。
- b2 c, _" i% D) [$ v& O5 o. W
~WL%N[(2B5Y$[S[TH9}ZWCH.png ! k) N' B0 B- D

9 z7 A, m, |4 e. w Step2.选择时钟源,并配置时钟树。选择Crystal/Ceramic Resonator,并配置系统时钟为72M。/ x3 Z9 A% l8 M

3 t, D' ^( N' }( D7 `0 O  ?. ?
5 N. Z# c+ L6 K9 v: `8 R8 n9 [% `( p5 Z, m! D) j
6L]2`{S{Z{PDK[0M5$~J)BP.png . r, O8 f$ a+ C6 x" L

* O5 [. A! {# L5 z! b6 _Step3.配置SYS,我们这里选择的是Serial Wire。(正常情况配置不配置不影响,debug可以使用。但是你不可以把这两个引脚用于其他复用功能,如果用于其他复用功能,debug就不起作用了。)
1 e% t: \6 v7 U; k1 f) ]) C# C2 }8 @- R# V0 j
R)((V~6M7$)ZX)9L`4FS{ON.png 9 \8 J. `$ \9 n1 t
/ T/ n5 H# b- ?- R: [
Step4.配置时基以及定时器中断。% D5 U* d3 S+ F0 J& ^

, _9 ^4 r7 G( O: { @E9UG76RQ10_5LxN(ACOT.png
3 \, x- n& V, L
& `9 D  Q. L( _ P6UD()](SOI0L$O18_XKV@6.png / B2 T- k1 x. t  Z
- N) v: C6 N/ q" J; W# H$ w, n
到这里关于定时器参数配置基本已经完成,只需要根据之前文章《STM32Cube HAL:GPIO输入/输出(一)》Step4-Step8,设置相关工程参数和生成代码。8 j3 I1 T" |" K) _+ Z
三、添加功能代码8 `8 C# _3 v& S
首先在主函数中开启定时器,并使能定时器中断(更新中断),并在while(1)循环中添加一个判断语句,在定时器中断1000次以后,进行LED灯电平的翻转,并将中断计数清零。
; T$ H$ E) }. j
  1. int main(void)
    % p3 X; T0 C2 R) g1 X& @
  2. {
    ; z# F8 _+ S& B3 ?* c
  3.   HAL_Init();
    7 A7 P. W3 P" m& e8 g( `" k
  4.   SystemClock_Config();  K/ [9 k) V) P: |6 \1 K- r
  5.   MX_GPIO_Init();
    . r. w, u) \# ?* L9 a0 ?7 P
  6.   MX_TIM6_Init();1 S5 b4 d6 A) n* W, X
  7.         
    / C1 }6 F7 u' `; d# `3 U
  8.         __HAL_TIM_CLEAR_IT(&htim6,TIM_IT_UPDATE);//清除中断标志位,防止一使能定时器就进入中断
    1 x% [5 q& g9 v% ]
  9.         HAL_TIM_Base_Start_IT(&htim6);//开启定时器,并使能定时器中断(更新中断)) S5 K% v7 G' `  b3 H, X
  10.   while (1), T# R2 I  B/ O+ i- C
  11.   {
    & O8 _6 J7 i# {/ [" i
  12. " i4 x& a" T. B( C7 ]4 c
  13.                         if(cnt==1000)# \9 a$ y4 R5 X, w( Q/ [( l
  14.                         {
    # T) ?# H9 [) i3 B( V
  15.                                 HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_0);
    % A& e- D% Z9 m% n, L( G# b* W) q
  16.                                 cnt=0;7 M( v* n5 O9 e" @; d2 S
  17.                         }
    $ _0 v6 ?1 b5 k6 @- s- b. E) N: n3 D
  18.   }* r" N- k9 i+ G2 `/ K
  19. }
复制代码

* G% E9 T4 B* P6 _
! S* w6 W! q2 U8 P 回调函数,主要是用来计录定时器中断的次数,与while(1)循环中的判断语句相呼应。从而实现定时器计时1S,LED灯状态切换一次的效果。5 d$ `5 f+ ^+ |  D% U7 ]: N# j

5 ^6 h/ `9 a) L) n9 X
  1. void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
    ) O" S! E, }; r, k. ^. Z
  2. {
    ) S3 _6 u) Z% X! P8 C' q* b
  3.         cnt++;//记录定时器中断的次数
    6 V# Q1 M; m: Z
  4. }
复制代码
' J0 G6 G% C) L9 |0 B- T
定时器注意要点在于时基的配置。 这里我们先了解几个参数和概念。
( Q- U+ |# U1 ]9 U0 h6 W定时器的定时时间等于计数器的中断周期乘以中断的次数。
7 T# k2 M3 x/ i. e定时器的时钟:TIMxCLK
1 x. i3 U9 I+ A计数器时钟:CK_CNT! T; a* T( ~8 R
预分频数:PSC
& m/ c8 \1 [8 z* U  H定时器周期: ARR( 注意:这里的周期指的不是时间而是计数个数!!!计数器能计数的最大数值,有时候这里很容易混淆 )
! h6 u0 ]: K+ O4 l计数器的时钟频率等于定时器的时钟频率除以预分频数:
. @8 e- ~: L2 C, h/ ~5 DTIMxCLK/(PSC+1)   0 w) V4 P6 \# B( U) H, a  r. u$ t; K
计数器计一个数的时间等于计数器时钟频率的倒数:
" t4 p4 W5 W* a( d" W3 y(PSC+1)/TIMxCLK" f7 O6 @/ g$ K1 H3 j
产生一次中断的时间(中断周期)则等于计一个数的时间乘以计数的个数(定时器周期 ):                                                    (ARR+1)*(PSC+1)/TIMxCLK
2 a( }* N, }* O6 i% a$ l- t如果在中断服务程序里面设置一个变量 time ,用来记录中断的次数,那么就可以计算出我们需要的定时时间等于:5 b( k3 ^6 \9 G3 z
                                      time*(ARR+1)*(PSC+1)/TIMxCLK2 E+ Y' L* _* d0 b) a

+ g1 j  Z) W4 f. ~* ^9 ?: _- w
  }+ e/ P3 s- k6 ^% A( b
赞 收藏 评论0 发布时间:2022-4-7 16:37

举报

0个回答

所属标签

相似技术帖

官网相关资源

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