请选择 进入手机版 | 继续访问电脑版

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

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

[复制链接]
STMCU小助手 发布时间:2022-11-16 16:07
项目简介
4 a5 j9 {2 [/ Q' m& u- _( A         利用CubMX生成基于32单片机的HAl库工程,然后编写程序在proteus上仿真验证。本项目最适合没有开发板的同学学习,零成本利用仿真软件率先入门STM32单片机。本项目利用CubMX创建一个32工程,用以实现定时器中断控制LED灯的状态转换的功能,并在Proteus中进行仿真验证。
( k4 Y5 `; T& r0 n$ I
) t) E% P  E0 B7 q硬件模块# L' V0 ^1 n0 d4 H  ]* q4 u. p
        STM32F103R4
# v: W/ w: s9 A& w0 W* H9 ~, p
        LED, f, R2 S& E" Y7 W
! M; m5 I+ ^. u/ t* g9 A: U
软件工具
) p* W6 J& M: [0 P' H        CubMX
5 K- I9 x9 h) R' a; d% {% e1 S$ a2 S' `: G& _
        Proteus
3 G( x( t" m# p# i8 y
. a* a- m/ Q3 A/ z* E$ t        KEIL
+ {! s( q2 B5 L6 D. w# I
2 E9 I3 L2 F, u' ^电路连接图
, p9 w; E; F) T& `/ z* D4 ?3 a1 m- E% L% ?. c& x/ I. t' U8 }
56$HN0T{S(S_80T(~M@4763.png 6 Q+ \" g" ]% C
) X- Y- F- g# x2 Q
工作流程7 S: b" l! k5 y
        首先,创建一个CubMX工程。这里选择的是STM32F103R4型号的单片机。下图是时钟树的设置,这个根据自己习惯设置就好,这里的时钟频率,也就是定时器时钟频率是8MHz.' |4 }2 ]' r$ s  T$ @) P

: K) t( `4 Q& J2 d9 w1 t 3557PE_}FYE1OBP3N]X0H%X.png
+ X' k* w% _2 S7 v4 z9 U
/ G. l: ~- Q9 v! O$ C$ I        介绍定时器发生中断时间的计算方法:定时器时间=(Prescaler+1)X(Counter Period+1)/定时器时钟频率 单位:秒/s。8 k! P* a: n* y' e  s! k
# T' P! E# q* v2 X. C* o: B
        然后,假如我们需要LED灯的状态每隔3s改变一次,已知定时器的时钟频率是8MHz,于是我们设置Prescaler为8000-1,Counter Period设置为3000-1。并设置自动重装载,具体如下图。# `: T4 A" A" L" N2 y) b! V0 O2 h1 b4 Z

. b" ?7 t% z5 r+ `5 z2 f  K# S 5]M0`@WA3VQZRM`GQNIJ.png 2 d  p. ?& @4 _! e1 L0 U
  U3 |- _* _9 d) U2 _+ X8 g
        然后使能中断, P$ S! i& Y5 n/ D) O

# a, r! J6 j0 D H9BJS3(XLVE49F$(130)1)T.png   A; W; J: t. ?( i' G

% U- e( t. \- j/ k6 b3 h        然后生成代码, C! x  q7 v! P- R; L/ }: ?9 A: p

: {) B8 e- C! b7 t. S/ _ FUB]UEZ{O2`(JNE~8N6S$OM.png
0 k2 c1 M8 [8 b0 P5 X/ R1 M9 [# t& P% U3 Y5 E$ {
R3[K1YA\8ATC{J_8H)(M7.png ( E: b# H) u; W- I2 C# W
+ @& V* `5 ]9 }
        在stm32f4xx__it.c文件中找到TIM2_IRQHandler函数,/ Y! b3 z4 n, J& O0 @

1 t/ Q2 ?4 ?/ W. n5 }& R; d: S- e- |5 g 1QV1[LCK~B$%R3(PM1Z77.png 3 T% S% b& H, _6 d" R! T

, }9 U0 Q9 H& k3 X4 a( a        然后进入HAL_TIM_IRQHandler函数,在其中找到HAL_TIM_PeriodElapsedCallback函数,复制到main.c文件中重新编辑
% i# J* `  K3 B" d
3 \0 d$ l% D2 d; a3 {2 j8 _ X1]9CJWAL6`3G_07CT]7P%M.png : E! G* o" k* l0 \" d* D
. X0 m5 v! t2 Z4 j- s6 r7 z
        然后在main函数中添加HAL_TIM_Base_Start_IT(&htim2);函数即可。9 c# K8 l& f& M9 C- [
3 [! r, f' v3 x' \
        接下来,创建一个Proteus工程。
: q$ g- l0 g; }9 f
6 G0 i# r. N7 \" ?9 a4 T Q@3B(W7[LKFFDBD0D~0$GSL.png 1 _6 C' E% H$ y

2 }3 L+ V+ \6 l9 ]        开始调试,刚开始灯是亮的。
/ b. ?* L8 q* M0 Z! A, C3 S! v( j# ]3 H& z* [: v1 o0 }
QDZ2XP{VF@[CMWLQBVV3N{6.png
2 X8 D* h* Q0 P! |  i4 m+ Y: s; V2 n: }
        3秒之后,灯灭了! ^+ D# t4 g6 i( x2 g
! j3 z- ?- ~1 a$ p; I& _, {
{G2{3Q[39_48M9S5@9EUOIR.png 6 z* E" F; m; ~, G' b

6 u2 s  s4 a8 `        调试成功,验证可用。4 T5 ^5 ^7 q( l- W( O2 ?
; b7 B$ I: @: ]' u1 {  Y- `+ Y
程序代码
+ n9 g9 }+ r8 E7 ?9 S- I- z8 B' G! X$ ]; R6 n' \
  1. int main(void)
    - t8 {! g" N  M8 [8 I0 X$ h
  2. {
    , U/ _7 h! q1 Y1 v$ t  U- s6 l3 s
  3.   /* USER CODE BEGIN 1 */) y- ?% t$ m) [: F5 Z0 h- I, r

  4. 5 S4 g# z" K& {6 n
  5.   /* USER CODE END 1 */
    6 N- s. K* g+ k: R, Y5 H9 F

  6. * t: |' J' B( F; l
  7.   /* MCU Configuration--------------------------------------------------------*/
    * K) G  h/ k" }

  8. ) J* k( e; w9 B8 `* J; {
  9.   /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
    * [  U  n* Y) ?/ d3 z( @
  10.   HAL_Init();7 b* z8 L; F+ T+ `& \
  11. . X) F6 T! t9 P0 g1 l  D$ H* `$ [5 o
  12.   /* USER CODE BEGIN Init */$ c6 b6 s0 z1 x2 q3 z/ Z; m
  13. 9 U( ~2 }; q$ K
  14.   /* USER CODE END Init */
    , Q* Q, e$ r+ P9 d
  15. 5 B2 @8 w+ G  q6 R1 W# H  {
  16.   /* Configure the system clock */" u+ o4 [5 A1 f& M
  17.   SystemClock_Config();; U- Q, [( ~5 |' }

  18. & s$ F0 f, g& Y& _2 }: C( K2 F
  19.   /* USER CODE BEGIN SysInit */( Z  o7 {# Q! ?& V3 e

  20. 0 A5 ]2 W% ?+ |. C; Z
  21.   /* USER CODE END SysInit */
    : R: f1 B6 o( H! Z, y! H" ?, v3 D% [: T
  22. + ?5 z" h6 q/ E- B8 T+ m3 j
  23.   /* Initialize all configured peripherals */) w- ]4 T5 U% e. z) j( {' O+ s$ }
  24.   MX_GPIO_Init();. `. Z& d% K) K* E
  25.   MX_TIM2_Init();
    " b+ z9 l6 X: H$ R3 ]

  26. 3 Q( ]+ V: T: ]; z# O' m
  27.         HAL_TIM_Base_Start_IT(&htim2);+ p! Q/ y+ J: C# ~1 E
  28.   /* USER CODE BEGIN 2 */5 D* O0 |1 x, b7 Z
  29. - L( \+ [* v/ D' ]! w4 d* F
  30.   /* USER CODE END 2 */
    / X7 I% K6 V* [  z: W& V9 h

  31. 0 z6 r- z* G7 H
  32.   /* Infinite loop */
    # k7 B# L: b5 d+ z3 X4 O4 v  C% F
  33.   /* USER CODE BEGIN WHILE */
    3 v+ L) E) D: E  v9 E9 O
  34.   while (1)
    " h, Z' `/ x2 Q+ T! i
  35.   {
    , a, C6 k6 S" H3 I) f
  36.     /* USER CODE END WHILE *// \% U7 F  i8 P! m6 Z

  37. 9 ~( |6 D  ]" U7 |* {9 A7 f
  38.     /* USER CODE BEGIN 3 */
    ; E, R- }8 m1 R1 b& w  F
  39.   }
    7 i1 B/ X5 \- b
  40.   /* USER CODE END 3 */
    7 q6 i* `! Y' Z
  41. }
    " g' R6 j: F, A0 D$ j) ~8 U

  42. 2 B# O& w8 }& l$ P

  43. ! v! P: Y6 ]$ X
  44. ......
      P8 o0 d" `& Z# j( {
  45. : ?: c$ {  S. }! U( ]" ]

  46.   \" s1 d1 @! G+ {
  47. /* USER CODE BEGIN 4 */# m- C' K& C6 b9 {% G8 f" Z" N
  48. void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
    : N0 d4 X* f: d2 h) J
  49. {
    . U; q" X" |& b8 ]% |3 ^
  50.         HAL_GPIO_TogglePin(LED_GPIO_Port,LED_Pin);, s7 m; K" R$ r
  51. }3 ?7 ^+ x! Y& `1 T

  52. + Y$ T! b4 x0 V7 l2 X2 q: z
  53. /* USER CODE END 4 */
复制代码
- f; [' e9 B6 m. @0 V" [3 u

0 z$ Q7 B5 C) J! k作者:jxjajl  bilibili9 F( Y3 Q* u/ U6 o6 }, r) e# j

: p; l' U1 q( S5 J# A+ u2 N9 X
收藏 评论0 发布时间:2022-11-16 16:07

举报

0个回答
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版