项目简介3 W9 B0 o3 X3 \1 @+ {# I3 V
利用CubMX生成基于32单片机的HAl库工程,然后编写程序在proteus上仿真验证。本项目最适合没有开发板的同学学习,零成本利用仿真软件率先入门STM32单片机。这是第三部分针对串口通信的一个实例,虚拟串口其实只是计算机以软件的方式模拟串口通信的功能,可以基本等同于实际的串口。本文主要用于对STM32串口通信的理解。4 \6 I# W3 ?2 {2 b8 u( d0 a
0 s5 k# \( `" r# t硬件模块
6 d: F: m$ a" V( H( D3 U8 D @ STM32F103R43 j0 k) B6 ~0 u7 r, g
串口模块
* U& ]- ]7 w. I, N$ {, ~) h1 o
软件工具
6 r( S) ?6 a4 t. G7 B CubMX
" x* A3 R7 J i Proteus
) _- m& o! U' P( V: E KEIL
' l9 @8 c% x6 {' }/ Z
( y- ^; g( O2 k电路连接图/ g' s" E! M9 ?' J8 q! J8 K! J
STM32F103R4
: T2 K- G+ V+ T+ Z
0 A9 M8 Y2 x% W9 h7 |5 _
, T2 n( k5 m8 \6 g1 f- w8 K
$ j( a: f7 O& P
串口模块
) J% ~5 ^, c, F) P- L7 I8 j4 I, J; k1 E+ \0 R
( s9 C1 b8 p2 d* z r0 E" U + V3 L$ b) F9 h9 y; w! d# Q, [5 R
工作流程. e: s9 s" J4 `8 H4 l6 }% G
首先是下载相应的虚拟串口,这里下载的是Virtual Serial Port Driver软件。
& c/ L X2 `1 T; ~7 c( S0 W2 o/ g# V4 K7 ]/ p ^
: t1 {7 ~0 b7 L+ z
[6 v% ]( q/ J7 W" T& Z 安装好后,其使用期限是14天,后续超过这个期限重新安装即可。其使用方法也很简单,使用的时候点击“Add pair”即可,这里是已经Add了COM1和COM2之后的情况,需要注意的是用完这个虚拟串口之后记得点击“Delate All”否则会一直占用。
6 [- w+ w3 s7 g; \
* F, O3 N' y1 i6 N
% `" }/ Y% b4 T) ?
2 H2 J2 B+ Y9 H7 H# R6 | 然后创建CubMX工程,首先设置好串口 9 ]% j% w0 @: P, ^
5 O% _7 C) C+ ]& k3 p
% a) K, P+ K" M9 a
+ n( k- l3 A/ K; m 在CubMX中配置好串口中断。7 X. o* c& q7 Q/ W6 m$ r9 w0 C
[) u$ @: b( N: P9 G
( F% s/ e1 y4 {, I3 U, X0 {4 b
7 d6 J4 z) _$ s3 q+ H 然后就是在生成的KEIL工程里面编写相应的程序啦。这部分在“程序代码”标题中有。
: P6 Y3 i( D. h$ ~) G7 _0 h* A5 Q. ~, x/ Y9 B4 x" W4 F; A% P
最后就是在Proteus和串口调试助手上验证啦,验证结果如下图所示。% P! _' y1 @0 y! Q( J5 ?! i
6 |, E6 v# O- V8 o2 ^8 [" X/ Z
# L2 m2 N! I: _8 k: {$ s
! O m2 H" W/ |4 t
程序代码
: k% m, d; ~' l O& K% |- //重定向printf()到串口发送和接收,方便应用; @5 o5 W- J' o2 F. J
- int fputc(int ch, FILE *f){
7 k% K# J- L' K: T/ c. p+ j5 @% M - uint8_t temp[1] = {ch};
+ u6 F! ]; S, S% m - HAL_UART_Transmit(&huart1, temp, 1, 0xffff);
6 h9 h( ~ \/ j( r; X - return ch;! ]# X3 S! t+ p! V; h
- }
3 |2 ~+ A' P5 `' N - //重定向scanf()函数和getchar()函数,方便应用# n0 C. u0 P5 \! ~& |
- int fgetc(FILE * f)% |9 e, i/ i, Q1 T
- {: _9 `) q2 w% W! w9 @
- uint8_t ch = 0;
, z. a4 \ K6 t9 Y: i* p' d - HAL_UART_Receive(&huart1,&ch, 1, 0xffff);8 L6 n. n4 I8 W! D
- return ch;; v, i1 G5 t5 e/ t3 {% l( r
- }1 d- M' [2 o2 J. ?8 n
- ; o9 q. b8 D' o1 a6 K: d
- /**& {# P" E$ j6 P# B; Q7 H- v
- * @brief The application entry point.' t! o) f \" u' X# W& i$ L$ v% [! c
- * @retval int
, h& S: _- C( S6 G! ] - */: g+ h+ E8 B! `" m: G$ s- s# q
- int main(void)
2 ~, b5 g6 V# A0 @ c$ A) i! C8 f& m - {
# e3 I+ v& ?! r* w - /* MCU Configuration--------------------------------------------------------*/
, H, \$ n& |, p' Q2 j$ M' e4 E
. L6 r9 A. x P( t- ~; B- /* Reset of all peripherals, Initializes the Flash interface and the Systick. */4 r+ E- q/ B8 m( t
- HAL_Init();
% h7 y+ D g/ l4 Z, g# @ - . ^3 b" S1 b V5 c. ]. y, R# a
- /* USER CODE BEGIN Init */
1 \0 ?. B+ W2 M) e3 Y( L
0 i6 n1 U# _) X, t! H; @( A T8 H- /* USER CODE END Init */
' m& @. s$ `& p/ @ n( C! f
4 Y s% k' y. a1 E& U- /* Configure the system clock */
" L( I# k0 K }1 z8 P+ Q" ] - SystemClock_Config();
, T3 b6 N9 |9 ~; [8 ~7 i9 g
$ A5 `; g* J. Q8 [- /* USER CODE BEGIN SysInit */
8 c! a$ O$ g3 H$ }9 F2 U( z" t
) R& p& T9 a8 y3 J# N, ?- /* USER CODE END SysInit */
" {$ d% j0 v/ q1 [ - ) g' g' Y3 b8 B4 U' h9 _7 {/ K
- /* Initialize all configured peripherals */+ U$ r- x; M, k( Z
- MX_GPIO_Init();
( K0 @- v2 }8 m% A - MX_USART1_UART_Init();
2 g' n7 `! f+ h% b; T- j3 ?4 ]. u - /* USER CODE BEGIN 2 */
/ W# S$ W. X5 _2 B9 A9 {# g! ] - 3 }. T7 c9 o9 v" b, p" X. w- V: O
- /* USER CODE END 2 */: R4 A% ^* @7 ]0 z4 i6 O
- B+ R1 l* v: e# G- /* Infinite loop */
& w3 x( \+ I: O" [5 z% D - /* USER CODE BEGIN WHILE */
0 `2 E% n( M6 w( Z0 W - printf("Hello World\n");
: J+ l V0 m b# O - while(1), ~1 @! a& a {# d
- {6 d- ~9 a( D+ w0 O% J3 ]/ I
- 1 [) T* ?5 [/ B
- /* USER CODE BEGIN 3 */
7 n$ F6 n9 Y6 p: O% I9 k - }
1 o1 ]. q; ?3 t: V7 h) a4 Q - /* USER CODE END 3 */) j- w% i3 \, H: f; W( Z6 |3 D
- }
复制代码
+ ^ n0 o' s" a6 X( M& X转载自:jxjajl
C7 d; R5 n' g4 c5 v& u0 X
$ f% s( G0 v/ W3 w1 N& F |