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

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

[复制链接]
STMCU小助手 发布时间:2022-11-16 16:07
项目简介
% ~0 Q( v% k; ^6 a' r% \# P' R         利用CubMX生成基于32单片机的HAl库工程,然后编写程序在proteus上仿真验证。本项目最适合没有开发板的同学学习,零成本利用仿真软件率先入门STM32单片机。本项目利用CubMX创建一个32工程,用以实现定时器中断控制LED灯的状态转换的功能,并在Proteus中进行仿真验证。! [: n+ V& A! O6 W* b
4 p7 }8 _$ g( q5 T
硬件模块
' L! N! o5 u. L; ^, t/ P, R* m3 N        STM32F103R4
7 i' m8 ^& u, n$ j
- ?' t- y- S9 C9 r        LED
, m6 r; I! K  I- A+ s9 D/ U) {% M/ e6 m9 C& D) n- O
软件工具' D) l+ O$ q8 o; J5 X' y4 K
        CubMX
! J+ [& m+ l! U. k2 u' `! X
2 h$ J9 l# a9 D6 z/ m& r: d        Proteus
2 {$ L, o) x: ]% J% C. F6 `  E7 u! k$ T! E
        KEIL8 A  P& G. p  M. l! X7 x& {9 H

! ^7 d; `3 ]1 f$ d; [  _. i& j& r2 G电路连接图6 W  P7 Q3 `4 n4 {5 q$ M- F, X* E
& V9 ]/ T  E" ?+ d+ R
56$HN0T{S(S_80T(~M@4763.png 4 t/ E  y( o0 ?5 B4 [

- S) ^) Y5 h  ]" P' B, Y% _- U3 P: i工作流程
. a" ~- q8 c/ x8 e8 n; q        首先,创建一个CubMX工程。这里选择的是STM32F103R4型号的单片机。下图是时钟树的设置,这个根据自己习惯设置就好,这里的时钟频率,也就是定时器时钟频率是8MHz.
6 F% n' @" E0 ~( }. d0 X8 t. T5 d' X3 Q9 L' k. ]7 L
3557PE_}FYE1OBP3N]X0H%X.png
( H9 K0 Y6 [8 m' f6 G- U# y# i5 B. ^, o- w3 j
        介绍定时器发生中断时间的计算方法:定时器时间=(Prescaler+1)X(Counter Period+1)/定时器时钟频率 单位:秒/s。
, Z, x  q& P& Z6 d! N0 B  q7 t* i2 f4 _9 j
        然后,假如我们需要LED灯的状态每隔3s改变一次,已知定时器的时钟频率是8MHz,于是我们设置Prescaler为8000-1,Counter Period设置为3000-1。并设置自动重装载,具体如下图。
, o3 \. y- A" F; c) l) ~; f
& Y3 U+ v* ]2 o" X* o( O8 n$ a 5]M0`@WA3VQZRM`GQNIJ.png 0 D0 U, G) m* W! e9 v
, v* K. D- J1 l& X6 w( y
        然后使能中断/ t' M6 y4 c) ~4 M; f6 ~

, o  l" c9 v, L$ g H9BJS3(XLVE49F$(130)1)T.png
8 d: b' C) N+ ~4 S2 Z) r. @" ]5 N/ k, Q& ]5 p; |7 Y
        然后生成代码
' A' S. ?( K6 l
7 L! T5 T" L5 I, q8 G9 J- e% N8 d FUB]UEZ{O2`(JNE~8N6S$OM.png 9 ?6 L0 q; ]  a! O8 ~

& @. D/ R, M0 K2 n R3[K1YA\8ATC{J_8H)(M7.png
- v+ J) S8 U; x6 F: L2 n( y3 V: U- |; r# E
        在stm32f4xx__it.c文件中找到TIM2_IRQHandler函数,
, E; [; U. @  O4 J- J! H, o8 H6 X5 a' b
1QV1[LCK~B$%R3(PM1Z77.png
" [' H# _0 m: n' N. o7 A8 I$ l+ L0 V8 g! s+ U' F( V
        然后进入HAL_TIM_IRQHandler函数,在其中找到HAL_TIM_PeriodElapsedCallback函数,复制到main.c文件中重新编辑( y3 ]( m7 s. F8 R, V( T3 Z

( N2 v: h( E% {1 _ X1]9CJWAL6`3G_07CT]7P%M.png $ C' \& h! z8 @6 K5 V$ g
- f3 ~5 b) v$ E2 R/ z' m  b% g; Y
        然后在main函数中添加HAL_TIM_Base_Start_IT(&htim2);函数即可。; [. h  c" N  x1 u
- U" s% @+ d3 a( Q. R
        接下来,创建一个Proteus工程。
7 v" w1 [$ x1 P; i( g' ^: p5 _4 Y1 g! l, e. z; \1 V$ s8 p' z+ F: Y7 f
Q@3B(W7[LKFFDBD0D~0$GSL.png 6 j( ^$ v, W# N1 z8 i& K

. f" P' \4 @* @# q6 l/ G        开始调试,刚开始灯是亮的。
; Y/ S9 Z  N% ?+ R# v  k5 E7 j, h7 u4 U+ f( s: Q4 P' `  B
QDZ2XP{VF@[CMWLQBVV3N{6.png ' F% P* y8 Q% K% L: }2 F! [8 m' f2 ]7 a
8 J1 O8 R, F; |  s
        3秒之后,灯灭了
9 A8 k( Y% S% ]5 l; e6 M1 ^* }: k: A& o# G9 u* x
{G2{3Q[39_48M9S5@9EUOIR.png
  l0 k1 t0 U/ t0 q- H3 n" z5 W+ a3 z0 S! B5 H8 n) P% r
        调试成功,验证可用。
* F0 T% S8 O0 h' n' O1 S6 ^/ K
# |( `% I! c$ N( e程序代码2 K& m; ~( C% Z6 _3 w
1 g. G* L& t8 P; [2 t3 Q2 m; ~2 ]* l
  1. int main(void)  T7 P. G7 s" S) q% e, ]( f
  2. {. j5 w& ]8 b5 m; i
  3.   /* USER CODE BEGIN 1 */
    ( T% _7 j: `8 ?& B) x) L. ]
  4. % z5 G/ \6 `% A3 e
  5.   /* USER CODE END 1 */
    ; i* O0 f% Z( C

  6. 3 W2 d- T( B8 ^2 Z! A9 r
  7.   /* MCU Configuration--------------------------------------------------------*/4 z' w: a/ j' a, J" f7 S1 P6 R
  8. 7 z# U1 o0 m7 {% Z
  9.   /* Reset of all peripherals, Initializes the Flash interface and the Systick. */1 |0 ~  x' S& ^
  10.   HAL_Init();# I' j4 o7 h$ w; P

  11. ( {( q: P) }/ V- Q4 Q! h& F
  12.   /* USER CODE BEGIN Init */* Z0 B6 X3 O9 X
  13. ; _% Z9 H1 f( P  k$ Y
  14.   /* USER CODE END Init */+ j! z- ~3 P- R3 z% V

  15. 9 p+ ?. X9 {  v/ {" V: _" I
  16.   /* Configure the system clock */
    " d6 B2 X; |$ L4 o2 d; j
  17.   SystemClock_Config();
    6 `( w" y2 \) c9 k' O6 w. ~) d

  18. # J3 b' T( P8 J" g% f
  19.   /* USER CODE BEGIN SysInit */
    8 O' D  T+ O0 ^! O/ s
  20. ) n0 h& T7 C) ~1 a. _
  21.   /* USER CODE END SysInit */  `) ~/ x( R' A
  22. : D' W8 P& G+ i2 _; k
  23.   /* Initialize all configured peripherals */
    1 |+ ^) n2 z+ ]! B- e, d
  24.   MX_GPIO_Init();
    - J: P: u6 M5 |: b, @0 x
  25.   MX_TIM2_Init();. i8 M9 \# g% y3 C& ~: @, S7 K, }
  26. : q8 k0 e, _2 D! f5 ?
  27.         HAL_TIM_Base_Start_IT(&htim2);
    5 J; J8 T0 ?: u
  28.   /* USER CODE BEGIN 2 */
    2 }5 D& G6 \2 j
  29. , N# o2 r& E$ N" y
  30.   /* USER CODE END 2 */2 F0 X: ^7 b& e& M
  31. $ @9 p% C) r0 H2 C: {
  32.   /* Infinite loop */
    " l1 M1 S7 [7 E) I5 H" I
  33.   /* USER CODE BEGIN WHILE */- j  j6 u+ m9 @; y0 |
  34.   while (1)
    , J+ I$ w. ?. F: s" R  c
  35.   {
    ; ~! b5 Y9 J* W5 Q7 Q0 b; x
  36.     /* USER CODE END WHILE */$ E+ T4 ?7 S) Q* r
  37. ; W% g1 s( j2 t$ l. \. K# P
  38.     /* USER CODE BEGIN 3 */" u( K( T- o0 u6 c6 @  F
  39.   }
      H. L' @6 r1 r0 M
  40.   /* USER CODE END 3 */7 l/ _' g$ A; A9 A  Y8 g1 U3 G
  41. }4 a% b, x7 ?2 v7 [4 S( o/ f/ g

  42. + v( @6 h& |: I' G  p

  43. & P/ H4 s7 W0 q' u1 X+ Y
  44. ......
    " L/ c6 N5 U0 ]  n# ?

  45. 6 n2 q1 o6 X, p" ~! e( q4 P

  46. ( o+ M+ `+ _& H
  47. /* USER CODE BEGIN 4 */2 @' o6 L$ K! ]
  48. void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
    , {9 G, V4 F$ ~
  49. {
    ; I4 J+ g0 C$ J- L
  50.         HAL_GPIO_TogglePin(LED_GPIO_Port,LED_Pin);
    / R: i, b2 [: |9 a5 O2 {5 X: E
  51. }- J2 m, z7 E/ n- A6 b  F( Q" E

  52. , A8 c0 L1 A4 q$ F- `6 S6 q( j
  53. /* USER CODE END 4 */
复制代码
5 v% Z$ U) l% D0 p" N
) }: _& g* T  a, K
作者:jxjajl  bilibili, [4 m7 ]0 W2 P; A8 }0 o
* H0 D; V" F0 Y) B4 l
赞 收藏 评论0 发布时间:2022-11-16 16:07

举报

0个回答

所属标签

相似技术帖

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