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

使用CubMX和Proteus学习STM32单片机(九)------定时器中断

[复制链接]
STMCU小助手 发布时间:2022-11-16 16:07
项目简介  r* y' `. c! Y( p* X$ g- n
         利用CubMX生成基于32单片机的HAl库工程,然后编写程序在proteus上仿真验证。本项目最适合没有开发板的同学学习,零成本利用仿真软件率先入门STM32单片机。本项目利用CubMX创建一个32工程,用以实现定时器中断控制LED灯的状态转换的功能,并在Proteus中进行仿真验证。- S% P) D* W5 L2 G7 ]3 e2 \

9 |, |. V/ W4 {4 e3 |' c8 }* @3 O+ N硬件模块) Y/ Q% y& k2 G" f+ m5 k0 k
        STM32F103R43 L) }& s/ `1 N; Y8 d  b$ c

, ]2 T0 Y. K" q' L        LED
5 n, }$ u# n+ N8 W1 x- n' M8 @) @% F8 @1 J
软件工具
# r+ u" X7 u1 w; M% A. m        CubMX
. G7 |. v4 H: X1 l3 E% _' L5 o: y! i0 ~. F
        Proteus& k9 ^$ x& q2 j" E6 {
- @0 i2 |) ]; W# B
        KEIL2 y( o6 S7 x: g+ V/ u, N

* |' m& K4 K) U8 f& q6 ]电路连接图
1 ^3 h, N+ n; K# t6 S' n) t: I$ l3 D* b% S4 ]
56$HN0T{S(S_80T(~M@4763.png
# N6 w* Z( u% A# X) U& s1 i$ x  C5 A
工作流程
0 y/ S$ y& T4 l7 `% }, Q- A% i7 H  F. Y        首先,创建一个CubMX工程。这里选择的是STM32F103R4型号的单片机。下图是时钟树的设置,这个根据自己习惯设置就好,这里的时钟频率,也就是定时器时钟频率是8MHz.! w3 C& A% k, D- C% C' x4 z% U. f& n

4 A# \/ p/ y9 ]! l- q7 t* d7 |2 r 3557PE_}FYE1OBP3N]X0H%X.png % g0 B# S& ^) _" ^; Q& a. r
% u! x! U; a1 H* c# h7 b
        介绍定时器发生中断时间的计算方法:定时器时间=(Prescaler+1)X(Counter Period+1)/定时器时钟频率 单位:秒/s。  Q1 h% H: {& _9 r0 g* H9 k

: v7 y6 n; l  w& Q4 J2 E" c# e        然后,假如我们需要LED灯的状态每隔3s改变一次,已知定时器的时钟频率是8MHz,于是我们设置Prescaler为8000-1,Counter Period设置为3000-1。并设置自动重装载,具体如下图。: D- c/ p* N+ u  Y
& O2 ]% c6 y/ D
5]M0`@WA3VQZRM`GQNIJ.png 7 f8 @) A* `9 }" i

2 \- V( i$ v4 t( \- A$ f# D        然后使能中断
5 }* s3 A1 J" p" g! b1 r4 N+ C) g% y
H9BJS3(XLVE49F$(130)1)T.png * Y; ?+ `0 G+ G" R6 g% {/ J( }( h5 @

: [! O- I8 }1 P! e" y1 J2 z        然后生成代码% w3 j$ {7 ~& a! \3 O
, V( D1 k: e( Z2 ~# |
FUB]UEZ{O2`(JNE~8N6S$OM.png
$ p" w/ H6 B8 \/ `& t
5 M& j0 j- _" G$ @. h4 v) x R3[K1YA\8ATC{J_8H)(M7.png
3 B$ m* E+ n- s0 h9 _* j6 h1 n/ [% d0 R( t0 B+ M: y7 M
        在stm32f4xx__it.c文件中找到TIM2_IRQHandler函数,
2 K1 f5 a( ?; K9 r1 c3 h9 x) ?  L3 R* T
1QV1[LCK~B$%R3(PM1Z77.png ' b- [% ]1 I9 I: f- B: |& I$ D8 ?, \

3 v, {+ p, \/ l# T8 k) @/ R        然后进入HAL_TIM_IRQHandler函数,在其中找到HAL_TIM_PeriodElapsedCallback函数,复制到main.c文件中重新编辑
9 M. O: Z6 v; e: i/ M3 c4 t
$ a) S, H9 D5 f) D" k X1]9CJWAL6`3G_07CT]7P%M.png 2 d3 d, w3 T/ _3 R; U
! L' h8 j+ p& {) ?: A+ u0 ~9 A8 s7 t* ?
        然后在main函数中添加HAL_TIM_Base_Start_IT(&htim2);函数即可。
! m7 g7 z+ q6 }2 m6 Y8 b
# P4 \" b+ W4 S  b$ {3 r( Y" A        接下来,创建一个Proteus工程。, c! v( k% U; g' N6 o. [
! S$ t  s) F  {2 {! Q
Q@3B(W7[LKFFDBD0D~0$GSL.png
' \; U+ ]- d( y' _' R) N
; g- `, L8 Y6 O        开始调试,刚开始灯是亮的。
9 T: X1 E7 g+ L. m! P  n1 M
- V! S8 w* f0 A% N( b! b QDZ2XP{VF@[CMWLQBVV3N{6.png ; E; ]$ H. _6 f5 G3 X

: J' N% p% U9 D7 j# Y/ j" e- ?9 w7 e        3秒之后,灯灭了
5 M. e( C9 A4 E8 i; L! q4 P, X( E* S* x  K8 I, t
{G2{3Q[39_48M9S5@9EUOIR.png + r1 s3 H8 i% B; q6 O
4 K/ M* K  y# [+ G! h: W
        调试成功,验证可用。! O0 T; S& B: n
7 l( z4 \) n8 w( j0 O1 h! ^
程序代码8 L/ P: ?' [! H$ m8 B# D
: e& S3 g9 _& ]2 w5 `
  1. int main(void), a5 L- L/ B! A: x
  2. {
    # V) R; a5 b% ]. F, v  D; t5 \2 _
  3.   /* USER CODE BEGIN 1 */) ?  e9 O2 Z. l& |+ Q1 J& A
  4. $ _8 F0 d& u" F% ?4 P4 j
  5.   /* USER CODE END 1 */
    + @& e7 `" A! M
  6. / k8 j: {; S1 D
  7.   /* MCU Configuration--------------------------------------------------------*/
    4 P$ i! m3 _* z- O! i  p

  8. 9 [' }8 A( I" I  P
  9.   /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
    9 u3 |% i) p4 y& e5 e3 t
  10.   HAL_Init();
    ) I5 P1 U; s" L/ `! u
  11. # l1 c- z" M# _- |; i
  12.   /* USER CODE BEGIN Init */* n- F% d. ^) v, k6 h+ Y

  13. 7 X% \+ v& U7 L- _; U( O  ]& D: P# K, j
  14.   /* USER CODE END Init */
    6 W2 C1 r" J. ]$ M0 {/ M+ x

  15. . C4 l. [/ P# \9 |
  16.   /* Configure the system clock */$ g" G) k. W3 m8 Y7 o
  17.   SystemClock_Config();' y' O( P7 N1 J$ T

  18. - p2 G- v2 J5 H6 f2 [
  19.   /* USER CODE BEGIN SysInit */1 S' ]4 o8 S7 ?$ `
  20. % h' P. W8 b7 {
  21.   /* USER CODE END SysInit */9 p5 d. Y4 E9 C& n, z2 I: h
  22. $ l. `1 R0 X' @/ h
  23.   /* Initialize all configured peripherals */  p+ X, j9 }0 W9 ~$ w* G
  24.   MX_GPIO_Init();
    8 }0 M) _; P  R# z+ ^- p+ |
  25.   MX_TIM2_Init();
    . ~$ x; K) L  C( C$ a, i

  26. : A* x) P% B5 q6 J
  27.         HAL_TIM_Base_Start_IT(&htim2);8 g4 B/ f$ v& q& Z3 C/ N: j. W; m
  28.   /* USER CODE BEGIN 2 */# k" V0 C* s6 ]. w! y
  29. 8 v6 J. z3 _6 j% a" ?% l: ]
  30.   /* USER CODE END 2 */
    ! P+ f# L* w, ~& T, ?( m
  31. 7 F0 E* v1 |: Z( {- p2 l, W! c
  32.   /* Infinite loop */
    " m7 H+ R( a- ^; S
  33.   /* USER CODE BEGIN WHILE */' E7 b% \( `: z& t3 Q$ h$ ]
  34.   while (1)
    & E8 J  R% o# M7 z  |2 ^' c
  35.   {$ {" Q) \  h- `8 x2 f
  36.     /* USER CODE END WHILE */$ _6 b) Z" [& V) m- m" {

  37. ' J9 A2 ~/ M/ K5 Y3 ?9 p
  38.     /* USER CODE BEGIN 3 */( f! b/ z7 }; A" ]/ c7 |) W: s
  39.   }0 l: W: y0 P7 x
  40.   /* USER CODE END 3 */
    2 x% u. I- [  l5 ?
  41. }) ^3 Q4 y& ^/ V/ @* l% S
  42. 1 M8 M2 n, `$ T2 Y
  43. 0 B2 U: k0 H8 G% E- j
  44. ......
    7 X7 ]8 l) h/ T
  45. ! T" j. S/ F& y& f' m- A
  46. & t/ o& _, a/ W( _7 I% e) \
  47. /* USER CODE BEGIN 4 */6 \% ?1 h4 f# S5 F, M% S
  48. void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)" J3 s0 ], W  i: [6 w2 ?
  49. {1 k2 Z1 Z' ^8 G& q
  50.         HAL_GPIO_TogglePin(LED_GPIO_Port,LED_Pin);
    / ~( r5 l9 s2 r+ ~$ Q$ L# i4 W$ v* B
  51. }& U9 M" p4 j, H% A' F. I( g1 U
  52. * j; q- A" @+ f+ S9 _
  53. /* USER CODE END 4 */
复制代码

, _! @; E+ X7 U5 g' \# s& e, M/ v' e' v' D3 M
作者:jxjajl  bilibili" ?1 l. c7 e( d# i3 N' ]1 j

6 P( @5 T& y! j, J
赞 收藏 评论0 发布时间:2022-11-16 16:07

举报

0个回答

所属标签

相似技术帖

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