这个实验向我们演示,不同的串口使用printf函数来输出对应的信息。默认printf()函数使用usart1,剩下usart2~4分别使用USART2_printf(),USART3_printf(),USART4_printf()输出信息。 k0 [ I) L+ i3 F
, {4 h& S7 o: V7 x# |' r新建工程
) x0 ]( h+ h {2 O% O3 b! ?1 f8 l1、新建芯片工程"g071c8/g071rb",打开SWD调试接口、HSE& y* s" K0 v( h4 ]5 L
: } G, B; ]( Y5 W# h9 b, v
3 G7 m/ x5 D# I; g: I' Z7 ^4 o6 d2 y1 T8 b) g
( w/ O) i) [& T& ~& R1 f) H0 J% B
# l8 ?- i' v* i+ p$ t' G2、 设置时钟树,HCLK=64MHz
+ A. T1 K) x" b: J1 r4 m2 r+ |$ D
" y. u3 o# K3 Z; y4 r; B# o
8 p$ P5 B, W* _( s
, I" a4 J# }* Q$ z& U# d7 h/ v3、 查看数据手册,看那些引脚可以用作usart1、usart2、usart3、usart4。把这些引脚设置成TX,RX, _" G+ G0 ^; \/ V7 \6 Y
# }( l0 b# e2 s1 c9 H/ m6 Z& x% TUSART1 A10,PA9。USART2 A2,PA3。USART3 B10,PB11。USART4 A0,PA11 R0 ^6 [" w6 u+ A6 O A
/ q0 A0 W$ m2 Z! X) R; T) Z: R7 U9 W, Z u1 g
% y1 v' z$ @4 {4 i. t! R4、启用USART外设,参数按照自己的实际来填。模式设为Asynchronous,115200,8bit,None,1" h2 p5 Y s' K) e. Y4 m
; F1 m. @4 {5 D) D, f+ k
0 M/ \- J1 f t2 X1 ?) }$ N
9 O5 z3 T& _ N+ e, y3 F$ H5、 项目管理填好信息。生成代码"GENERATE CODE"# ?( T2 V% G* J
$ O2 m6 P9 K/ ]) t
9 ^/ c" T9 o9 N! Z6 y/ F; }! D3 j- _$ `6 P3 N" r7 B
- k" Y, \$ M) `. `2 m' d3 F
' Q+ r6 J; e" X( ~
6、使用MDK打开工程,debug选项中勾上“Reset and Run”
: F7 D8 g8 P" t1 w
6 m" r& Y& m; A2 p4 c* t/ @代码部分8 p( t. r2 |9 D& |3 ]# ^
1、usart.h中添加如下代码
3 Q- k$ x: f) |. Z6 S1 s0 \3 p" t$ u/ ]) K- B+ I7 {# E
- #include <stdarg.h>
; R; `' g4 D0 y/ o& _ - . ? r+ [; q' M! H" ?; `8 T& D
- /* USER CODE BEGIN Prototypes */
. C% f8 F- C& v9 Y% P; w1 ]# [ - 4 X& ^- M* W" s+ @% f- ?
- void USART4_printf(char *fmt,...); //重写usart4的printf函数3 D, a' d# [% p
- void USART3_printf(char *fmt,...);# r4 z' p. Y+ O: ?
- void USART2_printf(char *fmt,...);
! _3 {9 s; v2 w. r2 c+ j% `8 r- J - 1 c% R$ N& P! g& y
- /* USER CODE END Prototypes */
复制代码 ) n/ @" S! ]) L- O- n; i
2、usart.c添加如下代码9 {7 N" m8 h' P; k( T# f. Q! ]$ y% A
1 K) i7 G$ G+ \1 ^3 g
- /* USER CODE BEGIN 0 */8 \; } x! C0 |& [
# `1 r; d% p* ?/ q5 u; G9 g- #include <stdio.h>
: Q) J: M( ~7 i) D& c - #include <string.h>: p) I1 t4 m( c/ T/ q0 H4 ?
- #ifdef __GNUC__6 p8 l% z( m' {7 c0 q6 f4 \
- /* With GCC/RAISONANCE, small printf (option LD Linker->Libraries->Small printf
# |, ?! c7 r8 c! `' M% i9 } - set to 'Yes') calls __io_putchar() */ M' X- ~' C2 l M" N6 Z: P
- #define PUTCHAR_PROTOTYPE int __io_putchar(int ch). @0 o3 o. n( P2 t, l1 d* n
- #else i$ [' |, i; T. H
- #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
. U! r0 M9 U$ W& o - #endif /* __GNUC__ */
: d* W4 I) y4 H t8 R8 T( @ - /**6 p# ?& T+ p4 E4 J
- * @brief Retargets the C library printf function to the USART.
: k7 B& x5 {+ ^7 S' W$ T! D - * @param None
. \3 A9 P w; w, o9 D, U1 ] - * @retval None' I7 O2 C( v( j! c+ k5 X$ f ^
- */. f% t% W1 Y9 A _1 Q0 a; y
- PUTCHAR_PROTOTYPE
% M4 w: L# w) Z+ Y$ n4 p2 D1 w6 a - {
2 m1 l+ r9 I6 q: s! n" P - /* Place your implementation of fputc here */+ g7 T4 \2 g3 [& I9 ~5 l+ X5 P& k1 ^! F
- /* e.g. write a character to the EVAL_COM1 and Loop until the end of transmission */; N% z+ d& s$ {) \1 ^# W
- HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xFFFF);! E$ e2 R& ]! h. D8 @# u
- return ch;
, f& V- u* ^, o - }
/ |- l. l0 I# o. y" }4 p - & S4 e' f7 ~& H% _; H
- #define USART_TXBUFF_SIZE 256 //定义串口发送缓冲区大小 256字节
. v1 n4 G, M- w& s9 @ - __align(8) char usart_txBuff[USART_TXBUFF_SIZE]; //字节对齐缓冲区7 N: ?8 }3 _9 n
- ' D" {" t% G- W+ J6 y0 r; Z& x
- //usart4的printf() Q4 V; Q) T1 G s! O2 G
- void USART4_printf(char *fmt,...)! W2 ?% o+ `. b8 }2 L1 q9 K7 l) k2 u
- {, f( r# ?& i1 J9 A+ ~
- uint32_t i,length;' Z- T8 G/ k3 Q @8 L0 n
- va_list ap;0 q$ A; G5 Y* M, J
- va_start(ap,fmt);
4 q% H2 n: R$ o$ S- S* F. @1 I& X - vsprintf(usart_txBuff,fmt,ap);
|! `4 n r( P. P; w, ^ - va_end(ap);
m: Q' ]2 ?6 v - length=strlen((const char*)usart_txBuff);7 y' @+ u4 M4 l5 z
- while((USART4->ISR&0x40)==0);
B' c; }- ]5 S2 C3 R/ s - for(i=0;i<length;i++)
, s2 H9 K% d \* ` - {
7 W) S. i6 ^. q& v& c7 G - USART4->TDR=usart_txBuff<i>;
6 E3 o9 t7 X& a& z- i! C - </i>while((USART4->ISR&0x40)==0);
9 F- q3 f4 q0 }4 h" ` - }
( X$ w7 P" O- x+ L' L - }/ K0 t; }7 H. l
. J: e# i/ }. t* ?3 p& n- //usart3的printf()
. h4 B- p1 y9 U9 Z6 C3 B2 m - void USART3_printf(char *fmt,...)# ~: w! j8 x6 q, O
- {
1 z4 G& o7 t% M+ d, @& k8 ^3 s - uint32_t i,length;
' B& x. e2 h% |- a {/ i3 c2 {2 Z - va_list ap;3 U x: O- g8 }' M
- va_start(ap,fmt); d4 t e' [! O1 l( j* D2 J3 P# ?% M2 Y
- vsprintf(usart_txBuff,fmt,ap);; D0 s5 k. g0 w2 O0 I
- va_end(ap);
4 u8 d$ ^' n9 I ^) V. y - length=strlen((const char*)usart_txBuff);
( r- J' j( J9 }* Q) x - while((USART3->ISR&0x40)==0);& [+ k0 h/ ?6 `$ y" S' g
- for(i=0;i<length;i++)
3 Y; J1 t2 O5 `3 ] - {; ~- N1 O: {" M1 e
- USART3->TDR=usart_txBuff;! X: r" d0 o0 I- r; f$ O" r: q* X
- while((USART3->ISR&0x40)==0);
1 ]: h$ k/ w' j- d8 Q$ G7 i - }
9 ~% G- K- P5 E0 @+ k: N! `( K - }
4 n! i+ C6 O& R& o - 8 w* ~1 s }1 o9 u/ s) l, s
- //usart2的printf()6 E( E# c! g) v
- void USART2_printf(char *fmt,...)2 A) Q4 s7 u! m1 D! V# ?
- {( P- R" B% \9 y9 }7 I) j
- uint32_t i,length;
; S' i/ m! q/ g, t3 r+ b+ ~ - va_list ap;
! {5 ~. y, Q( s2 j7 m7 f$ B - va_start(ap,fmt);( P: S: G% F, g' K9 {
- vsprintf(usart_txBuff,fmt,ap);; {% ~; s8 b. r+ A$ h2 _
- va_end(ap);; i7 Q! I5 A* S" r% {2 `4 m- f' Y V
- length=strlen((const char*)usart_txBuff);, c2 V9 {. s, j0 F( [* ^5 ^: a4 u
- while((USART2->ISR&0x40)==0);
$ m8 i: I& Q* |0 }! N) E6 [' H - for(i=0;i<length;i++)
6 R" P6 j+ h) a" l. i - {6 Z& F: O1 |! S; V
- USART2->TDR=usart_txBuff;0 [ b: b* _- t3 }
- while((USART2->ISR&0x40)==0);+ V+ S9 n7 D6 g2 X d2 `2 O3 j
- }$ P! a9 I2 G% s; c) x
- }
2 Q+ N- f! @* p% v( R2 `1 B
1 W9 F& D# {, U8 q& `- /* USER CODE END 0 */
复制代码
+ k5 }- z3 x" A$ X/ R3、main.c中添加如下代码
, x& q' q' t/ L/ U; g# y* O8 E7 `" H s! q, ~3 ^! z; w# V$ Y
/- * USER CODE BEGIN Includes */
) N+ {1 \, k3 ?* x - #include <stdio.h>; o: T; l; v R
- /* USER CODE END Includes *// ~* |* G K" d+ i& |$ {
- 7 u/ Z9 O& v8 |
- int main(void)7 Q4 A$ c* L3 a( Q; `* x. X g
- {+ Z1 b( q' B" I; H8 ^
- while (1)
0 \, N1 u# t% s+ l. w# m - {
0 O5 K: j# J( H4 `) D5 K: S - /* USER CODE END WHILE */: u% o; Y% u8 y
, I' Z! @. ~; R Z; F1 |" k# {3 B- /* USER CODE BEGIN 3 */' J8 E. u9 b# x- D; g
- HAL_Delay(1000);7 u3 v, `5 l# X- P5 L# k* z- u3 H
- ( G: D% j7 x; k) i9 _5 |, i
- USART4_printf("This is the signal from serial port 4.\r\n");6 q% f+ s) R+ R5 Y0 l% |+ W
- USART3_printf("This is the signal from serial port 3.\r\n");
, }8 s" p! v- s: ]% j% O) L0 F9 F. E - USART2_printf("This is the signal from serial port 2.\r\n");& g- }1 u5 K. Y/ A# ]9 B l) }
- printf("This is the signal from serial port 1.\r\n");
2 z3 B+ _0 Y& M+ P/ Z' D' l; q: I3 K - }% d& [; |5 @5 Q! T! N5 ^
- /* USER CODE END 3 */
. p. O+ \+ U4 o - }
复制代码
7 d7 Y( o" x4 U( \' Y; @) h4、最后编译,烧录固件,串口输出如图
2 R! i$ A D; Q" n" d- L% b/ O8 ~) k: ~: V6 e8 e
3 J& D) ]* G) _& g8 Y' U
6 F5 h) B( V2 j* B |
学习学习