项目简介 r* y' `. c! Y( p* X$ g- n
利用CubMX生成基于32单片机的HAl库工程,然后编写程序在proteus上仿真验证。本项目最适合没有开发板的同学学习,零成本利用仿真软件率先入门STM32单片机。本项目利用CubMX创建一个32工程,用以实现定时器中断控制LED灯的状态转换的功能,并在Proteus中进行仿真验证。- S% P) D* W5 L2 G7 ]3 e2 \
9 |, |. V/ W4 {4 e3 |' c8 }* @3 O+ N硬件模块) Y/ Q% y& k2 G" f+ m5 k0 k
STM32F103R43 L) }& s/ `1 N; Y8 d b$ c
, ]2 T0 Y. K" q' L LED
5 n, }$ u# n+ N8 W1 x- n' M8 @) @% F8 @1 J
软件工具
# r+ u" X7 u1 w; M% A. m CubMX
. G7 |. v4 H: X1 l3 E% _' L5 o: y! i0 ~. F
Proteus& k9 ^$ x& q2 j" E6 {
- @0 i2 |) ]; W# B
KEIL2 y( o6 S7 x: g+ V/ u, N
* |' m& K4 K) U8 f& q6 ]电路连接图
1 ^3 h, N+ n; K# t6 S' n) t: I$ l3 D* b% S4 ]
# N6 w* Z( u% A# X) U& s1 i$ x C5 A
工作流程
0 y/ S$ y& T4 l7 `% }, Q- A% i7 H F. Y 首先,创建一个CubMX工程。这里选择的是STM32F103R4型号的单片机。下图是时钟树的设置,这个根据自己习惯设置就好,这里的时钟频率,也就是定时器时钟频率是8MHz.! w3 C& A% k, D- C% C' x4 z% U. f& n
4 A# \/ p/ y9 ]! l- q7 t* d7 |2 r
% g0 B# S& ^) _" ^; Q& a. r
% u! x! U; a1 H* c# h7 b
介绍定时器发生中断时间的计算方法:定时器时间=(Prescaler+1)X(Counter Period+1)/定时器时钟频率 单位:秒/s。 Q1 h% H: {& _9 r0 g* H9 k
: v7 y6 n; l w& Q4 J2 E" c# e 然后,假如我们需要LED灯的状态每隔3s改变一次,已知定时器的时钟频率是8MHz,于是我们设置Prescaler为8000-1,Counter Period设置为3000-1。并设置自动重装载,具体如下图。: D- c/ p* N+ u Y
& O2 ]% c6 y/ D
7 f8 @) A* `9 }" i
2 \- V( i$ v4 t( \- A$ f# D 然后使能中断
5 }* s3 A1 J" p" g! b1 r4 N+ C) g% y
* Y; ?+ `0 G+ G" R6 g% {/ J( }( h5 @
: [! O- I8 }1 P! e" y1 J2 z 然后生成代码% w3 j$ {7 ~& a! \3 O
, V( D1 k: e( Z2 ~# |
$ p" w/ H6 B8 \/ `& t
5 M& j0 j- _" G$ @. h4 v) x
3 B$ m* E+ n- s0 h9 _* j6 h1 n/ [% d0 R( t0 B+ M: y7 M
在stm32f4xx__it.c文件中找到TIM2_IRQHandler函数,
2 K1 f5 a( ?; K9 r1 c3 h9 x) ? L3 R* T
' b- [% ]1 I9 I: f- B: |& I$ D8 ?, \
3 v, {+ p, \/ l# T8 k) @/ R 然后进入HAL_TIM_IRQHandler函数,在其中找到HAL_TIM_PeriodElapsedCallback函数,复制到main.c文件中重新编辑
9 M. O: Z6 v; e: i/ M3 c4 t
$ a) S, H9 D5 f) D" k
2 d3 d, w3 T/ _3 R; U
! L' h8 j+ p& {) ?: A+ u0 ~9 A8 s7 t* ?
然后在main函数中添加HAL_TIM_Base_Start_IT(&htim2);函数即可。
! m7 g7 z+ q6 }2 m6 Y8 b
# P4 \" b+ W4 S b$ {3 r( Y" A 接下来,创建一个Proteus工程。, c! v( k% U; g' N6 o. [
! S$ t s) F {2 {! Q
' \; U+ ]- d( y' _' R) N
; g- `, L8 Y6 O 开始调试,刚开始灯是亮的。
9 T: X1 E7 g+ L. m! P n1 M
- V! S8 w* f0 A% N( b! b
; E; ]$ H. _6 f5 G3 X
: J' N% p% U9 D7 j# Y/ j" e- ?9 w7 e 3秒之后,灯灭了
5 M. e( C9 A4 E8 i; L! q4 P, X( E* S* x K8 I, t
+ r1 s3 H8 i% B; q6 O
4 K/ M* K y# [+ G! h: W
调试成功,验证可用。! O0 T; S& B: n
7 l( z4 \) n8 w( j0 O1 h! ^
程序代码8 L/ P: ?' [! H$ m8 B# D
: e& S3 g9 _& ]2 w5 `
- int main(void), a5 L- L/ B! A: x
- {
# V) R; a5 b% ]. F, v D; t5 \2 _ - /* USER CODE BEGIN 1 */) ? e9 O2 Z. l& |+ Q1 J& A
- $ _8 F0 d& u" F% ?4 P4 j
- /* USER CODE END 1 */
+ @& e7 `" A! M - / k8 j: {; S1 D
- /* MCU Configuration--------------------------------------------------------*/
4 P$ i! m3 _* z- O! i p
9 [' }8 A( I" I P- /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
9 u3 |% i) p4 y& e5 e3 t - HAL_Init();
) I5 P1 U; s" L/ `! u - # l1 c- z" M# _- |; i
- /* USER CODE BEGIN Init */* n- F% d. ^) v, k6 h+ Y
7 X% \+ v& U7 L- _; U( O ]& D: P# K, j- /* USER CODE END Init */
6 W2 C1 r" J. ]$ M0 {/ M+ x
. C4 l. [/ P# \9 |- /* Configure the system clock */$ g" G) k. W3 m8 Y7 o
- SystemClock_Config();' y' O( P7 N1 J$ T
- p2 G- v2 J5 H6 f2 [- /* USER CODE BEGIN SysInit */1 S' ]4 o8 S7 ?$ `
- % h' P. W8 b7 {
- /* USER CODE END SysInit */9 p5 d. Y4 E9 C& n, z2 I: h
- $ l. `1 R0 X' @/ h
- /* Initialize all configured peripherals */ p+ X, j9 }0 W9 ~$ w* G
- MX_GPIO_Init();
8 }0 M) _; P R# z+ ^- p+ | - MX_TIM2_Init();
. ~$ x; K) L C( C$ a, i
: A* x) P% B5 q6 J- HAL_TIM_Base_Start_IT(&htim2);8 g4 B/ f$ v& q& Z3 C/ N: j. W; m
- /* USER CODE BEGIN 2 */# k" V0 C* s6 ]. w! y
- 8 v6 J. z3 _6 j% a" ?% l: ]
- /* USER CODE END 2 */
! P+ f# L* w, ~& T, ?( m - 7 F0 E* v1 |: Z( {- p2 l, W! c
- /* Infinite loop */
" m7 H+ R( a- ^; S - /* USER CODE BEGIN WHILE */' E7 b% \( `: z& t3 Q$ h$ ]
- while (1)
& E8 J R% o# M7 z |2 ^' c - {$ {" Q) \ h- `8 x2 f
- /* USER CODE END WHILE */$ _6 b) Z" [& V) m- m" {
' J9 A2 ~/ M/ K5 Y3 ?9 p- /* USER CODE BEGIN 3 */( f! b/ z7 }; A" ]/ c7 |) W: s
- }0 l: W: y0 P7 x
- /* USER CODE END 3 */
2 x% u. I- [ l5 ? - }) ^3 Q4 y& ^/ V/ @* l% S
- 1 M8 M2 n, `$ T2 Y
- 0 B2 U: k0 H8 G% E- j
- ......
7 X7 ]8 l) h/ T - ! T" j. S/ F& y& f' m- A
- & t/ o& _, a/ W( _7 I% e) \
- /* USER CODE BEGIN 4 */6 \% ?1 h4 f# S5 F, M% S
- void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)" J3 s0 ], W i: [6 w2 ?
- {1 k2 Z1 Z' ^8 G& q
- HAL_GPIO_TogglePin(LED_GPIO_Port,LED_Pin);
/ ~( r5 l9 s2 r+ ~$ Q$ L# i4 W$ v* B - }& U9 M" p4 j, H% A' F. I( g1 U
- * j; q- A" @+ f+ S9 _
- /* USER CODE END 4 */
复制代码
, _! @; E+ X7 U5 g' \# s& e, M/ v' e' v' D3 M
作者:jxjajl bilibili" ?1 l. c7 e( d# i3 N' ]1 j
6 P( @5 T& y! j, J |