项目简介
+ 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 ~/ n6 q7 ] I" @( D$ O+ W5 f2 Q
电路连接图. H, `/ o, U- X5 P8 S5 R4 a
9 y) _9 j) x0 R( I- |
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
! 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
- j5 j8 w, S6 ~3 l) K
& b( |/ H, V/ C) |
然后使能中断5 }/ D9 }8 _) C0 i7 p
( ~/ J M' |6 ~" Y, z
$ 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
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
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
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
$ r2 o1 u0 m) [+ g
7 t2 W8 O9 R: ]2 O& f* q0 C
开始调试,刚开始灯是亮的。! l7 w3 B' v, {& {4 r" r
# [9 |* [- @! @
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 `
- _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
- int main(void)$ @+ F j5 U" p7 f! z
- {6 ^3 g9 t( H* @9 r7 V2 s
- /* USER CODE BEGIN 1 */$ J( F" Y5 D$ [: o" t
% N" p) |* i' _; r* r; m/ y) [- }$ T- /* USER CODE END 1 */
# A1 x* O$ }: W# U2 ]2 } - 1 I% p7 ~( o/ ]; H7 g( p' V4 C- D
- /* MCU Configuration--------------------------------------------------------*/$ L+ d- q" |: R5 o2 V, D; s
- & U" c5 V3 m' C0 Y: c, [& v
- /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
6 z. g4 f+ V. L - HAL_Init();
4 o6 [$ d; T, `5 }. Q0 f6 H) r8 c
4 `, d4 W% N0 f7 A- /* USER CODE BEGIN Init */. a2 b+ {( u. C$ n5 }+ b5 w M
- * h" j/ Q8 K& W. f. m0 i
- /* USER CODE END Init */1 U; }# M/ v/ A0 E3 o( X) {
6 B* K% z$ ]" T4 H% W% I- /* Configure the system clock */
6 L4 K& P$ \# }8 f - SystemClock_Config();
0 a( z! }4 [2 F1 `' t2 ] - 8 G" |1 y( j+ D+ S. l
- /* USER CODE BEGIN SysInit */$ a2 Z7 k4 r6 z3 e$ Z; P0 q" I6 r
- 9 x7 P+ s' b8 l# V \7 t
- /* USER CODE END SysInit */ }; c9 ~3 I: @* B3 q+ V; Y
- 6 u! s3 Y/ j! e
- /* Initialize all configured peripherals */' f/ m* u$ x- W' W5 D" ?1 l2 R7 Y& d
- MX_GPIO_Init();
6 B' V/ b: o3 m8 N6 Q( ^' u0 ]' @ - MX_TIM2_Init();! U- ~ y' ?3 A9 E. q
- & N# G9 |" K- f, w3 w- o
- HAL_TIM_Base_Start_IT(&htim2);: ]+ g4 L: y! i( u1 w
- /* USER CODE BEGIN 2 */
; z& }" c1 g& ?* E
/ n; f2 K/ v, N; B; t- /* USER CODE END 2 */7 e: x# ~+ X+ e6 d4 y7 k
5 K- ~& Q5 _8 J) _- /* Infinite loop */
1 O% c$ n, h! E- @9 U% f - /* USER CODE BEGIN WHILE */, c4 \4 F; s, _
- while (1)4 ]0 r/ P! ]* k5 d/ c) v* {
- {
3 @' V$ @1 j! F' d6 S; V7 b4 ] Z - /* USER CODE END WHILE */8 n' e! q" i/ e- l+ t. m5 a& G* E
6 p4 H; Z/ i: x" ^- /* USER CODE BEGIN 3 */" }6 y; d" F; O9 e$ E! E, Z$ V( D
- }
' m& _' L% K$ [: p3 X$ R y: T - /* USER CODE END 3 */8 `5 u* Y7 @& @, r3 Q
- }7 l4 H1 T! S6 x" z7 z' b
2 r; @7 M9 t1 _- 4 P- ]) K9 @! P& j) \
- ......
! w& x$ I' T8 m% {8 O5 L5 p, u
1 {9 J, z' j! F/ K. u- 5 ^, O3 y. B7 l9 M
- /* USER CODE BEGIN 4 */
6 K4 D6 _! ^1 _3 h4 i, n, K - void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim). k2 U4 L. y7 O! t; B
- {
. o4 N. b4 I6 f - HAL_GPIO_TogglePin(LED_GPIO_Port,LED_Pin);
, @9 I+ d0 C( X/ e$ V - }% S, Z; @: q+ ]* w/ Q: K8 h
' x( \2 ` j# {- D- /* USER CODE END 4 */
复制代码 # D2 T; {3 J) t& Z3 e
作者:jxjajl
4 ~# i" _& ]) Y$ D7 ~" U) c) c. K2 Y' \; Y+ \$ b0 b
|