项目简介
4 a5 j9 {2 [/ Q' m& u- _( A 利用CubMX生成基于32单片机的HAl库工程,然后编写程序在proteus上仿真验证。本项目最适合没有开发板的同学学习,零成本利用仿真软件率先入门STM32单片机。本项目利用CubMX创建一个32工程,用以实现定时器中断控制LED灯的状态转换的功能,并在Proteus中进行仿真验证。
( k4 Y5 `; T& r0 n$ I
) t) E% P E0 B7 q硬件模块# L' V0 ^1 n0 d4 H ]* q4 u. p
STM32F103R4
# v: W/ w: s9 A& w0 W* H9 ~, p
LED, f, R2 S& E" Y7 W
! M; m5 I+ ^. u/ t* g9 A: U
软件工具
) p* W6 J& M: [0 P' H CubMX
5 K- I9 x9 h) R' a; d% {% e1 S$ a2 S' `: G& _
Proteus
3 G( x( t" m# p# i8 y
. a* a- m/ Q3 A/ z* E$ t KEIL
+ {! s( q2 B5 L6 D. w# I
2 E9 I3 L2 F, u' ^电路连接图
, p9 w; E; F) T& `/ z* D4 ?3 a1 m- E% L% ?. c& x/ I. t' U8 }
6 Q+ \" g" ]% C
) X- Y- F- g# x2 Q
工作流程7 S: b" l! k5 y
首先,创建一个CubMX工程。这里选择的是STM32F103R4型号的单片机。下图是时钟树的设置,这个根据自己习惯设置就好,这里的时钟频率,也就是定时器时钟频率是8MHz.' |4 }2 ]' r$ s T$ @) P
: K) t( `4 Q& J2 d9 w1 t
+ X' k* w% _2 S7 v4 z9 U
/ G. l: ~- Q9 v! O$ C$ I 介绍定时器发生中断时间的计算方法:定时器时间=(Prescaler+1)X(Counter Period+1)/定时器时钟频率 单位:秒/s。8 k! P* a: n* y' e s! k
# T' P! E# q* v2 X. C* o: B
然后,假如我们需要LED灯的状态每隔3s改变一次,已知定时器的时钟频率是8MHz,于是我们设置Prescaler为8000-1,Counter Period设置为3000-1。并设置自动重装载,具体如下图。# `: T4 A" A" L" N2 y) b! V0 O2 h1 b4 Z
. b" ?7 t% z5 r+ `5 z2 f K# S
2 d p. ?& @4 _! e1 L0 U
U3 |- _* _9 d) U2 _+ X8 g
然后使能中断, P$ S! i& Y5 n/ D) O
# a, r! J6 j0 D
A; W; J: t. ?( i' G
% U- e( t. \- j/ k6 b3 h 然后生成代码, C! x q7 v! P- R; L/ }: ?9 A: p
: {) B8 e- C! b7 t. S/ _
0 k2 c1 M8 [8 b0 P5 X/ R1 M9 [# t& P% U3 Y5 E$ {
( E: b# H) u; W- I2 C# W
+ @& V* `5 ]9 }
在stm32f4xx__it.c文件中找到TIM2_IRQHandler函数,/ Y! b3 z4 n, J& O0 @
1 t/ Q2 ?4 ?/ W. n5 }& R; d: S- e- |5 g
3 T% S% b& H, _6 d" R! T
, }9 U0 Q9 H& k3 X4 a( a 然后进入HAL_TIM_IRQHandler函数,在其中找到HAL_TIM_PeriodElapsedCallback函数,复制到main.c文件中重新编辑
% i# J* ` K3 B" d
3 \0 d$ l% D2 d; a3 {2 j8 _
: E! G* o" k* l0 \" d* D
. X0 m5 v! t2 Z4 j- s6 r7 z
然后在main函数中添加HAL_TIM_Base_Start_IT(&htim2);函数即可。9 c# K8 l& f& M9 C- [
3 [! r, f' v3 x' \
接下来,创建一个Proteus工程。
: q$ g- l0 g; }9 f
6 G0 i# r. N7 \" ?9 a4 T
1 _6 C' E% H$ y
2 }3 L+ V+ \6 l9 ] 开始调试,刚开始灯是亮的。
/ b. ?* L8 q* M0 Z! A, C3 S! v( j# ]3 H& z* [: v1 o0 }
2 X8 D* h* Q0 P! | i4 m+ Y: s; V2 n: }
3秒之后,灯灭了! ^+ D# t4 g6 i( x2 g
! j3 z- ?- ~1 a$ p; I& _, {
6 z* E" F; m; ~, G' b
6 u2 s s4 a8 ` 调试成功,验证可用。4 T5 ^5 ^7 q( l- W( O2 ?
; b7 B$ I: @: ]' u1 { Y- `+ Y
程序代码
+ n9 g9 }+ r8 E7 ?9 S- I- z8 B' G! X$ ]; R6 n' \
- int main(void)
- t8 {! g" N M8 [8 I0 X$ h - {
, U/ _7 h! q1 Y1 v$ t U- s6 l3 s - /* USER CODE BEGIN 1 */) y- ?% t$ m) [: F5 Z0 h- I, r
5 S4 g# z" K& {6 n- /* USER CODE END 1 */
6 N- s. K* g+ k: R, Y5 H9 F
* t: |' J' B( F; l- /* MCU Configuration--------------------------------------------------------*/
* K) G h/ k" }
) J* k( e; w9 B8 `* J; {- /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
* [ U n* Y) ?/ d3 z( @ - HAL_Init();7 b* z8 L; F+ T+ `& \
- . X) F6 T! t9 P0 g1 l D$ H* `$ [5 o
- /* USER CODE BEGIN Init */$ c6 b6 s0 z1 x2 q3 z/ Z; m
- 9 U( ~2 }; q$ K
- /* USER CODE END Init */
, Q* Q, e$ r+ P9 d - 5 B2 @8 w+ G q6 R1 W# H {
- /* Configure the system clock */" u+ o4 [5 A1 f& M
- SystemClock_Config();; U- Q, [( ~5 |' }
& s$ F0 f, g& Y& _2 }: C( K2 F- /* USER CODE BEGIN SysInit */( Z o7 {# Q! ?& V3 e
0 A5 ]2 W% ?+ |. C; Z- /* USER CODE END SysInit */
: R: f1 B6 o( H! Z, y! H" ?, v3 D% [: T - + ?5 z" h6 q/ E- B8 T+ m3 j
- /* Initialize all configured peripherals */) w- ]4 T5 U% e. z) j( {' O+ s$ }
- MX_GPIO_Init();. `. Z& d% K) K* E
- MX_TIM2_Init();
" b+ z9 l6 X: H$ R3 ]
3 Q( ]+ V: T: ]; z# O' m- HAL_TIM_Base_Start_IT(&htim2);+ p! Q/ y+ J: C# ~1 E
- /* USER CODE BEGIN 2 */5 D* O0 |1 x, b7 Z
- - L( \+ [* v/ D' ]! w4 d* F
- /* USER CODE END 2 */
/ X7 I% K6 V* [ z: W& V9 h
0 z6 r- z* G7 H- /* Infinite loop */
# k7 B# L: b5 d+ z3 X4 O4 v C% F - /* USER CODE BEGIN WHILE */
3 v+ L) E) D: E v9 E9 O - while (1)
" h, Z' `/ x2 Q+ T! i - {
, a, C6 k6 S" H3 I) f - /* USER CODE END WHILE *// \% U7 F i8 P! m6 Z
9 ~( |6 D ]" U7 |* {9 A7 f- /* USER CODE BEGIN 3 */
; E, R- }8 m1 R1 b& w F - }
7 i1 B/ X5 \- b - /* USER CODE END 3 */
7 q6 i* `! Y' Z - }
" g' R6 j: F, A0 D$ j) ~8 U
2 B# O& w8 }& l$ P
! v! P: Y6 ]$ X- ......
P8 o0 d" `& Z# j( { - : ?: c$ { S. }! U( ]" ]
\" s1 d1 @! G+ {- /* USER CODE BEGIN 4 */# m- C' K& C6 b9 {% G8 f" Z" N
- void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
: N0 d4 X* f: d2 h) J - {
. U; q" X" |& b8 ]% |3 ^ - HAL_GPIO_TogglePin(LED_GPIO_Port,LED_Pin);, s7 m; K" R$ r
- }3 ?7 ^+ x! Y& `1 T
+ Y$ T! b4 x0 V7 l2 X2 q: z- /* USER CODE END 4 */
复制代码 - f; [' e9 B6 m. @0 V" [3 u
0 z$ Q7 B5 C) J! k作者:jxjajl bilibili9 F( Y3 Q* u/ U6 o6 }, r) e# j
: p; l' U1 q( S5 J# A+ u2 N9 X |