这个实验向我们演示,不同的串口使用printf函数来输出对应的信息。默认printf()函数使用usart1,剩下usart2~4分别使用USART2_printf(),USART3_printf(),USART4_printf()输出信息。
% H9 W) n9 {( n. c. L1 [0 m" N& ?6 z+ ^/ _) F
项目地址:GitHub
1 {/ o( V: T2 k
3 L% G6 {4 g; K. L+ R1 Z% d" ~新建工程
2 z- c, h. R- P7 q9 X: f% ^1、新建芯片工程"g071c8/g071rb",打开SWD调试接口、HSE; I7 g% |- O7 H H
: H! B! ?: M0 ~' b; _ v( s
# N/ t$ P/ e( B) o
1 O+ {# N+ w% h i6 l* s% N( f: f& f7 O/ T4 x
2、 设置时钟树,HCLK=64MHz
! {3 G0 V, G, @( X! `# b8 d9 x' ^3 e, z% {" [+ N- F
: J# Z$ Y! o: {: `' N; v) N! d! `1 V. r) ]+ b" {
3、 查看数据手册,看那些引脚可以用作usart1、usart2、usart3、usart4。把这些引脚设置成TX,RX
c3 i3 F Z2 \1 h6 j& q) B$ f4 G, g7 f9 Y0 P
USART1 A10,PA9。USART2 A2,PA3。USART3 B10,PB11。USART4 A0,PA1
; y8 T* Z+ f# D0 P! c6 ?- @* w
5 f. I3 M# d/ c5 |$ N0 e. q5 j9 Q% z
4、启用USART外设,参数按照自己的实际来填。模式设为Asynchronous,115200,8bit,None,1
, z" V) M# x* t2 I W, ?/ _& d
$ J' [: d" R1 K# K5 v
% a; I D+ t8 D# C, ~! Q
6 [+ {4 n9 C/ d$ L+ E
5、 项目管理填好信息。生成代码"GENERATE CODE"
! ?) e+ S; H7 u# f% i4 B* Y
+ F$ B' G! S v% D5 z* `
: q2 v+ h8 C* H$ q6 \' t% E+ z; E4 _( C6 [
7 w: h* a7 _6 a `5 o/ n; ]$ y% n% D- y8 E) t
6、使用MDK打开工程,debug选项中勾上“Reset and Run” q9 R) ~: ^4 x5 e& Z1 J3 u
" h* b. T1 b J* L+ d+ X% v代码部分
" u( y5 t- S# D2 m0 D8 }3 v: X3 V# k1 R1、usart.h中添加如下代码
$ j' b! n% s! m+ V: y' B
8 ?0 ~* r2 _9 n/ J: q9 S$ w2 S- #include <stdarg.h>
9 I& f9 C% V$ E' A, ]3 n/ U k% n - ) a6 |$ h* k9 h( m
- /* USER CODE BEGIN Prototypes */; }; i9 Z5 y* D( [+ t" D6 `+ V% I$ d
f5 m9 d; F* k- void USART4_printf(char *fmt,...); //重写usart4的printf函数
" z; Q+ M) H8 U - void USART3_printf(char *fmt,...);! y, I o1 u7 g' ^- l5 J
- void USART2_printf(char *fmt,...);, l% L. v) I2 T( _ k# Z: m* e) c% P$ Z
- / q% s7 |2 S% L- @0 M
- /* USER CODE END Prototypes */
复制代码
% j5 s d0 K1 P8 X0 e" k0 L) m2、usart.c添加如下代码
a& O1 V' k! C3 ^
W2 J k5 B* ^1 ?3 }6 E) \/ e/ [- /* USER CODE BEGIN 0 */
3 w5 L9 p) F! i8 I4 r; a
! L3 W1 n9 }6 S. K- #include <stdio.h>
% o4 ~2 W+ E9 ]% } - #include <string.h>
5 ~% V3 x Z! s6 K4 X2 [) P - #ifdef __GNUC__5 p$ q( H" f Y( e- s3 I
- /* With GCC/RAISONANCE, small printf (option LD Linker->Libraries->Small printf
6 @8 L! z4 e. C9 h4 _. M - set to 'Yes') calls __io_putchar() */8 T0 v9 Q9 L `& W9 X; O5 E
- #define PUTCHAR_PROTOTYPE int __io_putchar(int ch)9 d% i7 u. z# f* A0 d
- #else; [9 H+ ^2 E5 n A+ O
- #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
. G* Q6 w/ p! I- N - #endif /* __GNUC__ */
' J) ]) y$ D; {& Z" I: G6 F+ q - /**
. h1 S+ A, _) V' |+ `+ f - * @brief Retargets the C library printf function to the USART.7 I% I) U& |4 j$ N
- * @param None
+ o# h. n% q4 V( g - * @retval None$ f5 {. ~# c7 i2 f6 Y. k
- */
3 o, ^' S4 {; \ _3 B - PUTCHAR_PROTOTYPE
5 }; A' v3 }* T( F/ t - {2 U, g3 d3 x0 \# c0 D/ S
- /* Place your implementation of fputc here */
/ j, v- m' @# g+ Z7 k - /* e.g. write a character to the EVAL_COM1 and Loop until the end of transmission */" y" Z' e% ~6 j. G
- HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xFFFF);
, X% d' ]' g7 C, K3 { - return ch;
' ?# W. @: B: r7 P! g1 A - }& R5 Q" q( }/ M9 e* Q
# K o8 G. j6 W6 }* Y" P- #define USART_TXBUFF_SIZE 256 //定义串口发送缓冲区大小 256字节
6 u, {2 _% ` _5 _9 {0 v - __align(8) char usart_txBuff[USART_TXBUFF_SIZE]; //字节对齐缓冲区 E, f4 F J: a5 j
! l9 h/ ^5 c# u9 @ ^- //usart4的printf(): s- s- B+ R1 a
- void USART4_printf(char *fmt,...)$ Y% }3 B5 m9 d8 `0 |
- {: j0 ~5 D: g! Y& l
- uint32_t i,length;
9 r/ J* J0 s( Y: j6 u - va_list ap;( }1 q" t1 e7 q9 t. G- R
- va_start(ap,fmt);
( ^% k2 K" {- c+ ? D3 G. X f - vsprintf(usart_txBuff,fmt,ap);/ ~; k5 ]( n! E1 o
- va_end(ap);
3 j+ j+ z' s0 o! { - length=strlen((const char*)usart_txBuff);4 E" o2 n. h- q$ y) u. l' e
- while((USART4->ISR&0x40)==0);7 e/ I, ~( P- r! e' [0 |
- for(i=0;i<length;i++)
; Z' C! }4 A; f- k7 q - {
$ ~* G* S" K& e; a/ ]0 a - USART4->TDR=usart_txBuff<i>;
3 z+ t9 l/ t( W5 M! C- n4 {+ Y - while((USART4->ISR&0x40)==0);7 @2 i7 b Z& T# F" {
- }$ T( p8 ^" D/ n7 {; _& \
- }
) D! c; i3 g: e' p! l8 w
. f& Q1 W( ~. Y. b+ U- //usart3的printf()
+ X. S4 W4 f3 \ q4 d* ` - void USART3_printf(char *fmt,...)+ w* o0 e+ S2 B$ T
- {
+ l" r# G( Z& m7 F3 q/ N) v - uint32_t i,length;9 F& M, z$ I! F: B$ V
- va_list ap;4 I. v4 F. t: C& L
- va_start(ap,fmt);
( h& R3 E! s& B5 P) G$ } - vsprintf(usart_txBuff,fmt,ap);
- l" W0 w8 a9 N' t r8 F2 K - va_end(ap);
1 W5 h3 X# E7 w) f( s) n - length=strlen((const char*)usart_txBuff);
; A3 L, H' U1 R" u5 @ - while((USART3->ISR&0x40)==0);
; y! N/ {3 W8 o5 d - for(i=0;i<length;i++)( |1 @6 m$ F2 c; Z, _' L# T# o/ J
- {
" A0 B, V" \" R- X: I - USART3->TDR=usart_txBuff<i>;
F3 }" C/ l4 `7 U- i" Z; W - while((USART3->ISR&0x40)==0);
9 |9 P6 q7 j, f, h - }$ o2 A' b) a7 H8 ?' a) k, E( ]
- }, n/ j* q/ {* r7 \
/ |" l/ x& h( q% H# B z- //usart2的printf()
+ ?1 ^. h" \3 X0 W$ ~6 U- `1 Z3 N - void USART2_printf(char *fmt,...)
9 A$ Q9 ~: n. o: E9 `+ ]0 W - {
* A' ]2 T: t: T8 M8 F% t - uint32_t i,length;
5 Y& d! \# g3 B R/ w" J& {& N; E - va_list ap;# }" f0 t$ c: ?4 O$ n6 M
- va_start(ap,fmt);
; r+ G3 J) [- Z% F" p5 F/ R - vsprintf(usart_txBuff,fmt,ap);- Y# X. p5 d5 z$ u
- va_end(ap);3 c8 G$ V! ^* N& k/ G; N
- length=strlen((const char*)usart_txBuff);. J" R3 J0 l4 d0 ]
- while((USART2->ISR&0x40)==0);
; P7 T& o# P1 T" p - for(i=0;i<length;i++)
! s4 S6 y _) N3 v( x5 h9 a4 v - {- A" \) ^( _$ T- Q$ N
- USART2->TDR=usart_txBuff<i>;
/ ]! Y2 x; I3 A ~ - while((USART2->ISR&0x40)==0);
. o* h; [) V/ S - }: p8 F$ L" U6 N( y. `8 K& n% U0 V& n
- }
2 ~: v; f( v" X1 z - ; ^; D5 f" a, `' Q: M) b
- /* USER CODE END 0 */</i></i></i>
复制代码 # V! N: r2 v( u4 |7 v# V& o
3、main.c中添加如下代码, ]5 e* _! M k- p9 T% T
, I; ~4 X$ O5 J. K5 g+ x; D B
- /* USER CODE BEGIN Includes */
, R; _9 h R- e6 k9 w' P - #include <stdio.h>
4 ~, }. ~8 m0 X: T4 w - /* USER CODE END Includes */9 h |9 T- r8 z/ R' o- o" r: n
! Y1 Z3 e/ y6 w3 P- Y' W- int main(void)7 Y7 C F( C9 _6 s# L
- { ^7 K' S( H- w6 N6 \
- while (1)
3 s& {- N3 o/ C& c8 N4 r - {' a7 q, B; f. r: C" t
- /* USER CODE END WHILE */3 @6 T- z( L& G' ?0 I+ R4 \
- 8 U, `: C+ ^- @0 a1 q6 F; H
- /* USER CODE BEGIN 3 */' r. B. a/ ~) q4 H8 q! D0 E( e7 S
- HAL_Delay(1000);
) T W& l, _& F7 B) B( f4 F8 W @, | -
2 y/ V' p' k- I( u- Y - USART4_printf("This is the signal from serial port 4.\r\n");5 c G" r' F' _( I! V7 d# |
- USART3_printf("This is the signal from serial port 3.\r\n");
6 M& B1 v& W" E7 @) Q - USART2_printf("This is the signal from serial port 2.\r\n");
+ r9 n2 O% \2 l. o# Z$ W - printf("This is the signal from serial port 1.\r\n"); * w* A9 K0 X% I, \- N
- }0 {" Q e7 G* e% Q+ V3 w/ d) U
- /* USER CODE END 3 */
- k9 L1 e7 e. Y" _( G# Q - }7 B) V! M5 V9 x1 J
复制代码
6 u4 W& u; k- a( D0 h' b; {3 z4、最后编译,烧录固件,串口输出如图
% N( { i' }$ w5 p X6 i V3 D3 e& ~* C0 j3 K" q* |
$ P( Q' T3 Y2 c/ W' i7 x
* f1 s. Y. ]* i) \
————————————————7 L% N+ N9 k* G0 r2 I2 |* _
版权声明:SCCELE
* j. h; E& T9 n& e l# y5 d+ s% w& N' N: Y/ K3 I" x5 n# y
. u. d- u2 v9 J) P: Q0 q; S |