项目简介
% ~0 Q( v% k; ^6 a' r% \# P' R 利用CubMX生成基于32单片机的HAl库工程,然后编写程序在proteus上仿真验证。本项目最适合没有开发板的同学学习,零成本利用仿真软件率先入门STM32单片机。本项目利用CubMX创建一个32工程,用以实现定时器中断控制LED灯的状态转换的功能,并在Proteus中进行仿真验证。! [: n+ V& A! O6 W* b
4 p7 }8 _$ g( q5 T
硬件模块
' L! N! o5 u. L; ^, t/ P, R* m3 N STM32F103R4
7 i' m8 ^& u, n$ j
- ?' t- y- S9 C9 r LED
, m6 r; I! K I- A+ s9 D/ U) {% M/ e6 m9 C& D) n- O
软件工具' D) l+ O$ q8 o; J5 X' y4 K
CubMX
! J+ [& m+ l! U. k2 u' `! X
2 h$ J9 l# a9 D6 z/ m& r: d Proteus
2 {$ L, o) x: ]% J% C. F6 ` E7 u! k$ T! E
KEIL8 A P& G. p M. l! X7 x& {9 H
! ^7 d; `3 ]1 f$ d; [ _. i& j& r2 G电路连接图6 W P7 Q3 `4 n4 {5 q$ M- F, X* E
& V9 ]/ T E" ?+ d+ R
4 t/ E y( o0 ?5 B4 [
- S) ^) Y5 h ]" P' B, Y% _- U3 P: i工作流程
. a" ~- q8 c/ x8 e8 n; q 首先,创建一个CubMX工程。这里选择的是STM32F103R4型号的单片机。下图是时钟树的设置,这个根据自己习惯设置就好,这里的时钟频率,也就是定时器时钟频率是8MHz.
6 F% n' @" E0 ~( }. d0 X8 t. T5 d' X3 Q9 L' k. ]7 L
( H9 K0 Y6 [8 m' f6 G- U# y# i5 B. ^, o- w3 j
介绍定时器发生中断时间的计算方法:定时器时间=(Prescaler+1)X(Counter Period+1)/定时器时钟频率 单位:秒/s。
, Z, x q& P& Z6 d! N0 B q7 t* i2 f4 _9 j
然后,假如我们需要LED灯的状态每隔3s改变一次,已知定时器的时钟频率是8MHz,于是我们设置Prescaler为8000-1,Counter Period设置为3000-1。并设置自动重装载,具体如下图。
, o3 \. y- A" F; c) l) ~; f
& Y3 U+ v* ]2 o" X* o( O8 n$ a
0 D0 U, G) m* W! e9 v
, v* K. D- J1 l& X6 w( y
然后使能中断/ t' M6 y4 c) ~4 M; f6 ~
, o l" c9 v, L$ g
8 d: b' C) N+ ~4 S2 Z) r. @" ]5 N/ k, Q& ]5 p; |7 Y
然后生成代码
' A' S. ?( K6 l
7 L! T5 T" L5 I, q8 G9 J- e% N8 d
9 ?6 L0 q; ] a! O8 ~
& @. D/ R, M0 K2 n
- v+ J) S8 U; x6 F: L2 n( y3 V: U- |; r# E
在stm32f4xx__it.c文件中找到TIM2_IRQHandler函数,
, E; [; U. @ O4 J- J! H, o8 H6 X5 a' b
" [' H# _0 m: n' N. o7 A8 I$ l+ L0 V8 g! s+ U' F( V
然后进入HAL_TIM_IRQHandler函数,在其中找到HAL_TIM_PeriodElapsedCallback函数,复制到main.c文件中重新编辑( y3 ]( m7 s. F8 R, V( T3 Z
( N2 v: h( E% {1 _
$ C' \& h! z8 @6 K5 V$ g
- f3 ~5 b) v$ E2 R/ z' m b% g; Y
然后在main函数中添加HAL_TIM_Base_Start_IT(&htim2);函数即可。; [. h c" N x1 u
- U" s% @+ d3 a( Q. R
接下来,创建一个Proteus工程。
7 v" w1 [$ x1 P; i( g' ^: p5 _4 Y1 g! l, e. z; \1 V$ s8 p' z+ F: Y7 f
6 j( ^$ v, W# N1 z8 i& K
. f" P' \4 @* @# q6 l/ G 开始调试,刚开始灯是亮的。
; Y/ S9 Z N% ?+ R# v k5 E7 j, h7 u4 U+ f( s: Q4 P' ` B
' F% P* y8 Q% K% L: }2 F! [8 m' f2 ]7 a
8 J1 O8 R, F; | s
3秒之后,灯灭了
9 A8 k( Y% S% ]5 l; e6 M1 ^* }: k: A& o# G9 u* x
l0 k1 t0 U/ t0 q- H3 n" z5 W+ a3 z0 S! B5 H8 n) P% r
调试成功,验证可用。
* F0 T% S8 O0 h' n' O1 S6 ^/ K
# |( `% I! c$ N( e程序代码2 K& m; ~( C% Z6 _3 w
1 g. G* L& t8 P; [2 t3 Q2 m; ~2 ]* l
- int main(void) T7 P. G7 s" S) q% e, ]( f
- {. j5 w& ]8 b5 m; i
- /* USER CODE BEGIN 1 */
( T% _7 j: `8 ?& B) x) L. ] - % z5 G/ \6 `% A3 e
- /* USER CODE END 1 */
; i* O0 f% Z( C
3 W2 d- T( B8 ^2 Z! A9 r- /* MCU Configuration--------------------------------------------------------*/4 z' w: a/ j' a, J" f7 S1 P6 R
- 7 z# U1 o0 m7 {% Z
- /* Reset of all peripherals, Initializes the Flash interface and the Systick. */1 |0 ~ x' S& ^
- HAL_Init();# I' j4 o7 h$ w; P
( {( q: P) }/ V- Q4 Q! h& F- /* USER CODE BEGIN Init */* Z0 B6 X3 O9 X
- ; _% Z9 H1 f( P k$ Y
- /* USER CODE END Init */+ j! z- ~3 P- R3 z% V
9 p+ ?. X9 { v/ {" V: _" I- /* Configure the system clock */
" d6 B2 X; |$ L4 o2 d; j - SystemClock_Config();
6 `( w" y2 \) c9 k' O6 w. ~) d
# J3 b' T( P8 J" g% f- /* USER CODE BEGIN SysInit */
8 O' D T+ O0 ^! O/ s - ) n0 h& T7 C) ~1 a. _
- /* USER CODE END SysInit */ `) ~/ x( R' A
- : D' W8 P& G+ i2 _; k
- /* Initialize all configured peripherals */
1 |+ ^) n2 z+ ]! B- e, d - MX_GPIO_Init();
- J: P: u6 M5 |: b, @0 x - MX_TIM2_Init();. i8 M9 \# g% y3 C& ~: @, S7 K, }
- : q8 k0 e, _2 D! f5 ?
- HAL_TIM_Base_Start_IT(&htim2);
5 J; J8 T0 ?: u - /* USER CODE BEGIN 2 */
2 }5 D& G6 \2 j - , N# o2 r& E$ N" y
- /* USER CODE END 2 */2 F0 X: ^7 b& e& M
- $ @9 p% C) r0 H2 C: {
- /* Infinite loop */
" l1 M1 S7 [7 E) I5 H" I - /* USER CODE BEGIN WHILE */- j j6 u+ m9 @; y0 |
- while (1)
, J+ I$ w. ?. F: s" R c - {
; ~! b5 Y9 J* W5 Q7 Q0 b; x - /* USER CODE END WHILE */$ E+ T4 ?7 S) Q* r
- ; W% g1 s( j2 t$ l. \. K# P
- /* USER CODE BEGIN 3 */" u( K( T- o0 u6 c6 @ F
- }
H. L' @6 r1 r0 M - /* USER CODE END 3 */7 l/ _' g$ A; A9 A Y8 g1 U3 G
- }4 a% b, x7 ?2 v7 [4 S( o/ f/ g
+ v( @6 h& |: I' G p
& P/ H4 s7 W0 q' u1 X+ Y- ......
" L/ c6 N5 U0 ] n# ?
6 n2 q1 o6 X, p" ~! e( q4 P
( o+ M+ `+ _& H- /* USER CODE BEGIN 4 */2 @' o6 L$ K! ]
- void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
, {9 G, V4 F$ ~ - {
; I4 J+ g0 C$ J- L - HAL_GPIO_TogglePin(LED_GPIO_Port,LED_Pin);
/ R: i, b2 [: |9 a5 O2 {5 X: E - }- J2 m, z7 E/ n- A6 b F( Q" E
, A8 c0 L1 A4 q$ F- `6 S6 q( j- /* USER CODE END 4 */
复制代码 5 v% Z$ U) l% D0 p" N
) }: _& g* T a, K
作者:jxjajl bilibili, [4 m7 ]0 W2 P; A8 }0 o
* H0 D; V" F0 Y) B4 l
|