这个实验向我们演示,不同的串口使用printf函数来输出对应的信息。默认printf()函数使用usart1,剩下usart2~4分别使用USART2_printf(),USART3_printf(),USART4_printf()输出信息。
3 i' g. B* ^$ r6 T: T4 d" l$ ^2 m$ F; ^, B6 P7 y
新建工程: S; X( G) i( t, ?6 M+ Z8 x
1、新建芯片工程"g071c8/g071rb",打开SWD调试接口、HSE
9 a; _7 j# }9 Z! p9 p& \
. ?: O8 }2 n4 t# e2 O' B; g( x" | H, F) s( h
4 b0 x; l. Y6 o( A* h
8 k+ @4 A. Y1 U, A0 D9 q
) @% M; V0 O0 U2、 设置时钟树,HCLK=64MHz
' C5 b# ~4 h0 T+ F! R& U% {1 G2 q1 L9 ~
. \- X3 U: z5 l, N
& `3 f* A2 f, H2 _9 _! d& D I3、 查看数据手册,看那些引脚可以用作usart1、usart2、usart3、usart4。把这些引脚设置成TX,RX- Z4 x, a! ]4 p( a/ A! p) }2 [
' I* c0 B: C/ L
USART1 A10,PA9。USART2 A2,PA3。USART3 B10,PB11。USART4 A0,PA1
7 ?9 F3 a( o9 n( J
! |; [: q* N3 r3 Y
1 N2 C1 N. C% P8 R9 I1 o, a
! \ l6 Q. d N9 \2 R5 d4、启用USART外设,参数按照自己的实际来填。模式设为Asynchronous,115200,8bit,None,1( Q! |# o/ q& {: | v
; f7 v. ]* [% ]& A6 z# g$ n8 l
; V" u1 P: n# p: F) j( Z
/ ~/ |8 ~: m: w. z+ q8 x+ Q5、 项目管理填好信息。生成代码"GENERATE CODE"
' f2 s8 y! x& j0 a: k& W. A6 R" w* u' H) D, m# Z
3 |( }/ Q2 R0 i( G X6 z0 Q( ~* B& y% X
4 d, Q7 S- L% @( c$ R
L& X. R3 h* U- s/ n* e8 F% c6、使用MDK打开工程,debug选项中勾上“Reset and Run”% k) J+ W8 O) a7 P0 F
% z) q; h& v5 n8 e3 {. X% Q4 |
代码部分% I' G6 n& h4 M$ Z& G+ R! l; _
1、usart.h中添加如下代码+ a/ `2 D( p0 H9 c- | d
. x0 d# F, j- N5 r
- #include <stdarg.h>
! b( U3 }* _. \: G6 X" o
# g3 p5 ]; P& S& h* H9 w u. R- /* USER CODE BEGIN Prototypes *// y, e: P6 M2 ^9 G8 {. F
# B4 U6 C' `2 \/ k2 m5 W' e- m- void USART4_printf(char *fmt,...); //重写usart4的printf函数7 Y; Z3 K) {% o; d' B5 y9 c% S
- void USART3_printf(char *fmt,...);
' U- R0 _& |5 _5 e; f5 e - void USART2_printf(char *fmt,...);% p; B& j- X B- Q& K
- ) P* h$ f0 S5 ?5 c; ]; S
- /* USER CODE END Prototypes */
复制代码 ; `: i0 J& `& l+ [+ e
2、usart.c添加如下代码
* L/ X; ]6 `1 {/ K! e, Z- [) I+ a& `1 ^# u3 _8 P
- /* USER CODE BEGIN 0 */; u5 j1 `$ }% h z) I8 W% A/ ?8 I
) I' G- k0 k2 q( ~& ?; k7 T- #include <stdio.h>
. B% Q- n+ m: s - #include <string.h>
3 e. E- I& z" M, \ W - #ifdef __GNUC__7 `( [2 S G8 E6 N. b
- /* With GCC/RAISONANCE, small printf (option LD Linker->Libraries->Small printf! q0 l s$ C! N4 d3 V* j
- set to 'Yes') calls __io_putchar() */0 ~5 y% T$ w1 D+ N- z: ^7 {$ Y: U
- #define PUTCHAR_PROTOTYPE int __io_putchar(int ch)2 X, Q* m1 T, ^0 X% } c* ?9 e
- #else- l; ?- N( `4 i, b
- #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f). A& l+ z! A! R1 T+ ]0 l8 M/ o
- #endif /* __GNUC__ */
* v& z& T- L k; ^; {. | - /**
5 l, f) [! U5 b - * @brief Retargets the C library printf function to the USART.
1 J: P1 p* U1 G: G8 R. c1 Y. \ - * @param None$ y0 l; d0 G6 B& h* t$ p+ x9 M
- * @retval None* n; r/ V4 v7 }" j
- */% i8 o& H" S& t8 t' z5 c
- PUTCHAR_PROTOTYPE6 t5 B- U% s. k0 j$ m
- {- {, _6 \- F# G, i- s, O
- /* Place your implementation of fputc here */
9 j$ N3 e5 [* w [; @+ \ - /* e.g. write a character to the EVAL_COM1 and Loop until the end of transmission */6 s* m+ g; C; x: e& ^' f& e4 r! n6 {0 g
- HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xFFFF);: \' Y$ g* g4 S2 y
- return ch;- X. H) t* b2 B# n! w$ ]$ u a& H
- }
& |3 [+ |( p( S% V - : o" |; ^" u; b- r
- #define USART_TXBUFF_SIZE 256 //定义串口发送缓冲区大小 256字节
6 D G3 d6 w/ O7 V2 J3 b - __align(8) char usart_txBuff[USART_TXBUFF_SIZE]; //字节对齐缓冲区0 d7 e7 ], y) A; z8 a: Q
- 5 _" a6 W" j3 l
- //usart4的printf()3 \* i! U: @ c* y& \/ @1 r
- void USART4_printf(char *fmt,...)
" X% N% X% t& ~; s3 Z; W; L - {, L6 k! h& d+ h* r7 ~5 r3 k
- uint32_t i,length;9 F( |8 m8 A* a- n+ F
- va_list ap;
& j1 h8 E& A) E) n - va_start(ap,fmt);
3 l0 M5 Q. ?+ b" } - vsprintf(usart_txBuff,fmt,ap);
+ _. t; ~8 d' t) }" X7 P - va_end(ap);5 F/ f# `2 K2 L; p( B, `9 y
- length=strlen((const char*)usart_txBuff);
3 u# t' X2 t+ M* f, j/ [ - while((USART4->ISR&0x40)==0);
9 j# r! i) {$ V2 T# q9 a, V: H$ S - for(i=0;i<length;i++): l2 T6 @; ]' M
- {$ S( D1 q/ d/ Q1 ]/ d: U+ A1 r! j
- USART4->TDR=usart_txBuff<i>;
+ k# F0 \% f" x6 l. c* O' c - </i>while((USART4->ISR&0x40)==0);6 d& Q% m( N' n/ Q& G0 z
- }
$ R/ y* l6 b5 ~: H9 s/ W) r% g; O% ` - }+ x' ]- p3 x: @, }5 S2 Q, |
G% h1 D( _! S+ R7 [% O- //usart3的printf()
. g1 w5 Y! ^, h, J" F - void USART3_printf(char *fmt,...)
( b" T+ ~ g6 e - {
/ N% j# L) L! U; }7 h1 x( I - uint32_t i,length;
( I, t- \/ s' n6 L9 e" B0 [% w - va_list ap;
/ b& q3 w9 C7 z) B3 n) e - va_start(ap,fmt);
2 D5 Z' h$ R+ o1 [ - vsprintf(usart_txBuff,fmt,ap);# a/ G8 U4 d% h" [/ c
- va_end(ap);
% k( b+ q9 [) s9 t - length=strlen((const char*)usart_txBuff);1 q5 ?* L& A. ~9 F+ i; x
- while((USART3->ISR&0x40)==0);( ^) O3 S# i0 ~. N+ n, C/ ^. `- y
- for(i=0;i<length;i++)( W3 o+ G& C* ]9 R- B2 l; g
- {
2 J3 K6 B- ~# n - USART3->TDR=usart_txBuff;/ m# y* j; [( J n9 u3 G
- while((USART3->ISR&0x40)==0);
$ H4 W8 H# b9 H% B' V6 p - }; q! \ m. V& @* |
- }
5 Y9 D3 i# e6 I$ x% U. z7 F( v8 C - + Z4 ]( M6 I! t3 T$ a
- //usart2的printf(). ]2 x6 {4 t% K% g8 {
- void USART2_printf(char *fmt,...)! H8 Q2 @% o8 U$ p% v& J% r
- {# E' e3 F$ p- _4 g( X
- uint32_t i,length;4 C; G5 t7 L+ I- d- }
- va_list ap;
+ ~+ A) s7 C+ y0 N - va_start(ap,fmt);2 Q8 K! p7 A/ L6 }+ `7 a0 c
- vsprintf(usart_txBuff,fmt,ap);/ g$ g# B6 U8 n0 P2 ]5 e( N
- va_end(ap);0 C3 k( L$ p$ F& ~) T
- length=strlen((const char*)usart_txBuff);
$ Q$ I9 h# T9 {! R& o, C - while((USART2->ISR&0x40)==0); x3 R8 O- X% L5 o$ ~) r4 e
- for(i=0;i<length;i++)4 `6 E& h9 F4 j8 z/ B% t7 [
- {5 c4 Y! h% ?2 N$ Y
- USART2->TDR=usart_txBuff;
6 `2 O& g8 B- q, Z - while((USART2->ISR&0x40)==0);
. e) L5 b' Q# v6 u4 W; L) f - }
( _7 j/ \9 p: l - }
6 x& L! B! i2 u1 ?" g - ( h+ H5 R5 D& K. I' `
- /* USER CODE END 0 */
复制代码
3 t r9 C3 T7 l5 R) j& m3、main.c中添加如下代码 @ k0 B/ J' C
9 P/ m! m- g. L( N% `
/- * USER CODE BEGIN Includes */# ^& R( y* q' I3 i1 u8 c3 a
- #include <stdio.h>
' R3 h7 p1 b! p7 d K: G( [* s% R - /* USER CODE END Includes */' d! g4 B( B: S; p
6 m' j, y$ R/ z9 H# ]- int main(void)/ l$ S9 T7 I) D0 u7 s5 H5 l, b
- {- K4 h. R, z/ {, J; a9 C) e
- while (1)
+ Q/ z7 `+ V2 { - {2 X( j% ^% S4 R) Q& S# h9 u2 x$ _
- /* USER CODE END WHILE */
$ v2 k p2 d' ~# r* G, c4 O - % R1 w: v- V0 z" E2 P' y1 o
- /* USER CODE BEGIN 3 */2 U1 a8 q- p9 d) @) f7 _9 V
- HAL_Delay(1000);
9 P4 e, a. D% [# p! ?7 ] -
, c% o7 A! }, u - USART4_printf("This is the signal from serial port 4.\r\n");
3 u3 r* u8 h' M: i - USART3_printf("This is the signal from serial port 3.\r\n");
/ X- I9 u: X# ^% T( ~ e2 X+ T - USART2_printf("This is the signal from serial port 2.\r\n");; w$ D7 Z) C( ^/ S) f# k
- printf("This is the signal from serial port 1.\r\n"); 3 O ?6 E+ }' q& ], V
- }7 d/ U7 d+ |' `" u( O3 K! t; H
- /* USER CODE END 3 */
# b& p% C! |" d& D1 R/ _& w8 Q1 M - }
复制代码 1 m; h5 Z- H, }# p; |2 R2 a& Z
4、最后编译,烧录固件,串口输出如图- i" g, _; U* A
& q* X1 E' q2 T5 @) I3 Y" ~6 g
- u2 ]9 Z: ^$ g. m) n3 T. `# s: V% ^3 P$ Z, c
|
学习学习