这个实验向我们演示,不同的串口使用printf函数来输出对应的信息。默认printf()函数使用usart1,剩下usart2~4分别使用USART2_printf(),USART3_printf(),USART4_printf()输出信息。9 e s0 Z' c! B7 M1 Y
( b5 u+ h8 T) |8 {( z新建工程3 L# Z! a$ M1 \3 m( c
1、新建芯片工程"g071c8/g071rb",打开SWD调试接口、HSE
' d, Q) x' f! F! _. o
- \3 Y+ \% H$ c6 G: s& A$ d1 B$ W2 C, t8 D9 W" x/ u4 [0 C# K
: A+ j$ b \7 B$ v J( N* ^$ N
+ ^' M7 J6 B9 w
' v4 d4 R, c! x+ }. |3 w2、 设置时钟树,HCLK=64MHz
, t5 v% y' n; E5 ?5 B" C- r8 T) D) H
3 I; n( J, S+ g; k7 [* Q) a9 ?
, k1 O9 B- V' l' _4 ^
3、 查看数据手册,看那些引脚可以用作usart1、usart2、usart3、usart4。把这些引脚设置成TX,RX
8 E2 M! g! {; w7 S# H$ R& e D5 w9 ^$ z; B
USART1 A10,PA9。USART2 A2,PA3。USART3 B10,PB11。USART4 A0,PA1
* i8 J x, f# U: c) b
! I* N6 {, ^3 A1 w: S" p! o: O c) G* R7 Q q8 h* F/ o2 Q8 q/ x
: m. P! s1 C: I n6 j
4、启用USART外设,参数按照自己的实际来填。模式设为Asynchronous,115200,8bit,None,1; Y6 p+ y4 I$ G" r+ o/ t) a
8 e1 l3 i7 ^$ N0 v3 j5 ?* e2 {2 y5 A
+ g. h6 w0 ]; y( ?/ ~' @* k9 g, `' |! }
5、 项目管理填好信息。生成代码"GENERATE CODE"3 k! J- P, r3 I9 E
4 b" \7 w* V5 A4 w
' Q8 J5 U8 f6 z+ f& i
7 \, b$ H; K5 F9 k1 P
) I z" R* x* q" h8 V" }0 t# u
) Q# \, ]! ~, ^; u( ^6、使用MDK打开工程,debug选项中勾上“Reset and Run”5 `( v, l8 v4 X7 Y! Q
% d, q/ E1 W/ z1 z, E代码部分+ o0 M4 W: ^1 V& `4 ^* E; K0 E
1、usart.h中添加如下代码 f7 z8 w8 c/ }% B6 E
3 E: y9 @5 S7 w' R% G& h5 W
- #include <stdarg.h>
& a+ T0 u" V- ]+ d2 i
4 n: x) w7 U% `9 |8 k; F% a- /* USER CODE BEGIN Prototypes */
H4 [! r) u( Y. S - $ F5 {4 j% U, d% B
- void USART4_printf(char *fmt,...); //重写usart4的printf函数* d/ H4 Y+ O8 b# H( s
- void USART3_printf(char *fmt,...);
( b( L0 }- \2 F+ y/ {1 r) G0 J z- W - void USART2_printf(char *fmt,...);% G3 V) M+ }( t' n, I" R0 s" A
- : W! ~1 S7 I* H' z6 a2 g: W
- /* USER CODE END Prototypes */
复制代码 4 x& w. z4 `1 [$ P/ `
2、usart.c添加如下代码
" G+ Z* } K; i( r: Y
& R- O5 v+ C7 s0 t- /* USER CODE BEGIN 0 */8 E3 e! v( [$ v4 C Y# `& J
3 U. p4 b0 Q4 a# R9 ~% x; L/ `- #include <stdio.h>
$ K& o& B. g$ _ A+ H5 c - #include <string.h>
5 h- d- x: G, K+ O: J6 g - #ifdef __GNUC__5 e5 \# y- h! H! e2 _/ R- e, Y
- /* With GCC/RAISONANCE, small printf (option LD Linker->Libraries->Small printf
5 Q6 Z7 p2 k I) | - set to 'Yes') calls __io_putchar() */3 s1 ]. E& _8 {! E/ R- n
- #define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
2 A6 s% |! w, X( g - #else
2 a: Y2 [' j/ ~9 l$ x - #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
* B( A7 S u; o) S Q& ~, E$ f - #endif /* __GNUC__ */5 B, c- m6 P( B7 q+ N& |
- /**
" g) B% L. p6 X- p& t, x - * @brief Retargets the C library printf function to the USART.( K s v# p% X
- * @param None
# f7 p3 `3 r" e* A - * @retval None
6 U) |% D& w" ^' s# E% b - */! b+ k+ M' J" [, @
- PUTCHAR_PROTOTYPE
( b) b' `7 l/ A" F S% E" s - {
/ r$ b- Q4 b; z3 a: { - /* Place your implementation of fputc here */
1 _% _; F3 D8 V1 N5 ~! \ - /* e.g. write a character to the EVAL_COM1 and Loop until the end of transmission */* P' @9 e' j& p p# x
- HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xFFFF);
3 l* S' h& _# m( C - return ch;
/ n% D4 Q( |, D( N+ _: Z4 w( Z - }! r x* \1 Z5 V3 q
- ' b6 ~ d5 n4 W) J* n( f) ^- z. V
- #define USART_TXBUFF_SIZE 256 //定义串口发送缓冲区大小 256字节 D, ^( @- |1 Z E0 X
- __align(8) char usart_txBuff[USART_TXBUFF_SIZE]; //字节对齐缓冲区
# }1 |2 h% }5 i/ w- M3 a; B - " m- k, V& q+ G" d5 X
- //usart4的printf()
3 J+ }/ c6 }. @7 `8 [ - void USART4_printf(char *fmt,...)
' s; b5 m) P) s4 J% Z3 J - {
+ I3 p; Q/ ^) O" ? - uint32_t i,length;
1 h4 d, I" G- |. i - va_list ap;
/ x: C) a% X/ [$ }0 g y4 Z - va_start(ap,fmt);
3 n" e! C& R; @0 e: A( d/ I# B - vsprintf(usart_txBuff,fmt,ap);
- J7 |+ P1 k7 j3 c5 I# R. P$ ?8 {% F - va_end(ap);& v, f0 A" x, `5 _! U& p, t" [9 W
- length=strlen((const char*)usart_txBuff);
B9 O S5 o* C# S; T/ O! \ - while((USART4->ISR&0x40)==0);
6 I# W8 X: M7 W, n. p/ w# W/ \ - for(i=0;i<length;i++)* T- `( w) ^% t3 L9 B3 d$ N: A5 C
- {
1 z0 C+ X& n! b7 W! L6 C7 q - USART4->TDR=usart_txBuff<i>;
) o* F2 Q9 w9 m# @9 P+ B - </i>while((USART4->ISR&0x40)==0); U0 B9 {: V9 Z( O& y; N) P
- }6 b K7 Y- ?; d
- }: V0 P1 n" j0 Z! a4 G1 S
- 6 j$ b: U A. O- I" n, G
- //usart3的printf()3 D: t% Y3 [0 b" `0 b) S
- void USART3_printf(char *fmt,...)/ z) I8 U* W' @/ V+ D
- {
+ u8 A' v/ M3 x/ G/ P( ~! O - uint32_t i,length;; e/ E1 o2 |* T3 Y& M! ^/ x6 ^
- va_list ap;
: k0 \: V. O: c; z5 S - va_start(ap,fmt);2 x3 s2 v$ V; H9 ^+ r) n' Y
- vsprintf(usart_txBuff,fmt,ap);
5 x! h2 a# p( W4 L. K* |( ? - va_end(ap);; A& R/ h' ^: N. r: A
- length=strlen((const char*)usart_txBuff);
5 ~5 H+ _4 ~ ]9 [2 h! D$ t' v# T, j - while((USART3->ISR&0x40)==0);7 s0 _* q0 ^( {9 V- l" a3 {
- for(i=0;i<length;i++) ]- _2 Q2 X% I- a/ V
- {& Z" o9 V! m, O* o5 ~0 ?# p
- USART3->TDR=usart_txBuff;9 x& L$ a$ r7 T$ k6 ]8 C9 j; z
- while((USART3->ISR&0x40)==0);
7 a' B8 X) d7 [ - }# c/ V" A D/ r. y
- }1 }8 |: v. G4 x$ L: U0 m
# w# ?1 |% O& s5 q9 r7 C- //usart2的printf()
# g* l+ P5 _+ B8 I, {, h - void USART2_printf(char *fmt,...); H' h+ r* w$ Q: L- [
- {
$ m7 r% y/ U) n, \, A - uint32_t i,length;( ]: B: R, q1 O4 n
- va_list ap;9 t+ t* F3 X9 a0 n& s! J/ m
- va_start(ap,fmt);
7 E: Y) r* B2 C8 T: `+ D - vsprintf(usart_txBuff,fmt,ap);
2 f+ h" F: H% h) h1 P4 h - va_end(ap);* p( D0 m+ o5 ~
- length=strlen((const char*)usart_txBuff);
$ [' V* w1 q) w8 M' l - while((USART2->ISR&0x40)==0);" A; {6 j1 v- b3 T
- for(i=0;i<length;i++)
# `; j) a$ u2 B- J- @ - {) W' {! R/ B x: N5 \ P$ l! [
- USART2->TDR=usart_txBuff;
! H' t1 E9 O: V- [/ ? - while((USART2->ISR&0x40)==0);
" S I1 W) l+ S2 w - }, z+ `! ]9 E( L. k- S
- }
% L/ K' S( K3 d
# y9 U! U$ B$ I( @* p- /* USER CODE END 0 */
复制代码
9 J' P- C% Q. P" [5 {3、main.c中添加如下代码
1 J- c2 C" |0 ~$ m$ C# q7 p, C$ F8 K
/- * USER CODE BEGIN Includes */
J' T5 V' V: s( B+ o - #include <stdio.h>
3 n9 h4 r8 l2 D, m. [. H - /* USER CODE END Includes */
8 m6 B+ c& N" E: ~# d
z; A3 Y8 k" w" m6 {: z, ?) E- int main(void)& p+ [. q+ v. @. T0 E: k- \) M6 @1 ~4 h
- {
$ k. J3 |3 ~+ m& z+ v - while (1)
/ k4 x& |' v4 g' y/ ?: B2 q - {1 u! A; D c- m" L6 G/ n5 f( ]2 Z
- /* USER CODE END WHILE */8 U" s1 s- v- d+ h5 k3 D s2 u- c
- 9 h/ u; \* }/ n( S! [
- /* USER CODE BEGIN 3 */: ^5 a* k2 [+ k" G' P5 G/ [9 l: s; l
- HAL_Delay(1000);
7 _) W8 r' v6 I# z2 y B- e, S( q -
) B' Z$ Z0 t+ [1 v0 w% ^- k - USART4_printf("This is the signal from serial port 4.\r\n");
& i- b3 q( A- E0 F E - USART3_printf("This is the signal from serial port 3.\r\n");- Q7 i, M3 V! q' D; Y8 a! l
- USART2_printf("This is the signal from serial port 2.\r\n");
t1 p1 E) N5 k3 i - printf("This is the signal from serial port 1.\r\n"); 5 H- g" j1 ]: @- W( V: T" l! }
- }
* Y/ ]8 U" E& g' B% V - /* USER CODE END 3 */* p0 _) ]% r0 v3 D+ l1 U7 C
- }
复制代码
! a k) b3 h- Y4、最后编译,烧录固件,串口输出如图
/ A3 K( c9 i3 O% X& z, A4 e* t9 q% [) ~' z" B
) }% _% K) y; O% x
8 f7 H. \/ B% Q" O% f& y5 c# A |
学习学习