这个实验向我们演示,不同的串口使用printf函数来输出对应的信息。默认printf()函数使用usart1,剩下usart2~4分别使用USART2_printf(),USART3_printf(),USART4_printf()输出信息。 L5 L7 E$ G. X6 Z8 h1 c* ]! k
1 b1 m [' N& Z% l3 m
新建工程$ B& Q! }- D5 Q2 d. y! i. ]7 |' J8 R
1、新建芯片工程"g071c8/g071rb",打开SWD调试接口、HSE
7 ]/ e) Y- t2 h. K: ~# X3 D( N5 W% Z2 N2 Y
8 G: F0 |' x3 ^% v% Y( W5 u0 w! P9 b3 s' q- _1 h
) g$ X$ Y) @9 M: z
: h7 P- W, b Y8 ]2、 设置时钟树,HCLK=64MHz
# \, U/ k" O# ^) [
( k/ ^2 Z; h5 V E4 @8 |; B Y( W
/ U* e4 }+ D/ R* p& x$ A' s6 A. E
3、 查看数据手册,看那些引脚可以用作usart1、usart2、usart3、usart4。把这些引脚设置成TX,RX/ ~3 X4 C- c+ {0 z: Q4 I) C8 Y) _
0 k, o7 H: `7 J% o6 B) `. uUSART1A10,PA9。USART2A2,PA3。USART3B10,PB11。USART4A0,PA1% p8 _7 q1 `0 Q1 v) A! k
0 x" R# k1 ] X$ J* J
' j$ D& A- ]( I
: V! }* ?) Q% t( {. b' D
4、启用USART外设,参数按照自己的实际来填。模式设为Asynchronous,115200,8bit,None,1
( z @0 X4 Z$ e2 D& _+ g+ Q3 H- I% h3 h5 ^ b
. N& ?% K) e: K
$ O6 a$ W# r x5、 项目管理填好信息。生成代码"GENERATE CODE"2 N+ K! p4 N' g. @1 C
; ^/ k$ b+ ~* Y8 z" s( T
; P( H6 d$ b+ G8 ^7 w9 R" Q
( }/ y) E! `& p: S
2 c# e5 g9 K l
& [' \5 ?- l1 e9 M! ~6、使用MDK打开工程,debug选项中勾上“Reset and Run”5 U7 V& T2 G8 n+ F$ E6 j9 n& h
7 Z5 O% w0 B. ^8 r3 X! f8 n代码部分
8 v+ i+ F0 o( z7 p1、usart.h中添加如下代码4 G9 q) k& \3 q: ^: I
5 F8 `+ r$ u; |
- #include <stdarg.h>- V( t) N: g" |) B B
- : I- M& T# M5 p) `% ^2 Z
- /* USER CODE BEGIN Prototypes */
, a. `) n( R3 b) o - $ s6 d; ~! i- \) n# P
- void USART4_printf(char *fmt,...); //重写usart4的printf函数
: m" l* W7 ^$ j) `6 v$ F1 \ - void USART3_printf(char *fmt,...);
4 n% I4 D2 m# y# a- }- W - void USART2_printf(char *fmt,...);7 W; N0 o p8 q) b
- 9 {5 c# Y8 t0 w. |8 t
- /* USER CODE END Prototypes */
复制代码
2 o: F# z% [& a0 U% p2、usart.c添加如下代码
2 T/ T. p" J) t" g3 Z6 R
: U" `9 B% U0 S7 j# [& E" M- /* USER CODE BEGIN 0 */
' c4 y1 F* Y3 s% @3 J+ H0 y$ R - ! G1 g% S$ _8 d( F5 f) c
- #include <stdio.h>
. D/ h0 p" M7 o - #include <string.h>+ m, w4 r/ D3 d& \" Y3 ]
- #ifdef __GNUC__" t( A2 l. m. e
- /* With GCC/RAISONANCE, small printf (option LD Linker->Libraries->Small printf
; I' u- x I0 n& `8 X - set to 'Yes') calls __io_putchar() */4 v8 H. h' m* O4 l
- #define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
$ _9 Z& I1 w! X8 n, L - #else" i2 P3 w! Y# ?6 t( e/ A* G3 X. A
- #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
" S* O6 p- ~7 n4 y2 A - #endif /* __GNUC__ */7 ^* w1 C7 T4 X6 t* }4 D3 w7 z
- /**; p, D Q+ `3 d8 f5 R
- * @brief Retargets the C library printf function to the USART.
; [; u9 @1 Z% v1 X - * @param None, e$ t) |& `# r; S
- * @retval None3 h0 h- \$ k2 {) J( y5 z& d# m
- */
4 n& N, A2 ^6 w c - PUTCHAR_PROTOTYPE
5 J5 a! `4 \( H! ] - {
2 J8 Y" n+ ]4 Z; I - /* Place your implementation of fputc here */' w! y1 N0 W$ ?2 D G
- /* e.g. write a character to the EVAL_COM1 and Loop until the end of transmission */
* P8 |( e0 h% ]% O& ?1 S) W - HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xFFFF);
8 J. W, ]3 L- b- j3 O5 n - return ch;
+ l3 L! ^, y) \, w - }' _% _- D* S5 k8 n% S5 W) h
+ d/ ~' A4 v6 M$ d* q/ }/ ]0 ^- #define USART_TXBUFF_SIZE 256 //定义串口发送缓冲区大小 256字节1 N5 k# P' |, `0 m
- __align(8) char usart_txBuff[USART_TXBUFF_SIZE]; //字节对齐缓冲区' ^2 i8 U& ?5 ~0 _9 a
- , D1 ~% a3 O- ^9 _& R9 r- ^, T8 M1 L
- //usart4的printf()
. H1 Y9 ~9 S y1 G2 e) ^8 Q% M - void USART4_printf(char *fmt,...)# Z5 A0 D% w6 D
- {
. e, ]- O e+ ]/ E/ w w, V - uint32_t i,length;0 u9 W+ K8 j7 ]1 s H9 X% p, U, j
- va_list ap;$ V/ ^( J8 Y `0 V; \
- va_start(ap,fmt);
/ ?# W9 i0 L* K$ m: I - vsprintf(usart_txBuff,fmt,ap);5 r6 Y/ n0 u4 `6 f6 w) O& @/ [
- va_end(ap);0 q/ a; x3 u' L
- length=strlen((const char*)usart_txBuff);; `# H0 n, t, H
- while((USART4->ISR&0x40)==0);3 r' {# ^* m" F' A% H4 I; J. O
- for(i=0;i<length;i++)7 _" H' |# L% D4 W7 c
- {
& O% u2 S1 e: Z$ @) j; E - USART4->TDR=usart_txBuff<i>;5 S8 D. e2 {: |1 G% b$ D
- </i>while((USART4->ISR&0x40)==0);
) v$ T; ^ c+ Z0 H- S - }! c7 s+ ^, W" U3 s1 D6 d6 r
- }' G1 n( x; U! _' C0 p* x
- # `2 Y }$ |# k1 }8 }
- //usart3的printf()3 ]3 G) O5 b1 m. n
- void USART3_printf(char *fmt,...)
2 p$ o1 \& \& w( d - {
( e( @0 y5 `$ x# O! I+ ^5 V) ]5 v) r" A - uint32_t i,length;
% B) m! D+ [5 ^9 G/ }) X - va_list ap;( h" b; [; @6 _+ k+ S
- va_start(ap,fmt); e# g( w: k& C
- vsprintf(usart_txBuff,fmt,ap);3 B: w0 m9 N+ N9 s/ x
- va_end(ap);
! [5 J" X1 t( n& S. {" s2 R - length=strlen((const char*)usart_txBuff); p1 B/ o* @% [
- while((USART3->ISR&0x40)==0);
3 }& ?. f2 `2 l) v ^: L- _ - for(i=0;i<length;i++)
) s4 ?7 c; U! U5 l' U+ k( } - {
& _0 N$ l+ e+ O3 h9 O7 [0 A - USART3->TDR=usart_txBuff;" D- G; ~& I, y3 n1 h) D" \
- while((USART3->ISR&0x40)==0);" z5 ?# x7 ~) D: R1 X0 i
- }
& r+ o6 y. b# b& M4 e9 d - }
3 d7 t+ Q& m, U& F! C7 U a$ ~9 p
+ K5 t9 w! U; F4 ~( P, p# a4 P- //usart2的printf()
6 W0 M( s( V5 L( ?/ A% b+ j8 [ r - void USART2_printf(char *fmt,...)
3 D1 C( N! V E$ v - {
+ M. N! b C Q - uint32_t i,length;
4 Z0 i, ~ W1 W7 i9 c# O9 r" G) V8 H( ? - va_list ap;1 k; M8 b8 f9 j4 K5 w3 ~
- va_start(ap,fmt);
; k5 @* P+ n' E. Q! C o9 y- n - vsprintf(usart_txBuff,fmt,ap);
% Z8 O& p% f+ Z9 O( O - va_end(ap); G% u p' f+ }4 b: _7 S
- length=strlen((const char*)usart_txBuff);
/ J8 u( C7 `; Y, H& X! { - while((USART2->ISR&0x40)==0);( W' {4 n i0 c, x. h* Z. C! @9 E
- for(i=0;i<length;i++)! p, X- Q: B( b. Y+ B$ A. [1 q
- {( b( d* V) o" _9 a; h, h4 |6 M) [
- USART2->TDR=usart_txBuff;. e: P: P x) b0 s& s
- while((USART2->ISR&0x40)==0);& v& A G; v0 P1 U
- }
$ F% l/ ]0 T6 ?0 H+ o - }
]( X3 }' I# V8 b9 q
& Y- c/ J3 L, V# F- /* USER CODE END 0 */
复制代码 5 M* H4 v( E8 P" ?# f2 W( r
3、main.c中添加如下代码- r8 r# Q6 a& a5 o
; [+ Z) Q2 ?) ~2 R/ j
/- * USER CODE BEGIN Includes */
. v N) F1 A& R7 Z: x* W; n* u - #include <stdio.h>; i* H5 g4 L: R9 d. Z" q+ Q7 k3 x
- /* USER CODE END Includes */2 n* D0 v7 Q; o Y
4 x' S! H' @0 K. N8 V5 G2 M- int main(void)
) m# L! A$ M) F - {5 O V* P1 {( ?' y2 V
- while (1)$ {! |; f) U# O* f
- {
; Y) r# @1 y) A! w - /* USER CODE END WHILE */' e* C& `/ @0 i8 M" i
- ; P6 T2 A8 B, B8 {& R
- /* USER CODE BEGIN 3 */
$ i+ Q% a- H1 C9 } - HAL_Delay(1000);
- s& A7 C+ Y! e2 a: K -
8 v2 \9 h- A5 x, N! b - USART4_printf("This is the signal from serial port 4.\r\n");
$ _% Q% K0 p7 f4 i- j - USART3_printf("This is the signal from serial port 3.\r\n");
& L5 X4 O" ?8 r8 W* g7 B - USART2_printf("This is the signal from serial port 2.\r\n");
. [8 m" a- L- Q* @# Z% m - printf("This is the signal from serial port 1.\r\n");
4 _$ ~- E+ I3 Q1 S - }
$ I, M% s, a8 R6 k" l - /* USER CODE END 3 */
; u" }: f, a" w3 ~6 | - }
复制代码
! e h1 F0 O! H, c2 f" l+ h4、最后编译,烧录固件,串口输出如图- d; B8 I s. m: @
8 @, |- ?7 R/ u3 r" Y; Q# `
0 w6 i' J* b% w8 Q. R/ ]; a9 m
2 e" I0 ~. d1 C) B; J# z
|
学习学习