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

基于STM32CubMX和Proteus——定时器中断

[复制链接]
STMCU小助手 发布时间:2023-2-10 15:46
项目简介
9 h# f- @; Z9 @: H0 g         利用CubMX生成基于32单片机的HAl库工程,然后编写程序在proteus上仿真验证。本项目最适合没有开发板的同学学习,零成本利用仿真软件率先入门STM32单片机。本项目利用CubMX创建一个32工程,用以实现定时器中断控制LED灯的状态转换的功能,并在Proteus中进行仿真验证。% L+ \" H% o( n' O" Z$ t7 m

- ^( _+ u7 B  d; i+ X0 i; |5 K硬件模块# A) D. G+ k" h& `/ P
        STM32F103R4
) E, E( I! G( |+ T* `5 {        LED
5 z# v  Z8 Z3 f' d# A7 W- z0 K
软件工具
- x+ s/ w: T& c" H        CubMX' u/ j- v+ L  p9 w' d: t! y
        Proteus  G- b3 A8 g* r( O6 G4 g
        KEIL  t$ E( e& s: h( X
- ], J9 s+ y8 b" C- V1 i1 d5 Y
电路连接图
  W; G6 H  n# Z; P- c1 m* D# b& ~; b& M/ z" T' _; W
3IU)[MOR0J5[X8KJUUH5ZTT.png % `( c/ e0 V+ W3 {* [$ }. |& f
- y, H) [- x" X+ t0 x2 w
工作流程* r- i! [* L- o6 y' J: t
        首先,创建一个CubMX工程。这里选择的是STM32F103R4型号的单片机。下图是时钟树的设置,这个根据自己习惯设置就好,这里的时钟频率,也就是定时器时钟频率是8MHz.( x0 Z+ ~9 S- J& L2 E
& w  J9 l* |6 K" d0 x( ]
}_U50LO%J_I_16AL_CQ%~56.png
9 W1 {1 {, s( P! M& s: W  ^- t' V' H; t/ _
        介绍定时器发生中断时间的计算方法:定时器时间=(Prescaler+1)X(Counter Period+1)/定时器时钟频率 单位:秒/s。
% @9 D# Y6 _+ v1 j0 D

; d, J- V6 ]6 f# {9 P. Q) g        然后,假如我们需要LED灯的状态每隔3s改变一次,已知定时器的时钟频率是8MHz,于是我们设置Prescaler为8000-1,Counter Period设置为3000-1。并设置自动重装载,具体如下图。
0 B# f- {/ A% a7 k$ ^4 m' U$ n/ P; I" G
6PIM(BK[4GH]T${Q5A@OG`6.png 8 k  Z* G7 T0 {$ V8 e

; Z- j( t3 m4 p5 v0 j0 o3 ]        然后使能中断  h9 }% Z4 |  j$ E  [6 ^& x

- v% [, ?- S; H5 I4 u: |
_I~`}Z}7~P9$YCT`W0)EY5V.png 9 h5 f% _9 T% Z* u0 I. a

5 M. o7 \) o3 O        然后生成代码; ?- e. H+ c# {& M
9 w5 g% l8 A: c* W1 W* k$ O. ]7 z

/ C0 l! o2 {' K
* N4 r! i8 V0 S5 _& b/ a6 g* g- h
%QNQ)}DXFJ$R@F]X6BW5B6Q.png
1 \4 J7 u4 D, m( a6 z0 p7 E
8 p& ^1 \! Z" L* c- o        在stm32f4xx__it.c文件中找到TIM2_IRQHandler函数,
1 l) s' x- L4 x0 s/ W/ E# o$ l6 J& s: o" l5 h5 f1 h
2AKW)`C~U4WDON}V_$LS8TH.png
# k- J2 J: `2 V& O- ^3 h- U4 Y0 z$ s4 t* F5 q
        然后进入HAL_TIM_IRQHandler函数,在其中找到HAL_TIM_PeriodElapsedCallback函数,复制到main.c文件中重新编辑
9 W0 q+ \) [+ p4 }- K7 O
7 R5 Y4 |# [0 ^! T% _) o
3]KIRF4NP{BQ{YO3}W2}3YE.png
1 N7 r7 ~, ?& l8 c+ f1 m
0 k  o) ?$ W- t, c* ?        然后在main函数中添加HAL_TIM_Base_Start_IT(&htim2);函数即可。
9 x  [. q; r9 u- x# a" ^2 `
6 E  |5 D. t9 ?        接下来,创建一个Proteus工程。$ ?! F  v* e: e& N! }6 p

6 S- K8 b% u5 b9 K! a3 W6 I& b
N4KGTY96K~~~5PRZ384W1(K.png
0 Y4 B4 i% n* |) }/ M4 e5 l, G8 O9 M6 n. W6 R5 F& c/ `
        开始调试,刚开始灯是亮的。
  g$ i# g' O: t* r) k
9 D/ S! H% K- j7 T% S1 x2 e
D17`(KVJ@R2R_GZT9[6J5_Q.png
0 \4 G/ x8 L% M
* ?6 [$ q7 q$ X0 y+ |" V
编辑2 [3 x0 e; b, A/ g# F' d; o7 j) u% l# h
        3秒之后,灯灭了
" B4 o) C  R' c. g0 J  y2 O
1 y4 L: [& w' E1 W4 H5 F1 U: [
%IO%1[MM@KCL6(4XGL_[6NN.png
: i# l8 P6 C6 k, c1 y
5 s( Q1 t1 S7 s( w编辑2 j9 `7 _3 K+ L6 E7 W
7 `5 w$ Z+ h, }. T' V: x. h- O/ }4 I6 @
        调试成功,验证可用。
4 [4 v$ T; Y8 T- ~
4 D! ]  R6 }6 q: L+ g6 |5 [2 f3 j
% v8 ]% Q& r% \' D
程序代码
* C7 }' }2 \: ?6 S1 o4 \8 e3 J
  1. int main(void)
      v- Q9 v+ M& A3 K
  2. {
    . a! g! ]6 H: B: ?9 f" l5 R" F8 [" {
  3.   /* USER CODE BEGIN 1 */
    ' H7 L4 S- l% a" b  {4 r/ I
  4. . f, h- K- a" L7 o9 x  ]7 t2 h0 u6 U& J
  5.   /* USER CODE END 1 */
    & o1 H  ^7 u+ _1 D8 N) |6 n- b

  6. . T6 }5 T% j* A1 R" W
  7.   /* MCU Configuration--------------------------------------------------------*/
    7 T* w/ E& [. ]5 ?4 l% X
  8. ( Z1 }+ e" J0 t+ s0 f; e
  9.   /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
    ; s" }( K" \/ W0 T) C
  10.   HAL_Init();: m  B+ O4 X/ [0 s/ M' x% B7 S  M/ g9 W- y
  11. 6 c/ `- ]* o2 m1 S2 G2 E0 Z
  12.   /* USER CODE BEGIN Init */
      v" H8 c+ o* }& l9 J
  13. . u! H/ Q; M8 s
  14.   /* USER CODE END Init */3 V& @, o& n% d" q! k
  15. 0 W- z% ~/ r- \9 V
  16.   /* Configure the system clock */# u$ I, h( q0 I4 m$ {
  17.   SystemClock_Config();
    + D  z( \! Q, k5 k

  18. 3 J& b% X! }3 [- y8 z% W% A7 e
  19.   /* USER CODE BEGIN SysInit */
    5 ~+ S  W$ n) v4 y3 g
  20. : @# E2 d2 Y  V7 k1 v% i
  21.   /* USER CODE END SysInit */7 c% m/ ~" [4 @: Y1 U# U/ }9 {$ ?

  22. 9 m& F' U2 a1 e; h$ l, W+ }& ~1 U6 K
  23.   /* Initialize all configured peripherals */
    ) n+ P$ J+ f& E4 e
  24.   MX_GPIO_Init();2 I+ j5 \7 J( z, E6 X; N9 F
  25.   MX_TIM2_Init();8 i8 V  e) d! t4 @& _1 z
  26. 1 W" p0 |0 r7 M, N: A, z2 \0 b
  27.         HAL_TIM_Base_Start_IT(&htim2);$ V" D) ~' L; b  \3 N/ G: w
  28.   /* USER CODE BEGIN 2 */9 W8 D, h# A; A  i. g' C

  29.   e# m) g( j9 l; T" V
  30.   /* USER CODE END 2 */( p. T, H" f; @* M: o0 L0 c
  31. 3 g; U8 W3 x3 u7 Y# O
  32.   /* Infinite loop */
    " e" R2 Z" T% D9 ]
  33.   /* USER CODE BEGIN WHILE */9 @1 O1 Q0 V) E( p8 P
  34.   while (1)
    $ Z4 H: u; |: q
  35.   {8 F7 U; G! Z- d# f- D: [
  36.     /* USER CODE END WHILE */
    8 U2 ^, m; j) h' C$ _9 c

  37. % p! f; K( t. s0 Q0 r3 H, |4 z
  38.     /* USER CODE BEGIN 3 */7 }( v' I6 O, A) ^
  39.   }
    0 F+ a+ A8 J! \1 n! r% G
  40.   /* USER CODE END 3 */2 Q- s: q3 @& Q! h- j
  41. }
    - ^* F0 k% q- S- u  d" s

  42. 0 E4 w$ H! j- Q

  43. ! u( T  M7 ?% ~! u
  44. ......
    " I8 {: I: `! ]5 n- u' N. R

  45. 3 h9 w" Z/ _, R4 a; q1 o
  46. 4 K0 b0 {: C& ^1 `  s, X) K4 Y
  47. /* USER CODE BEGIN 4 */, I; t/ H# }6 G' u3 e2 H6 a( T
  48. void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim). P7 S5 S* D: F
  49. {
    6 y, @/ k0 F( v- p, J" z1 P5 h- n
  50.         HAL_GPIO_TogglePin(LED_GPIO_Port,LED_Pin);
    ( [6 y3 M+ o9 N  [
  51. }: b$ I  C- @* j! w* H

  52. 8 S: }: \! N# T
  53. /* USER CODE END 4 */
复制代码

+ r- Y8 X& c0 I! E8 c作者:jxjajl
. ?( |) [! c! K& Z$ @* n3 e, M2 R( G5 E9 q5 s, Z! J
J4V8_XGA9L0$V@IXQWT@5ZL.png
收藏 评论0 发布时间:2023-2-10 15:46

举报

0个回答

所属标签

相似分享

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版