这个实验向我们演示,不同的串口使用printf函数来输出对应的信息。默认printf()函数使用usart1,剩下usart2~4分别使用USART2_printf(),USART3_printf(),USART4_printf()输出信息。
f9 [5 ?# G) ~8 n6 i( K7 i
. a3 Y' W: r$ w( Z) i9 B0 t新建工程
8 a7 h f; U |0 Q; G! |1、新建芯片工程"g071c8/g071rb",打开SWD调试接口、HSE6 h* F+ ?9 R8 d3 B: E
" j' Y9 Y; |/ K! G9 P
# f. Q1 {1 T. ?0 ^/ r+ G
1 C: a; ` E( N/ u: Y
; O( U2 e: k6 C- V! a& U. V* o) v
$ ~7 o# L+ @7 ?6 l& p2、 设置时钟树,HCLK=64MHz
2 O7 S6 i6 g5 C8 f, @. n: F
! _- W: J5 J: m7 L3 D/ D
9 @ |3 Z: K8 O, v' c. N0 C* X3 c9 x/ L" \! I9 S
3、 查看数据手册,看那些引脚可以用作usart1、usart2、usart3、usart4。把这些引脚设置成TX,RX
- G/ l+ }6 M4 x* \% \
! B. x' k' `' t# E! @3 h! mUSART1 A10,PA9。USART2 A2,PA3。USART3 B10,PB11。USART4 A0,PA1
" q% I' Q& H7 X& u
# d& K% |4 ~0 w+ L: b% I
; W$ g* w# r M5 V/ z# J9 Y
- a! p& U8 p) W& r0 z5 V/ \4、启用USART外设,参数按照自己的实际来填。模式设为Asynchronous,115200,8bit,None,1/ s7 _8 T) l m! t
[" W, |' r( m% w1 o0 X
6 O2 L- p2 w5 H* b' a, ~3 U' N8 ^1 F0 m4 o) O2 ~7 u& {5 x
5、 项目管理填好信息。生成代码"GENERATE CODE"
" k P: U" ^1 Z& J, Q' D0 g1 C2 Y3 |4 W5 J
6 N% g+ {, N; @- k( j( H
2 R2 T* k% R4 G& j+ c; w$ V# m* w) P2 L/ G i) d0 X7 _5 H% [
6 {8 J/ Z7 \ N0 P+ F# q
6、使用MDK打开工程,debug选项中勾上“Reset and Run”
9 k6 y/ S- |! W4 Q8 v4 R. o3 p* y: ^2 W* C
代码部分- {& X$ P1 u+ A6 e# v
1、usart.h中添加如下代码' _( \5 `7 ~4 k
K d; f. j T% H6 h: n
- #include <stdarg.h>
% d$ E. U# ?6 T6 w
7 E# I4 \4 G2 a4 E6 C- @. H8 \- /* USER CODE BEGIN Prototypes */
# P1 r$ _: j/ q, R
4 S- z5 d1 ~1 u0 }7 C- void USART4_printf(char *fmt,...); //重写usart4的printf函数
+ c; Q: ^% }* h k- ~! ]7 b - void USART3_printf(char *fmt,...);$ N2 H3 A6 E" r: g0 M3 K$ ~- |
- void USART2_printf(char *fmt,...);6 ^9 q! u: u% h8 W7 }3 V
! r/ A# s: H' K7 b5 F* W- k- /* USER CODE END Prototypes */
复制代码
/ A) W) o9 m+ m h1 q2、usart.c添加如下代码' \" d/ Z; v2 ?1 {" L7 ^! M* z
5 u7 q) Y# f1 h( [9 @- /* USER CODE BEGIN 0 */. N: E0 m; k9 @2 o2 v0 ~9 f0 u
- ! d. Q* U5 o! A) J* X
- #include <stdio.h>
" l1 L( T. b2 G" I& P - #include <string.h>& V3 s9 v" G( a5 t) Z/ l) Z6 V
- #ifdef __GNUC__+ Y0 Z& P; a5 _5 E
- /* With GCC/RAISONANCE, small printf (option LD Linker->Libraries->Small printf. E; V5 S$ N: [6 _
- set to 'Yes') calls __io_putchar() */
2 S% [7 h9 C0 X# y% f - #define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
, B1 u- Q/ g1 x6 P; `) t! P - #else
' m& |, n4 }& ?8 c! x - #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)9 ?. R8 K6 q$ c5 g* _/ b5 o
- #endif /* __GNUC__ */
" ?8 G5 H, G! P6 R. l6 n - /**7 W, D8 `9 ?- ^; M
- * @brief Retargets the C library printf function to the USART.! \- a7 { ^' `" |
- * @param None
: m( Z$ ?: r. o - * @retval None
( c4 U; L. Y8 G( E6 [ - */
& g2 Y% `* ~# S1 o; f9 ` - PUTCHAR_PROTOTYPE& M" y& d# v( | G: ?
- {
2 `9 z, x8 l+ F) d! w+ y2 I- C - /* Place your implementation of fputc here */4 q; k2 O* C5 l: v* B; P
- /* e.g. write a character to the EVAL_COM1 and Loop until the end of transmission */
/ U( y9 g5 ]4 M: W0 Q3 y - HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xFFFF);2 I0 a! _! v: r) D3 k
- return ch;
+ h1 _: |. R1 p3 |/ M - }
7 p, F: `' U0 a - % u$ M1 d% ]$ ~
- #define USART_TXBUFF_SIZE 256 //定义串口发送缓冲区大小 256字节7 u3 z9 ?9 }( Z) X! E7 Q/ Y6 s
- __align(8) char usart_txBuff[USART_TXBUFF_SIZE]; //字节对齐缓冲区 c: {9 n. M/ U6 U
- " G/ _3 O6 d& A7 O' Z, ^8 q
- //usart4的printf()) v/ z8 A! I; @' B R
- void USART4_printf(char *fmt,...)9 e6 F S, w- ^2 I- d5 c5 b3 n; M
- {
, ^3 ?% M0 C/ o0 a" `0 z1 I8 y - uint32_t i,length;
1 ^/ y4 g7 A1 ~1 {' U - va_list ap;
) A2 o3 J# Y/ z - va_start(ap,fmt); ]# w3 ^5 `; @5 }
- vsprintf(usart_txBuff,fmt,ap);
' J- v5 g; A! ]% G) c3 @4 J - va_end(ap);6 o! T. y+ J$ ^7 j
- length=strlen((const char*)usart_txBuff);
, a! J# a3 e# ]. ?% U - while((USART4->ISR&0x40)==0);
( e$ D' b3 l* _0 p" [ - for(i=0;i<length;i++); E. @% Y4 C r% |& O' L" g+ |
- {
+ [& f- [1 j, I$ I$ N - USART4->TDR=usart_txBuff<i>;
4 b6 e, {, }* e1 @0 g - </i>while((USART4->ISR&0x40)==0);( }" l4 {' M1 I$ H1 _
- }# \, ]& i: \0 C- g& ]" O! s! Y# K& R
- }
, d0 R/ n- |" a3 A3 Y7 e4 I - " D0 z7 ^# c: B' x
- //usart3的printf()
# R* U0 k2 `( O8 V2 V/ o% s - void USART3_printf(char *fmt,...)5 H; X5 l# G3 \* k2 c
- {6 `4 ^, O4 T3 |- Q
- uint32_t i,length;, m7 I9 v& J* i! ?3 {* A" L* F8 k" ~
- va_list ap;
* l0 G2 A3 S3 q! Q - va_start(ap,fmt);
* {2 Q; {; C' l$ h( j6 o - vsprintf(usart_txBuff,fmt,ap);
. L, c% w9 @1 d( }" U! |* H - va_end(ap);9 `) z+ S8 x. m/ a: G
- length=strlen((const char*)usart_txBuff);
( A; [% G6 L' w - while((USART3->ISR&0x40)==0);
" m! R3 X2 `- p2 D D6 V. E - for(i=0;i<length;i++)
$ }) b7 H+ @! F& E* t - {! R: W) t+ A5 Z+ J/ h. W
- USART3->TDR=usart_txBuff;
. A- p/ r& s7 B& W6 Y/ r8 T - while((USART3->ISR&0x40)==0);
1 G/ Q' l# P2 a, z - }
$ P: T; r" F* l0 q% W+ x4 k7 ^% Y: K4 \8 ` - }
) a$ n% h; B1 l, v T - ' R! `( z- U& g$ T" ]
- //usart2的printf()
2 h6 u: J9 I/ M - void USART2_printf(char *fmt,...)
k7 t) V1 b+ G! _+ G: S( q) b @ - {
$ E1 `* c5 ^- ? - uint32_t i,length;
- ?* l, f- Q% U. R9 A* S - va_list ap; B* }4 w1 n+ U8 D* H; n
- va_start(ap,fmt);
4 @% M3 S& G Y' Q - vsprintf(usart_txBuff,fmt,ap);7 S4 V! c# N: e9 u- P
- va_end(ap);+ l u* g% W) Q: o" G& a
- length=strlen((const char*)usart_txBuff);
0 |6 b" Z4 P: W p3 ` - while((USART2->ISR&0x40)==0);5 p: b; T9 X% Z/ X: S
- for(i=0;i<length;i++)
4 S( {6 w) q3 e$ E5 L - {
! H* _$ \. A2 l, G: \" [& A S - USART2->TDR=usart_txBuff;; j! m. K) X( s- A7 P: B
- while((USART2->ISR&0x40)==0);
0 |) \* E7 L! `2 q# u) A - }
! T9 b4 ~1 k' _# C2 C. {8 d - }1 |5 O1 F' f4 R; T2 \0 A p$ X
& b9 ?; i1 m/ c; i- J- /* USER CODE END 0 */
复制代码 + ?9 \! i/ b% M9 l o
3、main.c中添加如下代码; q% f$ b, n, i
! m/ h$ `2 k5 Z
/- * USER CODE BEGIN Includes */
3 I- b. I" T( o% y8 x0 s - #include <stdio.h>
! X7 O6 `! Y3 L, x3 U - /* USER CODE END Includes */! Q, }6 E, f0 n+ j: ~$ {! j, p5 g" `
- . g8 Y, s+ X; w
- int main(void)% ~ e7 I: Z* G+ L7 @
- {
% `; j, A4 h% t3 I) d* M - while (1)
' E8 w: d1 L9 h6 ?3 j0 `6 s# Z5 D1 ^ - {
6 c E0 h( X# {5 G8 {, h - /* USER CODE END WHILE */
8 \ s: [: c4 l - Y( q) y4 @/ c1 j# R
- /* USER CODE BEGIN 3 */7 i o; m! E" F! ?, V% ]. z
- HAL_Delay(1000);
1 q: }' w! x% j; E - 7 D7 c1 Y, h: K. ]
- USART4_printf("This is the signal from serial port 4.\r\n");5 W+ r# `/ H3 l
- USART3_printf("This is the signal from serial port 3.\r\n"); L9 U8 {! D& Q/ N& y$ o- t" V" S! t
- USART2_printf("This is the signal from serial port 2.\r\n");
' J/ U+ P0 A+ t r% D F - printf("This is the signal from serial port 1.\r\n");
& t0 S, c6 D1 g - }
, @8 Y" a5 D0 g0 {+ f( v) e - /* USER CODE END 3 */. b" d6 u" Q3 C
- }
复制代码
$ U8 r1 @. v# `8 h: ?5 l4、最后编译,烧录固件,串口输出如图
4 }, t% Q, s; @7 _3 D' q
, g- h& ]) R5 X6 j. s1 \" ]/ S9 R5 @' [+ ^8 Q. K' F
9 V" X5 @1 f- J @ |
学习学习