项目简介
: ]! j% ?( w b7 l0 U1 u) g 利用CubMX生成基于32单片机的HAl库工程,然后编写程序在proteus上仿真验证。本项目最适合没有开发板的同学学习,零成本利用仿真软件率先入门STM32单片机。这是第三部分针对串口通信的一个实例,虚拟串口其实只是计算机以软件的方式模拟串口通信的功能,可以基本等同于实际的串口。本文主要用于对STM32串口通信的理解。
6 ~7 z$ a# r X1 A4 e" C" w0 p
! {" x% ]" t& @: Z6 u# h硬件模块
6 @* G& M* P# i' Z. _) c STM32F103R4* ~; I# i( ] Q
串口模块
5 v0 y; ^6 J0 e, S4 l: ^) m% q
; H. z8 o5 X4 ]# M0 u软件工具
' J) N9 x, A6 P0 Q2 R' S CubMX/ s/ n/ O2 Q( `* }
Proteus
" k1 e" G7 z( l2 m* _3 @* P' Y KEIL1 w8 G, j5 Q9 l! D' ^7 H9 ~: h
2 | Y; [$ j6 O) Y. s
电路连接图& g0 u0 f6 C$ C* B7 m
STM32F103R45 S j+ @/ q6 S8 d7 E" T
/ W6 F7 ]7 M! i+ F$ a0 @
* _5 @' J6 R) }$ {. _- U5 T
$ S; H# u9 e9 X2 S: Q8 D# k2 ^, ? 串口模块
+ C5 O3 ^- }; T; Y/ B
. t; p' l5 T. N. I
* ^% v1 ^# f7 G/ x7 F* D 7 f6 C9 b6 s! M- `7 @
工作流程( V. T9 u, p2 v y$ O3 B( n# h0 r _
首先是下载相应的虚拟串口,这里下载的是Virtual Serial Port Driver软件。$ ]6 [" P8 p. k0 D" ~4 m, ]4 ~! B; j
* D% L2 ]# k: I, C! }% y5 D
, N, q1 w3 O# ~" z! }
) n' O% s' ?- M* R 安装好后,其使用期限是14天,后续超过这个期限重新安装即可。其使用方法也很简单,使用的时候点击“Add pair”即可,这里是已经Add了COM1和COM2之后的情况,需要注意的是用完这个虚拟串口之后记得点击“Delate All”否则会一直占用。
4 n) }6 u+ A9 \7 J) b4 B8 ?' u- D1 a w, R( _6 }
( O! f5 e5 \; m4 L7 b5 w5 K/ A1 [1 Z! M$ l
然后创建CubMX工程,首先设置好串口 + b; ?6 v/ ]# {' M J: s
5 n3 x! |3 d9 b2 h
9 l* M3 F6 @# ~3 t' p, d. ^! e* t" u- N: g5 C9 s1 t
在CubMX中配置好串口中断。8 ` ^3 i' i0 T. R \, N
- Y+ }' A- h, }, q3 P* x
0 n7 }. n) h; q% y
/ M: `0 e5 e8 b% O' ^' `$ j& u 然后就是在生成的KEIL工程里面编写相应的程序啦。这部分在“程序代码”标题中有。
% Q. t. p. _* h9 v% H: Z" H& O! M5 R/ u
最后就是在Proteus和串口调试助手上验证啦,验证结果如下图所示。
- M; A! s/ A: u7 D3 C) a7 M$ G( o0 j( l) G
8 T- v. P" d& Y
7 v+ z2 Q0 @% v* ^# M程序代码
$ X2 N; C: \* d' @" n, x! S2 c2 z3 V- //重定向printf()到串口发送和接收,方便应用4 v- A* ]" E$ ]- m% J1 o( j& o
- int fputc(int ch, FILE *f){( t, [; U. d+ { U. C Z- a9 r
- uint8_t temp[1] = {ch};9 D) b8 ?7 W( e
- HAL_UART_Transmit(&huart1, temp, 1, 0xffff);
]$ {( G- _: ~% ?, ]9 M9 j9 |+ \ - return ch;
% P2 Q7 X* `* q8 e4 M/ O - }4 n, S8 E# ]+ b
- //重定向scanf()函数和getchar()函数,方便应用: a" i/ J& ?" I8 c3 H
- int fgetc(FILE * f)
' v3 g9 q3 b p, _$ \ - {
0 Q# p5 i9 w7 X* S - uint8_t ch = 0;
3 g0 [2 [5 Q4 e - HAL_UART_Receive(&huart1,&ch, 1, 0xffff);4 H. p. C) O; c; J
- return ch;7 s1 F; {0 x9 H$ r. z2 `
- }
$ R" ?4 r6 V) m0 |! R8 D - : v4 c% d0 x8 Z4 e) _
- /**/ G9 F( U3 l( |' v# O2 j! C
- * @brief The application entry point.% \. ~) u# t1 W7 G/ I
- * @retval int6 J4 K9 F% A& q1 O' n) b* h
- */" ?" l1 ^9 V9 A' i0 U
- int main(void)
+ z8 C' ]9 [1 z - {4 O. Z6 R& E5 T% q; r5 {6 E
- /* MCU Configuration--------------------------------------------------------*/
5 \9 h( s7 ~0 z: v - ; ]0 O# Z5 o7 l! p5 u
- /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
& ^% E: V& q ^. S - HAL_Init();
7 m; A9 e2 V2 p$ ^6 b) n. ~5 K* E
/ G8 y% l- b8 `- /* USER CODE BEGIN Init */. f' p) ?, \ C+ ~( w0 R; H; N+ f
- 2 F6 J# e x) l
- /* USER CODE END Init */; E1 o+ U1 W5 t7 n9 `
" N% ]3 X3 n( F& Z( w. M- /* Configure the system clock */
" I7 n% A8 U! j8 k9 [7 ^* k' F - SystemClock_Config();
U4 W/ W6 s: O- y) X - 4 h% Q; F, f, a: ^$ @
- /* USER CODE BEGIN SysInit */
' j, L0 g$ J) p6 I- h
, V9 `# L3 L) o! j- /* USER CODE END SysInit */
" t; u7 X3 m# y - I& {7 W9 A* p; j n
- /* Initialize all configured peripherals */: y/ I, A. B. ?4 v( r. w+ m
- MX_GPIO_Init();: z @0 f+ m4 C+ z% j; q
- MX_USART1_UART_Init();
, T, ^* U7 c o4 a3 d* h' A - /* USER CODE BEGIN 2 */0 f3 k+ G/ F7 Y' |7 O3 K$ X0 R
# l% ]# X3 k6 f- /* USER CODE END 2 */
: t _7 J$ C! g( F1 b9 m4 r$ j
2 ~6 w$ A; X* u- x0 a- /* Infinite loop */- b; e3 I" u! `: b% w0 G$ B
- /* USER CODE BEGIN WHILE */
* l) M4 k3 X# @7 m+ }2 h - printf("Hello World\n");
" ^6 m5 i s; P - while(1)( w2 g# i' g2 @: Q0 \3 R( T5 q
- {5 B: u; e# n9 L# m
, G5 @. \7 J) `" y1 c- /* USER CODE BEGIN 3 */
X1 Y8 K8 ~2 a! o) I - }, M0 n' E" }9 F$ y. f0 m/ T
- /* USER CODE END 3 */
: K( j2 {( R9 b# L; c - }
复制代码 & h! _* Q* |* C) M& N
转载自:jxjajl
( }9 z6 T9 d+ D* z/ D) S7 M, ^3 x2 w6 x, ^6 ?
|