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

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

[复制链接]
STMCU小助手 发布时间:2023-2-10 15:46
项目简介
+ N( K* j8 @6 [3 j* J: `/ A         利用CubMX生成基于32单片机的HAl库工程,然后编写程序在proteus上仿真验证。本项目最适合没有开发板的同学学习,零成本利用仿真软件率先入门STM32单片机。本项目利用CubMX创建一个32工程,用以实现定时器中断控制LED灯的状态转换的功能,并在Proteus中进行仿真验证。8 k4 q. c% o: \: O/ G" c

2 D# J8 D5 g& p/ Z$ ]1 @0 y5 t( G硬件模块5 s( q9 E" }0 C' z! S! R4 b. W
        STM32F103R4
4 ]' J' ?# `8 L& ]1 d" i        LED
& f; b# J. l: {, ~2 g
) v6 P6 {* G. H) r软件工具
* K! I! m2 j  U% w  w- S2 s        CubMX
0 Z6 T" f: R# E4 C# h4 {9 W! e        Proteus5 [3 @; f) y3 A& s
        KEIL
" j% z, r; w& v$ r7 M8 ~/ n
6 q7 ]  I" @( D$ O+ W5 f2 Q
电路连接图. H, `/ o, U- X5 P8 S5 R4 a

9 y) _9 j) x0 R( I- |
3IU)[MOR0J5[X8KJUUH5ZTT.png
0 Q; L7 Y7 H2 E  ~9 c: w/ J8 e) J; @9 f( t+ x" r* A6 e
工作流程
+ K$ L# E6 E+ ]/ k' y' O) [        首先,创建一个CubMX工程。这里选择的是STM32F103R4型号的单片机。下图是时钟树的设置,这个根据自己习惯设置就好,这里的时钟频率,也就是定时器时钟频率是8MHz.
1 I' R$ b$ C  P6 j& q0 N5 X9 B! A, Z3 H& p5 A1 Z
}_U50LO%J_I_16AL_CQ%~56.png ! U! [. d) B  b
- x8 f( i: A1 D; p  q3 i, ~
        介绍定时器发生中断时间的计算方法:定时器时间=(Prescaler+1)X(Counter Period+1)/定时器时钟频率 单位:秒/s。+ `' w6 O4 H) O8 A

' A7 M: f7 v2 b/ ~- t0 X        然后,假如我们需要LED灯的状态每隔3s改变一次,已知定时器的时钟频率是8MHz,于是我们设置Prescaler为8000-1,Counter Period设置为3000-1。并设置自动重装载,具体如下图。
& Z/ R  x& G# Y! u; V4 w9 _* F
) [+ L+ L* \8 W( g; Q; f0 {, C$ i
6PIM(BK[4GH]T${Q5A@OG`6.png - j5 j8 w, S6 ~3 l) K
& b( |/ H, V/ C) |
        然后使能中断5 }/ D9 }8 _) C0 i7 p

( ~/ J  M' |6 ~" Y, z
_I~`}Z}7~P9$YCT`W0)EY5V.png
$ j- X* g) ~: G# Z
$ q$ y; W- b* M5 j+ K        然后生成代码
4 Z+ u3 a9 `) q3 m7 ?* {
: }1 W' e3 l* O4 p& H) g! f# [

7 o9 v2 T; m. [* u  m! d
8 g5 _5 `. k8 Q. c3 a6 K3 e. H$ o
%QNQ)}DXFJ$R@F]X6BW5B6Q.png
9 R2 ]+ L! @8 `: d* ?' ]; ?' [* S+ z1 d7 V) M
        在stm32f4xx__it.c文件中找到TIM2_IRQHandler函数,0 M. C1 ]$ h# a/ c  }- P6 B5 z( I5 @
/ Z# Q2 d0 O6 F- N. E; a1 W
2AKW)`C~U4WDON}V_$LS8TH.png 0 f6 j' y8 R* N: v1 a
/ n; g6 F. r0 K+ V; R
        然后进入HAL_TIM_IRQHandler函数,在其中找到HAL_TIM_PeriodElapsedCallback函数,复制到main.c文件中重新编辑5 i3 I# X4 g: V- B. {& L/ ?

3 ^7 F  z4 v  W* `7 a4 r% R2 V' v
3]KIRF4NP{BQ{YO3}W2}3YE.png 4 h7 W+ T* Y, |4 u+ Y( n

( L! y# y8 r8 F4 W2 L        然后在main函数中添加HAL_TIM_Base_Start_IT(&htim2);函数即可。6 N& _4 z6 X* m0 H2 ]& ?4 x9 i) x

  N/ o0 J- P7 b$ b( I% ^        接下来,创建一个Proteus工程。
4 P& L- M, z. N9 V, Y' o5 x% F
6 p2 U' V+ \6 M) X: s' m, n& R( w
N4KGTY96K~~~5PRZ384W1(K.png $ r2 o1 u0 m) [+ g
7 t2 W8 O9 R: ]2 O& f* q0 C
        开始调试,刚开始灯是亮的。! l7 w3 B' v, {& {4 r" r

# [9 |* [- @! @
D17`(KVJ@R2R_GZT9[6J5_Q.png 5 h- X) H1 ?& d4 x( v) n8 y
  `1 K3 n/ W, j6 ]8 G( y9 P6 W
编辑- r* ]. [+ {$ D; p( j
        3秒之后,灯灭了2 e; N% ^8 _; {, X" t; b6 }8 D
  u1 _& w6 @$ Q4 f6 f( I4 `
%IO%1[MM@KCL6(4XGL_[6NN.png - _3 `" {' j3 x& {. T- J
9 h: q8 k& w7 O  O5 w2 l
编辑/ l3 G/ x; S+ q& q2 \% c, U8 {
/ S* Y8 V$ O+ M* S0 n/ x7 V
        调试成功,验证可用。
9 X) x# b: ?) ^9 h2 ^- M* W# x, F# `* x

3 g! n9 b8 ?* O/ |. @( m; ?0 h2 @程序代码
0 y& ]5 D7 q; N. N
  1. int main(void)$ @+ F  j5 U" p7 f! z
  2. {6 ^3 g9 t( H* @9 r7 V2 s
  3.   /* USER CODE BEGIN 1 */$ J( F" Y5 D$ [: o" t

  4. % N" p) |* i' _; r* r; m/ y) [- }$ T
  5.   /* USER CODE END 1 */
    # A1 x* O$ }: W# U2 ]2 }
  6. 1 I% p7 ~( o/ ]; H7 g( p' V4 C- D
  7.   /* MCU Configuration--------------------------------------------------------*/$ L+ d- q" |: R5 o2 V, D; s
  8. & U" c5 V3 m' C0 Y: c, [& v
  9.   /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
    6 z. g4 f+ V. L
  10.   HAL_Init();
    4 o6 [$ d; T, `5 }. Q0 f6 H) r8 c

  11. 4 `, d4 W% N0 f7 A
  12.   /* USER CODE BEGIN Init */. a2 b+ {( u. C$ n5 }+ b5 w  M
  13. * h" j/ Q8 K& W. f. m0 i
  14.   /* USER CODE END Init */1 U; }# M/ v/ A0 E3 o( X) {

  15. 6 B* K% z$ ]" T4 H% W% I
  16.   /* Configure the system clock */
    6 L4 K& P$ \# }8 f
  17.   SystemClock_Config();
    0 a( z! }4 [2 F1 `' t2 ]
  18. 8 G" |1 y( j+ D+ S. l
  19.   /* USER CODE BEGIN SysInit */$ a2 Z7 k4 r6 z3 e$ Z; P0 q" I6 r
  20. 9 x7 P+ s' b8 l# V  \7 t
  21.   /* USER CODE END SysInit */  }; c9 ~3 I: @* B3 q+ V; Y
  22. 6 u! s3 Y/ j! e
  23.   /* Initialize all configured peripherals */' f/ m* u$ x- W' W5 D" ?1 l2 R7 Y& d
  24.   MX_GPIO_Init();
    6 B' V/ b: o3 m8 N6 Q( ^' u0 ]' @
  25.   MX_TIM2_Init();! U- ~  y' ?3 A9 E. q
  26. & N# G9 |" K- f, w3 w- o
  27.         HAL_TIM_Base_Start_IT(&htim2);: ]+ g4 L: y! i( u1 w
  28.   /* USER CODE BEGIN 2 */
    ; z& }" c1 g& ?* E

  29. / n; f2 K/ v, N; B; t
  30.   /* USER CODE END 2 */7 e: x# ~+ X+ e6 d4 y7 k

  31. 5 K- ~& Q5 _8 J) _
  32.   /* Infinite loop */
    1 O% c$ n, h! E- @9 U% f
  33.   /* USER CODE BEGIN WHILE */, c4 \4 F; s, _
  34.   while (1)4 ]0 r/ P! ]* k5 d/ c) v* {
  35.   {
    3 @' V$ @1 j! F' d6 S; V7 b4 ]  Z
  36.     /* USER CODE END WHILE */8 n' e! q" i/ e- l+ t. m5 a& G* E

  37. 6 p4 H; Z/ i: x" ^
  38.     /* USER CODE BEGIN 3 */" }6 y; d" F; O9 e$ E! E, Z$ V( D
  39.   }
    ' m& _' L% K$ [: p3 X$ R  y: T
  40.   /* USER CODE END 3 */8 `5 u* Y7 @& @, r3 Q
  41. }7 l4 H1 T! S6 x" z7 z' b

  42. 2 r; @7 M9 t1 _
  43. 4 P- ]) K9 @! P& j) \
  44. ......
    ! w& x$ I' T8 m% {8 O5 L5 p, u

  45. 1 {9 J, z' j! F/ K. u
  46. 5 ^, O3 y. B7 l9 M
  47. /* USER CODE BEGIN 4 */
    6 K4 D6 _! ^1 _3 h4 i, n, K
  48. void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim). k2 U4 L. y7 O! t; B
  49. {
    . o4 N. b4 I6 f
  50.         HAL_GPIO_TogglePin(LED_GPIO_Port,LED_Pin);
    , @9 I+ d0 C( X/ e$ V
  51. }% S, Z; @: q+ ]* w/ Q: K8 h

  52. ' x( \2 `  j# {- D
  53. /* USER CODE END 4 */
复制代码
# D2 T; {3 J) t& Z3 e
作者:jxjajl
4 ~# i" _& ]) Y$ D7 ~" U) c) c. K2 Y' \; Y+ \$ b0 b
J4V8_XGA9L0$V@IXQWT@5ZL.png
赞 收藏 评论0 发布时间:2023-2-10 15:46

举报

0个回答

所属标签

相似技术帖

官网相关资源

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