项目简介
/ 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+ {
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 [
$ 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
# 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" |
+ ?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
- \+ h$ j& U: I' r+ p
% V2 {2 `9 c1 p2 p6 G; f0 m* Q
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
: 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# \
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
* 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
- 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
, 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 ~* \
- int main(void)
, c! T/ t) R/ ^0 ~) F - {* ~2 L6 F, {& L/ [
- /* USER CODE BEGIN 1 */
0 r: Q. c6 O- D4 |9 Y0 p p1 I - 0 v. n0 y! L* r3 [- \
- /* USER CODE END 1 */* D1 f( a* i6 C, @
]3 ~9 e8 L. W1 e- /* MCU Configuration--------------------------------------------------------*/
- d& [0 F" s1 v' D4 Y# O' ~6 V - + B& M% t, U1 \: f+ A, ?* K
- /* Reset of all peripherals, Initializes the Flash interface and the Systick. */% A# Y+ ?- Y1 \; f" K
- HAL_Init();
! B( f W; O( w$ y
( ~7 E. n0 x- m; T; h$ R2 e4 M- /* USER CODE BEGIN Init */. F* o1 Q, m6 s9 T& J' U
6 d) F, k, f$ g- /* USER CODE END Init */7 a; {9 I3 U7 d
- 8 S+ S- F/ W, d! i% @
- /* Configure the system clock */
) O' d" L% [% h3 E: J - SystemClock_Config();+ b$ }# N( v( x/ X) ~% Z
- + ]3 q% i4 v5 p) J
- /* USER CODE BEGIN SysInit */: g. {& J' @/ R, g1 k: W
. r" X3 f' [7 p' R. n2 I+ ?- /* USER CODE END SysInit */
+ X4 z0 P4 y" A& ^- l: t0 y# s+ X
6 w( A \+ w0 ]& U, L- /* Initialize all configured peripherals */; V3 [% l7 V, }/ m1 u( K& k
- MX_GPIO_Init();
3 A) b- E. `% o0 k$ b' A6 q - MX_TIM2_Init();
; E. C/ j) b/ I; V
% m7 a6 e2 b% M( g" `- HAL_TIM_Base_Start_IT(&htim2);
1 }) m6 _' x+ a( H# |9 L - /* USER CODE BEGIN 2 */
. C4 l! n3 \6 ~( C4 g
3 W; S7 C$ W6 H6 z- /* USER CODE END 2 */0 p- X& ]) c& ^( `1 d4 {7 y
- 7 {8 O) ]! p6 s& m9 y
- /* Infinite loop */
6 `+ [0 E; V( k7 n% J - /* USER CODE BEGIN WHILE */
& g: R* x" I& ?2 e4 _/ z- x& ? - while (1)
* N! o$ }& c4 Y& g E- { - {6 T' [* N, n; `( R% Q( \
- /* USER CODE END WHILE */
4 e6 s( a& Q6 k/ L9 J - 4 u. B8 o- d, {, f
- /* USER CODE BEGIN 3 */
3 T. X1 c* ]* T1 P; T- d - }
" x) H' w' p% h3 G' n& _ - /* USER CODE END 3 */: t; O, I3 x, p6 G" P& ~$ L/ j6 P
- }
) z4 v( k* c3 _5 }8 c
; d: Z& w0 i( k- M b& x* v H& \
6 W, \- G6 m" c, n8 `1 m- ......
6 T/ ^8 h0 I" `9 |& ^5 P; ~4 v - $ ?/ |2 L- n ^7 P
; S: _3 d# `6 E1 {- /* USER CODE BEGIN 4 */) L# o* Z0 S% D
- void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
6 i0 N- Q+ a1 Z. }2 X - {& a5 U1 P# r5 S8 G/ @2 G
- HAL_GPIO_TogglePin(LED_GPIO_Port,LED_Pin);
- i/ j* \9 g' y3 ] d9 s3 y - }
7 `. l; ] G4 m( d
0 i6 d8 u- H8 ~1 b& N- /* 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
|