项目简介4 e7 F3 O1 m# T3 G* L* `7 c% s
利用CubMX生成基于32单片机的HAl库工程,然后编写程序在proteus上仿真验证。本项目最适合没有开发板的同学学习,零成本利用仿真软件率先入门STM32单片机。这是第三部分针对串口通信的一个实例,虚拟串口其实只是计算机以软件的方式模拟串口通信的功能,可以基本等同于实际的串口。本文主要用于对STM32串口通信的理解。
| ~/ n* z; c' }4 x# e' ^( i. J8 P4 F8 ]2 [
硬件模块9 G3 ~3 v) g1 W5 k$ ^. S! a0 {! H
STM32F103R4
% }, C* [4 ]9 @& H2 @* A6 ^1 P4 i( c: J/ h5 R# L
串口模块7 _' m2 V: T- R( U% X# H6 W
; p: G# D4 D' x9 K2 }软件工具
! x) e' K2 k) p5 a+ ]: w CubMX
8 y9 Q, ~$ ], V/ G/ z6 `9 l) k3 l) k4 W7 H& t7 `
Proteus* n* p1 b. H3 Q
: I: C& g" A7 s. A! ] KEIL, p, B2 X% K" K* T* d+ F9 ?/ W/ H
% {& B- k d4 R( v$ j- u# q) T: b
电路连接图
5 b* U; h/ F2 }! [4 _ STM32F103R4/ u" o0 t. P* ~$ H+ e' t1 Q' Z& J
# K9 g h9 ~0 \6 _( D6 z1 A
d0 b: W$ `! r+ I7 B6 B% U2 Q' p+ \
6 k' B* i6 H) I- k+ N2 l' q
串口模块6 B7 ?5 T N* W, K" X
1 g' i0 x A5 P3 F% b C
+ x" {2 l# M! Q* c8 h; g
' ^1 [0 K/ E/ _
( b9 d! X6 h4 ?2 j工作流程
4 n+ x* m/ R7 v3 r% V 首先是下载相应的虚拟串口,这里下载的是Virtual Serial Port Driver软件。
/ i) p. U( U# R8 D1 c( u( D
* B2 o: A! D5 U- }1 q+ C* V
' n6 J" a$ k \7 N/ l( R
- `. N, f7 l' b4 d9 v, q M
- X6 H: z5 Y. b: n' h
安装好后,其使用期限是14天,后续超过这个期限重新安装即可。其使用方法也很简单,使用的时候点击“Add pair”即可,这里是已经Add了COM1和COM2之后的情况,需要注意的是用完这个虚拟串口之后记得点击“Delate All”否则会一直占用。 6 _- ]3 u" c- ]1 j+ g, y
; _% } |3 y5 ?
; w: {$ B% _' _
4 x3 z: N& ~! U8 _5 z) L' Q
0 i0 @" Y% o2 w8 U. j 然后创建CubMX工程,首先设置好串口 , }0 O2 J' C9 |2 e6 D- ~
2 n+ d0 d3 A3 I& `' c9 t
' F4 ]7 d7 B7 K( S2 r: y1 `7 j, p1 d* \) J) v
0 o1 X \: L* {; V3 M0 H D) q2 K. s
在CubMX中配置好串口中断。
$ Z% F/ [0 e9 c( Q, ~
) m: T5 W/ i9 F% ~. N( V& R5 V. R
: V* B, [4 S4 h3 M, p, J5 i, m4 k# S; k* o- A1 l _) ~
然后就是在生成的KEIL工程里面编写相应的程序啦。这部分在“程序代码”标题中有。- @2 V8 i2 [9 ~/ V& Q' N) E" e
$ @: A- Z, G' o$ l$ A0 Q* h* R 最后就是在Proteus和串口调试助手上验证啦,验证结果如下图所示。0 U! T" K9 O/ G
. d& \0 l9 D4 }6 [* W/ P, N0 e- j
' Y w7 s. ]2 p8 @
) u) \3 r d" V4 w1 ]3 U6 i# S) D9 F0 V
程序代码
/ }( o% q% ^# u/ R8 k9 x# Q) L/ B% E1 P: e3 V. b. o& K
- //重定向printf()到串口发送和接收,方便应用
0 b, h$ v) e1 X( K# I m$ w2 n - int fputc(int ch, FILE *f){
9 g' u. a; T5 c @ - uint8_t temp[1] = {ch};* N$ G2 q& e3 z3 \/ t7 g
- HAL_UART_Transmit(&huart1, temp, 1, 0xffff);9 Z2 j* Q8 K) Y2 @; P
- return ch;) S, d" R, H8 q# A& e2 ~) _: k, ~( A5 C
- }7 W) K9 I: a9 A$ U+ }# Y/ i
- //重定向scanf()函数和getchar()函数,方便应用
& B5 g( h, m$ w. b& G8 U - int fgetc(FILE * f)) I- ?( {) Q. N- L7 M
- {" [' ?$ E" a( A" [$ j; z# @+ S
- uint8_t ch = 0;/ a' n R/ N! O" u& X, x
- HAL_UART_Receive(&huart1,&ch, 1, 0xffff);2 j+ F! U0 `) x* m) Y* x1 W% [
- return ch;: @+ d- i2 B) w9 [
- }6 i H0 X s/ t; G% ^! _) {- s
- 3 j3 c7 G9 h! m1 P4 g& O+ M. x
- /**7 `& u0 f' H0 ^0 Y9 _( G
- * @brief The application entry point./ ~; H- K4 S( H# Q7 k
- * @retval int
0 T9 o" j o5 z" { - */
4 o) R* Y1 G* |' G3 ?9 t - int main(void)2 c2 Z9 i% i+ x0 d( `, y
- {
( X5 ^' X4 u5 n+ `5 g9 ]" @ - /* MCU Configuration--------------------------------------------------------*/
! w, z' I: C7 D" w - 2 ?2 g; e6 i4 L/ @
- /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
6 H/ ^/ l) }' |( q6 ~3 z; {. m - HAL_Init();, p6 m u! \' X% O
- 6 n! f4 ]5 T( ?' x6 l
- /* USER CODE BEGIN Init */
9 D8 w1 u& S3 U - % e5 }' A6 S( n0 X9 {% ^/ w- q
- /* USER CODE END Init */
3 W3 I4 b5 }3 a+ e' k - 0 I6 ]0 ]. ~3 ?4 i& f
- /* Configure the system clock */
& d, y0 V' d; S' U - SystemClock_Config();9 f' @3 ^# m$ a4 H1 S
I- y, T4 O0 ^- /* USER CODE BEGIN SysInit */
$ @+ S9 ]9 x5 Q
4 y+ I" q; \( J) e& ^- /* USER CODE END SysInit */
( ]7 [$ o! b& A8 z! l - & X1 w# D( a4 Q: w
- /* Initialize all configured peripherals */7 e2 D# f9 k/ s" x, t
- MX_GPIO_Init();
% O% j% M' ~& D N" z - MX_USART1_UART_Init();5 J! D5 q% w; J) }6 a) l
- /* USER CODE BEGIN 2 */
7 S% ?9 [$ x2 z
/ ]8 x4 K' L3 d# a0 R- /* USER CODE END 2 */& Q ~% F: _; q, D) n1 `' e
- $ ~& F: T: w: k0 N5 X6 S
- /* Infinite loop */
( ^- X" p* F" b+ X4 K1 f6 M) W - /* USER CODE BEGIN WHILE */5 Z2 [4 @: F, ? h% I' Q0 _
- printf("Hello World\n");
# E0 i. M* D2 G9 ?$ H) T - while(1)( }- l! ?: |. ^& y
- {
, W4 L) t) {+ i$ l - * h# a! @, x. t/ v4 @. n9 n
- /* USER CODE BEGIN 3 */# E' ^( O8 z3 ], ~
- }' c0 g7 O5 [2 X$ i
- /* USER CODE END 3 */( {3 n) H2 u" v% s- W
- }
复制代码
$ C+ s7 B) c. _" S8 c, {作者:jxjajl bilibili
3 |2 t! v- s, T+ l" }- n4 D3 W: Y
3 ?" ]9 n( ]3 |2 _' K% h& c% A
3 v1 Q; e1 U, k- P |