这个实验向我们演示,不同的串口使用printf函数来输出对应的信息。默认printf()函数使用usart1,剩下usart2~4分别使用USART2_printf(),USART3_printf(),USART4_printf()输出信息。
% ~8 z4 L. h5 H1 l' m6 T n: g0 t3 e- j( F/ c% `& G
新建工程+ u* x' P" P8 b7 _ P9 S6 s
1、新建芯片工程"g071c8/g071rb",打开SWD调试接口、HSE
6 O+ \; Q+ I7 |9 _0 j; ~ m- f7 t$ f( u
9 o3 L1 J4 t7 B! P
: L5 w4 x' q% @/ N, u' c
, J/ @+ D5 Y. c2 X7 }2 g. k5 N3 j( ?; E% e/ C( x+ G
2、 设置时钟树,HCLK=64MHz) k4 A0 C( d2 d7 }. f
# n5 E5 W9 x$ z0 A! O9 I# W8 C4 J
q: p3 F4 j4 `% \$ X( C# m
$ u1 b- b9 b) K5 n- I! X3、 查看数据手册,看那些引脚可以用作usart1、usart2、usart3、usart4。把这些引脚设置成TX,RX
, y! x- t2 @% H) X( U3 h$ x6 p9 n& ]4 A- p; q3 s& w, E s
USART1 A10,PA9。USART2 A2,PA3。USART3 B10,PB11。USART4 A0,PA1. H! H' c& h, \( N, ^# a
* E% o1 C% F+ V- r, l0 q5 f
U% z: q8 G. K% J
0 x+ _! `" C2 ]8 y6 K
4、启用USART外设,参数按照自己的实际来填。模式设为Asynchronous,115200,8bit,None,1, a1 X; E$ B; i3 S' \& ]7 J9 t' S
- ^8 i6 y( O9 `: M5 Y
& ~4 ?# T+ i. S
& H4 T* U, U: @8 T/ y
5、 项目管理填好信息。生成代码"GENERATE CODE"" b7 m0 g0 \0 }1 R1 z
0 H4 a# H$ J9 ~+ L. t& S9 a; g* c: T) Y( A5 ~2 g/ c4 q y' E. `
1 T' ~' [: ^* p: O! X9 M' `
, K4 c% ?3 M" j9 a! r7 P0 l$ ?2 u7 H' @8 f- p$ v
6、使用MDK打开工程,debug选项中勾上“Reset and Run”. Q1 p3 J `% x' e
a+ \' H, ^" a* H7 {8 w% g
代码部分
2 M, F" g3 j% z: Y, O. A1、usart.h中添加如下代码. \, L* G2 o: ^8 O" P2 e
6 `. g9 o: ]; a. Y, N% d
- #include <stdarg.h>7 R' I9 D7 W0 e* [% m
, T- N2 i+ m( r2 N$ k. P0 O- /* USER CODE BEGIN Prototypes */# [! i3 J# c! s1 C/ x( @
- - C7 X) ]- a( V
- void USART4_printf(char *fmt,...); //重写usart4的printf函数1 R5 i! ` F' p ]1 ?* c" m# F
- void USART3_printf(char *fmt,...);
' j2 \- ^6 c. m- I @ - void USART2_printf(char *fmt,...);: L; C' S7 X' t8 t3 G3 S! f
5 }3 I% U2 G( W- /* USER CODE END Prototypes */
复制代码
( E0 ?8 |6 d q" N( V( R2、usart.c添加如下代码
6 G. t: u$ J; a9 q8 a2 h7 d
5 [$ ?0 X) B4 J% K) X9 U- /* USER CODE BEGIN 0 */4 k: R) d; `; x" J
) k; n s1 s, ?) Y- #include <stdio.h>7 f9 C: L) L: U8 U& E
- #include <string.h>) c8 N; h% h& M4 \
- #ifdef __GNUC__
2 ]# P8 c$ _1 V0 k: ^8 @ - /* With GCC/RAISONANCE, small printf (option LD Linker->Libraries->Small printf
7 q% J7 J6 q& n, G1 T) Y2 p - set to 'Yes') calls __io_putchar() */% B# m: n N4 C7 O
- #define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
3 L; U( [4 u3 G - #else$ g) J0 m8 u& r% m5 f0 y9 n3 N
- #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
5 y6 ?$ R, p: o - #endif /* __GNUC__ */& T# d; y9 w Z$ x" C
- /**
1 i0 V" Q/ P1 v/ \# U; K - * @brief Retargets the C library printf function to the USART.
; O7 L6 T4 q. C+ E - * @param None
, R! S4 S( q/ [8 H) ~ - * @retval None
$ z u9 R }$ G5 G. C$ h: r - */$ S6 V, M* p7 T8 T B
- PUTCHAR_PROTOTYPE& [9 T- f+ O$ N; r
- {
' @. C( A& V! A3 e6 a+ O1 r, | - /* Place your implementation of fputc here */9 J2 O# P3 r& g" A
- /* e.g. write a character to the EVAL_COM1 and Loop until the end of transmission */6 R* h8 h/ h, [; w: p) ]
- HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xFFFF);* ^# q8 w9 K; V( E6 W. e) F, O& g
- return ch;
6 S( Z! F; v: p* y& w/ H, } - }
& g% q2 I; {- g8 Z - 4 K) s/ j$ b0 h3 g+ N
- #define USART_TXBUFF_SIZE 256 //定义串口发送缓冲区大小 256字节, B) s9 P: Z0 P. b, i. a7 z
- __align(8) char usart_txBuff[USART_TXBUFF_SIZE]; //字节对齐缓冲区9 v5 m/ }! Q6 z F1 @% P! m, f- I
- . h9 v9 e. y3 G/ W
- //usart4的printf(): X& b: M, Q" H8 F' S- f
- void USART4_printf(char *fmt,...)
4 H7 a8 Q5 W6 m% \' { - {
6 r0 x- }& @3 w8 o3 [ - uint32_t i,length;% m! Q* R! r! o
- va_list ap;
0 S" {: l. B; V5 l: C - va_start(ap,fmt); n% t1 n' P2 d
- vsprintf(usart_txBuff,fmt,ap);
) y' l9 ?. b* ]8 q - va_end(ap);
" g4 Y* Y V) a% B( c3 h [ - length=strlen((const char*)usart_txBuff);8 q8 y2 a& C1 f' j
- while((USART4->ISR&0x40)==0);! z, L2 b; B4 T- @
- for(i=0;i<length;i++)2 u/ ^9 c0 L/ @6 i0 e9 p
- {
9 g+ }/ e+ B* G+ ` - USART4->TDR=usart_txBuff<i>;' S; P( T' ^& z4 {' t
- </i>while((USART4->ISR&0x40)==0);# y& [# y M7 s7 V K; Y
- }$ F& s$ z* C7 t5 q7 s/ a
- }* A3 u6 k9 w, Q- P# Z4 f/ [: D$ K
- ( [* b1 @0 l) K% U
- //usart3的printf()
9 P$ P/ a( p6 B% H% j! _ - void USART3_printf(char *fmt,...)4 F" A* J0 b/ l* T& i& H
- {' |" ~! Z; E- F, T* F
- uint32_t i,length;
/ ~ l+ ^5 ~# l; |7 l - va_list ap;% x( M( W) I2 k+ m
- va_start(ap,fmt);9 [9 t6 B+ t: A! w
- vsprintf(usart_txBuff,fmt,ap);& Y, ?1 h0 W- r& p
- va_end(ap);( y5 S; d1 J& T2 t, |% b* v- @
- length=strlen((const char*)usart_txBuff);
1 z n: w. A2 N) h# V) w - while((USART3->ISR&0x40)==0);
. u! u0 h% o2 u6 N1 p# L h7 a - for(i=0;i<length;i++)' x; l }% S: N3 ^9 C2 ^
- {' W1 z" e' O1 G P
- USART3->TDR=usart_txBuff;) f% g" m* K1 B1 ^7 O
- while((USART3->ISR&0x40)==0);# d6 L. h) |8 [, d* Y2 C& j# N3 [
- }+ z0 b S C7 W9 R- l" ^) L/ N- f0 Y
- }/ b- o# n2 i* ]" @
- # {6 v- l, ?4 b! F% E
- //usart2的printf()# g) h2 o' i5 G. E8 ~7 n8 {
- void USART2_printf(char *fmt,...), Z Z# _: ~+ l8 b3 H1 m* |
- {
8 d; D& p! K3 \ - uint32_t i,length;8 P- e C( `: l
- va_list ap;
' o; F+ I0 R0 j - va_start(ap,fmt);
' \% M0 C# ]% y - vsprintf(usart_txBuff,fmt,ap); ?! [4 y" b8 V. [) i( q
- va_end(ap);
& M7 E2 h7 h- a - length=strlen((const char*)usart_txBuff);; g: U! \1 u: h) }2 v* V
- while((USART2->ISR&0x40)==0);6 H, `+ d) }* B: f u% F
- for(i=0;i<length;i++)7 |) y: a1 D F; |2 E' r5 F
- {# M& S1 @' `, P% y: {% H- }1 ^
- USART2->TDR=usart_txBuff;
9 @) I, J; q# }& N4 M8 X7 @8 p - while((USART2->ISR&0x40)==0);
4 a8 m; v3 Z/ o1 M - }
6 u7 v3 G4 W& ~3 F+ E, C9 ~ - }
" o- I4 K k. [) P7 A
& X5 e2 U' B7 f) D, P0 }' K, L. `- /* USER CODE END 0 */
复制代码 9 b, n8 H! D) O+ V# ?+ u( r
3、main.c中添加如下代码
9 v+ `# _/ D# i% A$ d3 p0 t2 n G5 f3 O! S8 G0 n5 l( J
/- * USER CODE BEGIN Includes */
% r8 v/ n' ~& i' W+ C$ M. r - #include <stdio.h>
+ V: v% l# Z f5 V& ^ `# _# `, r3 l - /* USER CODE END Includes */
* W, X8 d, O) P$ p; f! S
! x8 c( l" p" e# y1 K/ b1 O- int main(void)5 k2 ^4 j, h n# ~8 e
- {# B6 k6 w( Y8 @4 W% T' s1 ?. C1 S8 S
- while (1)
/ C3 |4 b) G2 N4 K4 K& V: \ - {
( @8 V4 {, X/ U2 w/ g# b - /* USER CODE END WHILE */- _ [* |& z7 j, B
- % X' X# T- v: U& \
- /* USER CODE BEGIN 3 */+ d0 _3 Y; l5 C. N% O
- HAL_Delay(1000);4 ]' s0 a0 U T/ Q$ v5 k! }; }
-
0 N* F* M. P. A% F - USART4_printf("This is the signal from serial port 4.\r\n");
$ e5 x" W; m$ e4 a6 b - USART3_printf("This is the signal from serial port 3.\r\n");
/ X; b- k. `7 ]6 ?8 Q6 I8 z - USART2_printf("This is the signal from serial port 2.\r\n");8 D0 w/ Q6 ^- L2 B6 S' a. I
- printf("This is the signal from serial port 1.\r\n");
! X f0 r% n" p - }
( z m8 F V. E$ {( w6 i' U - /* USER CODE END 3 */" E3 k; W- D, T2 m; o) p0 t
- }
复制代码 6 u& i/ B. s. C* L
4、最后编译,烧录固件,串口输出如图
! M0 K& R& J3 b3 D: v/ c4 H5 h; d, i; F/ \1 I
/ d6 b2 [( s6 |' g# v3 g. K* T, o; I% ?8 R, V3 i1 x; J6 V5 S
|
学习学习