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

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

[复制链接]
STMCU小助手 发布时间:2022-12-31 21:14
项目简介
/ w2 k+ g, X4 V         利用CubMX生成基于32单片机的HAl库工程,然后编写程序在proteus上仿真验证。本项目最适合没有开发板的同学学习,零成本利用仿真软件率先入门STM32单片机。本项目利用CubMX创建一个32工程,用以实现定时器中断控制LED灯的状态转换的功能,并在Proteus中进行仿真验证。) ~. e5 L% Q# C6 i, ~$ Q
) N" l( f3 `; P2 U/ V  [1 u
硬件模块

5 @8 \% c8 \: z! D7 f        STM32F103R4
: g2 K1 {) a9 D  F        LED3 q2 |" ^( [6 k) T- Y

, ?* x8 o& w2 ~软件工具8 y1 v( k) }& c. S5 t' ]
        CubMX6 L7 K2 v- j# E3 F/ B
        Proteus, u6 S. v( [/ R' Y8 c. Q
        KEIL, W* n: l+ L* T: z$ n7 t
: g2 O& l1 Y$ d5 ]# i
电路连接图
+ I& n7 W2 m0 ~8 H1 w; J$ b' B- M4 k- z9 K- u" s2 }2 s+ {
T)$VU~U$ZIPBR{N[%K[0@YK.png 3 P& Y" c  C' P1 l6 D
# @8 D) E6 I0 D) |) S
工作流程
6 p  E: q  u, G6 V        首先,创建一个CubMX工程。这里选择的是STM32F103R4型号的单片机。下图是时钟树的设置,这个根据自己习惯设置就好,这里的时钟频率,也就是定时器时钟频率是8MHz.8 n4 h. I% `  V& ?

9 A! h1 ^: s- ?- ^9 [
[94JSNY52G7J_IX{Q85NHI3.png
$ A/ `& s; i8 x; K# D5 {
( I$ k  J$ S( r+ A
        介绍定时器发生中断时间的计算方法:定时器时间=(Prescaler+1)X(Counter Period+1)/定时器时钟频率 单位:秒/s。" d; ^- w" F+ b7 n! i6 _
  k4 t' R, O  M0 d( b. G$ c
        然后,假如我们需要LED灯的状态每隔3s改变一次,已知定时器的时钟频率是8MHz,于是我们设置Prescaler为8000-1,Counter Period设置为3000-1。并设置自动重装载,具体如下图。
, `; d( l8 l3 @. D$ I9 L, G0 s) q6 d% x" a- P
A54P92NK3~}JABM35TG@08M.png # b: r& v2 `6 f- d+ ?+ S- T# Y  w
8 T1 K& k$ Y- S: [; M0 I
        然后使能中断4 t/ ~. j) r  P* `

1 h0 o% E7 u- |1 i3 R8 V. b" |
}5~I%]0Y4FPPQLSLB`[1P}W.png + ?6 P  f( G- |" |) c6 k

. k* d# _! A' l1 t7 I        然后生成代码
/ V3 U1 A% B( p9 _) w& n2 Q
+ O% c. G; S2 S" q$ I
`KV4`F6TRG]}7~M9RJXWZ`A.png - \+ h$ j& U: I' r+ p

% V2 {2 `9 c1 p2 p6 G; f0 m* Q
DNP`W)NKV{~}`49P%PQAKAI.png
3 Z$ d8 G& q" F' ?0 n; w9 U. E0 a! Y  y- A1 b! n0 j$ I
        在stm32f4xx__it.c文件中找到TIM2_IRQHandler函数,
. D! E/ }3 t7 Y" n- A* Q, G, Q3 q3 G; ~+ G6 H/ E6 S
ZLW8[)C${P038OVCDQ[W4_8.png : z% J+ f+ Z+ S; e+ c% ]
& M& ?( A' {" k$ r- w. u5 b/ g0 q
        然后进入HAL_TIM_IRQHandler函数,在其中找到HAL_TIM_PeriodElapsedCallback函数,复制到main.c文件中重新编辑
  [& n% C1 w4 r# c0 |7 R7 s
$ T  b' R$ A# \
JU2L}5}73MW]EN@IQ1N0T]D.png 9 C/ i- M+ ~7 _2 v! n
8 T, ?% B6 W( P
        然后在main函数中添加HAL_TIM_Base_Start_IT(&htim2);函数即可。& n, G& j, z* l7 e2 b. L

3 x1 Q+ }2 T5 _! |: J; K! Y: u        接下来,创建一个Proteus工程。
5 {: p. U) _8 V6 y# ^  [; x: h! G
( p+ a* r7 L' o/ O- u3 v- r
~T`4$}NZ54_O~}9{E7[0HW2.png * H  H$ t! e  U

; `" S! u/ Z6 C6 g+ H        开始调试,刚开始灯是亮的。. y, O. f5 i" e" Z  q
( W/ J7 X/ d! V3 \: i# N2 p
`}R6EWW_)1C%{OS~8}3V3%D.png - L" b" a8 ^- A8 f* \' U8 I" B

9 }) R6 X3 q! L& B$ W( k        3秒之后,灯灭了
1 x* f( K. k1 L% [3 j' W% \3 O  e. y- S+ M
M5()3}WSUIQV{QMWLM1[HJ2.png , L" x( Z* r, l9 S& O1 x2 t
4 o' u3 d) ]' b
        调试成功,验证可用。
4 Q9 a0 c+ R$ W9 ~- w& b! i2 I7 D/ c3 ?5 U
程序代码& w( ~/ C: I5 ~* \
  1. int main(void)
    , c! T/ t) R/ ^0 ~) F
  2. {* ~2 L6 F, {& L/ [
  3.   /* USER CODE BEGIN 1 */
    0 r: Q. c6 O- D4 |9 Y0 p  p1 I
  4. 0 v. n0 y! L* r3 [- \
  5.   /* USER CODE END 1 */* D1 f( a* i6 C, @

  6.   ]3 ~9 e8 L. W1 e
  7.   /* MCU Configuration--------------------------------------------------------*/
    - d& [0 F" s1 v' D4 Y# O' ~6 V
  8. + B& M% t, U1 \: f+ A, ?* K
  9.   /* Reset of all peripherals, Initializes the Flash interface and the Systick. */% A# Y+ ?- Y1 \; f" K
  10.   HAL_Init();
    ! B( f  W; O( w$ y

  11. ( ~7 E. n0 x- m; T; h$ R2 e4 M
  12.   /* USER CODE BEGIN Init */. F* o1 Q, m6 s9 T& J' U

  13. 6 d) F, k, f$ g
  14.   /* USER CODE END Init */7 a; {9 I3 U7 d
  15. 8 S+ S- F/ W, d! i% @
  16.   /* Configure the system clock */
    ) O' d" L% [% h3 E: J
  17.   SystemClock_Config();+ b$ }# N( v( x/ X) ~% Z
  18. + ]3 q% i4 v5 p) J
  19.   /* USER CODE BEGIN SysInit */: g. {& J' @/ R, g1 k: W

  20. . r" X3 f' [7 p' R. n2 I+ ?
  21.   /* USER CODE END SysInit */
    + X4 z0 P4 y" A& ^- l: t0 y# s+ X

  22. 6 w( A  \+ w0 ]& U, L
  23.   /* Initialize all configured peripherals */; V3 [% l7 V, }/ m1 u( K& k
  24.   MX_GPIO_Init();
    3 A) b- E. `% o0 k$ b' A6 q
  25.   MX_TIM2_Init();
    ; E. C/ j) b/ I; V

  26. % m7 a6 e2 b% M( g" `
  27.         HAL_TIM_Base_Start_IT(&htim2);
    1 }) m6 _' x+ a( H# |9 L
  28.   /* USER CODE BEGIN 2 */
    . C4 l! n3 \6 ~( C4 g

  29. 3 W; S7 C$ W6 H6 z
  30.   /* USER CODE END 2 */0 p- X& ]) c& ^( `1 d4 {7 y
  31. 7 {8 O) ]! p6 s& m9 y
  32.   /* Infinite loop */
    6 `+ [0 E; V( k7 n% J
  33.   /* USER CODE BEGIN WHILE */
    & g: R* x" I& ?2 e4 _/ z- x& ?
  34.   while (1)
    * N! o$ }& c4 Y& g  E- {
  35.   {6 T' [* N, n; `( R% Q( \
  36.     /* USER CODE END WHILE */
    4 e6 s( a& Q6 k/ L9 J
  37. 4 u. B8 o- d, {, f
  38.     /* USER CODE BEGIN 3 */
    3 T. X1 c* ]* T1 P; T- d
  39.   }
    " x) H' w' p% h3 G' n& _
  40.   /* USER CODE END 3 */: t; O, I3 x, p6 G" P& ~$ L/ j6 P
  41. }
    ) z4 v( k* c3 _5 }8 c

  42. ; d: Z& w0 i( k- M  b& x* v  H& \

  43. 6 W, \- G6 m" c, n8 `1 m
  44. ......
    6 T/ ^8 h0 I" `9 |& ^5 P; ~4 v
  45. $ ?/ |2 L- n  ^7 P

  46. ; S: _3 d# `6 E1 {
  47. /* USER CODE BEGIN 4 */) L# o* Z0 S% D
  48. void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
    6 i0 N- Q+ a1 Z. }2 X
  49. {& a5 U1 P# r5 S8 G/ @2 G
  50.         HAL_GPIO_TogglePin(LED_GPIO_Port,LED_Pin);
    - i/ j* \9 g' y3 ]  d9 s3 y
  51. }
    7 `. l; ]  G4 m( d

  52. 0 i6 d8 u- H8 ~1 b& N
  53. /* USER CODE END 4 */
复制代码
8 L/ {$ j7 z2 y! O' P
4 r- b2 D7 X6 ]6 V! b4 A7 z5 k
作者:jxjajl 6 Z. `6 H: [( B9 |' r

- e+ X. p# s0 {. ^( p+ Y8 [4 W0 S. r0 S2 c7 N0 c
赞 收藏 评论0 发布时间:2022-12-31 21:14

举报

0个回答

所属标签

相似技术帖

官网相关资源

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