这个实验向我们演示,不同的串口使用printf函数来输出对应的信息。默认printf()函数使用usart1,剩下usart2~4分别使用USART2_printf(),USART3_printf(),USART4_printf()输出信息。
% ?' y9 ?0 a3 o: ]" C0 m% g
/ L# |+ w1 C1 i2 F& @新建工程
: s x6 F7 A, m% Y( @# M1、新建芯片工程"g071c8/g071rb",打开SWD调试接口、HSE1 m+ ~4 n) R5 |* Q/ ^
' O$ I6 S9 r: R$ R# ^ ]- r- Z5 q" [) B- S/ |- S7 j* P
; W. i- G# t; k, N0 t$ U" i7 p; _7 F7 q$ W8 s B3 R
% t n( |* m: ~$ C2、 设置时钟树,HCLK=64MHz
! A9 A% K6 u/ Z8 w/ F$ h4 C' `- T1 J' E O/ F) U, N& a+ H
% ~3 X- N, W' p F
, G+ m0 Z; x$ c4 `6 m3、 查看数据手册,看那些引脚可以用作usart1、usart2、usart3、usart4。把这些引脚设置成TX,RX: H0 `% _9 W5 l0 [& S
% {" e1 i. W) O
USART1A10,PA9。USART2A2,PA3。USART3B10,PB11。USART4A0,PA1) q( R7 A' O: _ T5 q& W3 ?( z* q" [5 U
0 g; J1 Y$ m& N b; L
9 O. C8 k' L @ j. b5 C
$ X* x( Y/ r+ P4、启用USART外设,参数按照自己的实际来填。模式设为Asynchronous,115200,8bit,None,1
' q6 C9 b- |) p" K0 I! |( B* B* C7 e: I/ M- Q6 J
1 v) g: m# w2 h0 E: d) X
9 k6 \ {6 f0 Z7 F' R5、 项目管理填好信息。生成代码"GENERATE CODE"
1 J- R. \. `" L; B4 z `
3 R, K" A$ g* c( j0 x; N' M) [6 W4 k% D6 v
9 L( T& o% }# a8 e- p& `# c4 L% u: c" e$ e) A+ g
: h F+ o/ N8 h- ]
6、使用MDK打开工程,debug选项中勾上“Reset and Run”
1 e4 X9 W. b N1 H' t6 T. w6 Z) D2 b/ g; J! e" k: b/ r
代码部分
( |+ i- e+ T9 b8 g: t1、usart.h中添加如下代码
# n* M' o& z3 T( o a
5 |/ l" y0 a) s3 J- #include <stdarg.h>
, a4 ?: ~0 a. u. M
2 v+ o4 F T: z! f- \, ]* y- /* USER CODE BEGIN Prototypes */" W0 i B$ B+ u$ j s6 h( d1 s: t
" |5 R: l. c; g4 x- void USART4_printf(char *fmt,...); //重写usart4的printf函数
* K( d! {; V* p9 ` - void USART3_printf(char *fmt,...);
5 v* T! [* N" A1 | - void USART2_printf(char *fmt,...);6 G+ T2 g9 ~$ ~% F
- ( H1 ^8 F/ ~4 }7 M* ^
- /* USER CODE END Prototypes */
复制代码
1 @) P: A j; X3 D, j7 K$ f2、usart.c添加如下代码
' F4 u6 }# t' r- r1 x5 i I
1 d H* f0 e# Z- /* USER CODE BEGIN 0 */, _+ X+ ~1 a* ~3 d
3 [3 h6 A' X3 X5 N% Z: u/ h, T9 k8 d- #include <stdio.h>$ i- e3 a4 M0 u! h9 I# B- v8 j$ t
- #include <string.h>
5 L/ A8 u5 r9 |/ w- t } - #ifdef __GNUC__' J, p/ T* X Y+ e- h
- /* With GCC/RAISONANCE, small printf (option LD Linker->Libraries->Small printf
! D( x+ I1 M2 O - set to 'Yes') calls __io_putchar() */
* Q# L; l9 }1 [/ ^2 g; M; ?) B - #define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
: B2 G3 E2 T0 ^+ C, S" N - #else
! s A! x7 A6 u( Z( M# ~" |5 [+ t - #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)7 L+ ?! }3 h, R* V8 V6 z
- #endif /* __GNUC__ */$ {) w0 p! Y4 I
- /**; y; _: n8 B" G& O9 R1 S
- * @brief Retargets the C library printf function to the USART.
V* W7 v7 L$ I! b$ B( t - * @param None2 u) e- z( i$ R; q8 }
- * @retval None- b# e0 ]5 F$ b4 u- W
- */% n; k5 a2 U0 o* a4 J1 l2 P
- PUTCHAR_PROTOTYPE
+ w( O; n$ C( \1 F! G - {+ N4 c6 n8 j F+ x& s* L
- /* Place your implementation of fputc here */
2 R/ ]3 e6 m* i# t - /* e.g. write a character to the EVAL_COM1 and Loop until the end of transmission */9 z* X. S3 y# [. H O G& Z
- HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xFFFF);! }0 o$ H; E* g& B
- return ch;& U* r* v9 }4 i0 n
- }
% r9 G2 q% i! @; M' ?
+ g! U; G( k: A7 ~- #define USART_TXBUFF_SIZE 256 //定义串口发送缓冲区大小 256字节6 x! Y9 g* J+ w0 E+ w
- __align(8) char usart_txBuff[USART_TXBUFF_SIZE]; //字节对齐缓冲区
" }. ~6 i8 f4 ]* g - 9 U {6 l# V& w& K6 `" P: s
- //usart4的printf()
( l1 v2 c' I. O/ v# c1 @0 d' H - void USART4_printf(char *fmt,...)
Q6 h- T' n& Q# D - {
( R9 P+ ]+ `9 ~; D1 E' l1 M - uint32_t i,length;, o3 ^. Y% M5 `
- va_list ap;
: R- s4 L- W8 w5 d - va_start(ap,fmt);) X. C) K2 P: D5 v
- vsprintf(usart_txBuff,fmt,ap);( c2 X2 H; O9 K- j' z# C
- va_end(ap);# V8 u7 w0 T [# v5 }! o- Y8 L
- length=strlen((const char*)usart_txBuff);; ~. B8 A5 ?' G6 `
- while((USART4->ISR&0x40)==0);
- d5 D9 @/ q. m - for(i=0;i<length;i++)
$ Y0 B6 {, l' w y4 l - {$ {* n+ j5 J1 X5 @7 A( p% k% S8 n* ]8 @
- USART4->TDR=usart_txBuff<i>;4 c' ^& \- a1 c1 w/ B
- </i>while((USART4->ISR&0x40)==0);
6 s5 `2 Z; p0 p( U- L - }% Z* W: [% Z4 N* Z) d
- }
/ t7 e: N2 E* [0 E
, T$ X; I" Q* T* ^0 ^8 N: H- //usart3的printf(), ~2 l. l# |7 o% T
- void USART3_printf(char *fmt,...)
; Z8 L( J; A$ q4 O$ g - {0 A+ ^$ {+ `, p: J( j3 Q" U7 s
- uint32_t i,length;
) O M' W" M; S) H! ~0 k* w A. ^ - va_list ap;5 L1 a' u U( F# O
- va_start(ap,fmt);
; `% S1 Q5 u D5 X+ r3 G8 z" H - vsprintf(usart_txBuff,fmt,ap);, S% Z+ w8 y, |" v
- va_end(ap);7 q: w( c) m' z1 T. h* t3 o
- length=strlen((const char*)usart_txBuff);' B0 D3 }/ e3 X* Z' H/ U
- while((USART3->ISR&0x40)==0);
]/ a, \% y9 r" y7 o - for(i=0;i<length;i++)1 v/ j( [" g2 o: {) C1 h
- {- J8 h( G( N3 H& A; K6 t% R' O2 P
- USART3->TDR=usart_txBuff;
2 t& g7 n) f) e0 g3 J) Q& Z. w4 } - while((USART3->ISR&0x40)==0);- p- w2 v K2 {& v+ O1 D+ u4 k. ?! {
- }
- b b6 I. L. h* Z2 v& E - }
8 q5 _! d2 Z/ V" {
( S3 H! z, D: z: M" \- //usart2的printf()
. |, T! k1 Y o - void USART2_printf(char *fmt,...)2 }8 _, _- D9 R ?
- {+ t& ?: x/ e# c" y+ m, Y7 g
- uint32_t i,length;
0 E9 s4 ~( b; i6 x/ W - va_list ap;
, D8 R. l) E4 s- ^8 z - va_start(ap,fmt);
& Z( t, ^+ J5 D$ `' Y+ h - vsprintf(usart_txBuff,fmt,ap);
: m; T5 ?. }" R" w5 N4 y3 d" C - va_end(ap);1 a4 L' j, _- O3 t; a' V3 V
- length=strlen((const char*)usart_txBuff);
. z- [ r+ a7 n - while((USART2->ISR&0x40)==0);6 o. p7 T! m1 m5 T' @# N% V
- for(i=0;i<length;i++) n9 f) m: X# e0 `
- {8 R8 G9 @/ v5 P
- USART2->TDR=usart_txBuff;
, i r3 _) m8 \: _. p- i" G* U - while((USART2->ISR&0x40)==0);
) u5 Y Q8 ^' C6 u) V - }3 v+ h# r1 z7 t% I$ ] G9 }
- }' C& `# H, w- P
; R4 p$ g, y" V/ b$ W- /* USER CODE END 0 */
复制代码 1 p7 `/ s E/ h) Q4 a! B. u& V+ T
3、main.c中添加如下代码4 ~' l; C+ Q* L: O8 u4 o& a
0 p, e6 x4 K, \& D1 @; p/- * USER CODE BEGIN Includes */
( }0 y" t1 D! o+ S) t - #include <stdio.h>+ {' r/ F: u4 |$ \+ F3 S1 P8 `
- /* USER CODE END Includes */
6 K1 q. D% }( J5 f3 E+ P0 w - . ^; O1 s- R6 \& e7 u; i) w8 E
- int main(void)
( Z% `% y( A* `2 Q f - {
4 f' B- W2 Z; J. d! m1 p( z4 { - while (1)+ |4 D" T+ u3 k) v, K! b' H
- {
- d3 [4 q3 H, l- u& I' A4 E8 b, N - /* USER CODE END WHILE */$ A3 t+ v% I" O6 d) @
- ) g' t; @* O5 P
- /* USER CODE BEGIN 3 */+ Q. d2 j9 x! ?' N0 f
- HAL_Delay(1000);
2 q2 ~. v1 f& g7 ^7 c( ?4 Z - 0 P# Z' s _* k% Y- m( A
- USART4_printf("This is the signal from serial port 4.\r\n");7 c$ L( B5 p# x- h( s) U0 j% d$ A
- USART3_printf("This is the signal from serial port 3.\r\n");
: P% V: T) `: t% R* w/ z9 f e - USART2_printf("This is the signal from serial port 2.\r\n");' O3 d, k6 x2 b8 X" i# s2 N
- printf("This is the signal from serial port 1.\r\n");
& c# Z* C2 }% |7 v - }
* h+ Q6 `9 |& P' _. u0 X8 d5 E7 @ - /* USER CODE END 3 */
& Z& v1 [+ K, w A7 D. l - }
复制代码
" Q' x" N4 i! P3 x9 z" q0 p4、最后编译,烧录固件,串口输出如图
! V0 ?8 ]5 x$ [- E# g0 u' [" q7 j9 m N, }/ H+ i1 o
2 d+ i1 A6 n5 ]$ b# ^+ J% N
: T% e6 J5 i8 l3 l |
学习学习