项目简介
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
% `( 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( ]
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
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: |
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
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
# 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
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
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
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: [
: 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
- int main(void)
v- Q9 v+ M& A3 K - {
. a! g! ]6 H: B: ?9 f" l5 R" F8 [" { - /* USER CODE BEGIN 1 */
' H7 L4 S- l% a" b {4 r/ I - . f, h- K- a" L7 o9 x ]7 t2 h0 u6 U& J
- /* USER CODE END 1 */
& o1 H ^7 u+ _1 D8 N) |6 n- b
. T6 }5 T% j* A1 R" W- /* MCU Configuration--------------------------------------------------------*/
7 T* w/ E& [. ]5 ?4 l% X - ( Z1 }+ e" J0 t+ s0 f; e
- /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
; s" }( K" \/ W0 T) C - HAL_Init();: m B+ O4 X/ [0 s/ M' x% B7 S M/ g9 W- y
- 6 c/ `- ]* o2 m1 S2 G2 E0 Z
- /* USER CODE BEGIN Init */
v" H8 c+ o* }& l9 J - . u! H/ Q; M8 s
- /* USER CODE END Init */3 V& @, o& n% d" q! k
- 0 W- z% ~/ r- \9 V
- /* Configure the system clock */# u$ I, h( q0 I4 m$ {
- SystemClock_Config();
+ D z( \! Q, k5 k
3 J& b% X! }3 [- y8 z% W% A7 e- /* USER CODE BEGIN SysInit */
5 ~+ S W$ n) v4 y3 g - : @# E2 d2 Y V7 k1 v% i
- /* USER CODE END SysInit */7 c% m/ ~" [4 @: Y1 U# U/ }9 {$ ?
9 m& F' U2 a1 e; h$ l, W+ }& ~1 U6 K- /* Initialize all configured peripherals */
) n+ P$ J+ f& E4 e - MX_GPIO_Init();2 I+ j5 \7 J( z, E6 X; N9 F
- MX_TIM2_Init();8 i8 V e) d! t4 @& _1 z
- 1 W" p0 |0 r7 M, N: A, z2 \0 b
- HAL_TIM_Base_Start_IT(&htim2);$ V" D) ~' L; b \3 N/ G: w
- /* USER CODE BEGIN 2 */9 W8 D, h# A; A i. g' C
e# m) g( j9 l; T" V- /* USER CODE END 2 */( p. T, H" f; @* M: o0 L0 c
- 3 g; U8 W3 x3 u7 Y# O
- /* Infinite loop */
" e" R2 Z" T% D9 ] - /* USER CODE BEGIN WHILE */9 @1 O1 Q0 V) E( p8 P
- while (1)
$ Z4 H: u; |: q - {8 F7 U; G! Z- d# f- D: [
- /* USER CODE END WHILE */
8 U2 ^, m; j) h' C$ _9 c
% p! f; K( t. s0 Q0 r3 H, |4 z- /* USER CODE BEGIN 3 */7 }( v' I6 O, A) ^
- }
0 F+ a+ A8 J! \1 n! r% G - /* USER CODE END 3 */2 Q- s: q3 @& Q! h- j
- }
- ^* F0 k% q- S- u d" s
0 E4 w$ H! j- Q
! u( T M7 ?% ~! u- ......
" I8 {: I: `! ]5 n- u' N. R
3 h9 w" Z/ _, R4 a; q1 o- 4 K0 b0 {: C& ^1 ` s, X) K4 Y
- /* USER CODE BEGIN 4 */, I; t/ H# }6 G' u3 e2 H6 a( T
- void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim). P7 S5 S* D: F
- {
6 y, @/ k0 F( v- p, J" z1 P5 h- n - HAL_GPIO_TogglePin(LED_GPIO_Port,LED_Pin);
( [6 y3 M+ o9 N [ - }: b$ I C- @* j! w* H
8 S: }: \! N# T- /* 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
|