STM32G0-HAL库串口控制( ~. u; {6 v9 I1 ^+ P' `6 m
今天分享的是基于HAL库进行串口的配置输出以及重定位实现,使用的开发板是STM32G0B1RE,和F1系列的芯片使用方法是一模一样的。! G! i; c: n3 Z2 s7 Z
, k" q& p" l9 ^* d一、打开CubeMX进行工程配置 这里使用的是串口2
1 s5 Y1 d7 P6 x& y! s具体的操作步骤就不重复了,就介绍一些关键步骤
" D) {: G, P. X9 {" M从配置的结果可以看出 串口2 使用的是A2->TX A3->RX
% h: u& a2 F8 c) h+ i% x$ Q) s' ?! b! t" t) M S
- O# {1 h, u9 h O; I
" }! N" C% x) D" b( q这里我使用了串口中断就行数据接收控制LED的亮灭,所以不要忘记将中断使能打开。, }/ n8 i r) E. \0 Y' v4 P
0 i: w% b" ^8 u5 ]! ~
6 U! J2 _6 z Z- `- f6 c/ E8 Z
) B: p o# U# g( @时钟我还是默认的 没有做修改,将这些配置完成后 就可以生成工程了, q' g& Z+ S' C1 l6 K, c; u# E0 B
5 y. V, W! M4 i. S1 a; D) e: r6 V+ u& _
代码编写
: E/ U' Q7 e0 l3 o' @1 I) w5 b1 g \9 e4 _) R+ ~* e7 L
- //常用函数. {8 S! G4 Q, q u# t4 d
3 j" y. X: \( n) V5 W4 e% N- HAL_StatusTypeDef HAL_UART_Transmit(UART_HandleTypeDef *huart, const uint8_t *pData, uint16_t Size, uint32_t Timeout);7 Y" B+ n0 g" k! L. D {$ z/ m. S5 O
- HAL_StatusTypeDef HAL_UART_Receive(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout);! M! L6 `, [* _0 X5 ?
- HAL_StatusTypeDef HAL_UART_Transmit_IT(UART_HandleTypeDef *huart, const uint8_t *pData, uint16_t Size);
+ h, [0 `/ Q! r - HAL_StatusTypeDef HAL_UART_Receive_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size);. o$ ?" L) D5 ^8 Z
- # Z' j7 K! B% j3 E
- //接收回调函数' d) I1 S9 d, f7 ?* E( ]9 H
- void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
复制代码
6 j9 {8 ^" z" `1 S6 [& G我们在进行配置的使用不要忘记配置接收中断这个函数HAL_UART_Receive_IT,要不然在回调函数里面中断接收可能不能正常使用,这句也相当于是串口中断使能。
t( v( H% S% g% \5 _$ u# U% |" O4 Q: [$ s v, u
串口回调编写& A1 a* `' K1 o6 d2 |
) r) V/ |% M9 ~$ d# g: d: W, G- $ c2 P) \- }' Y/ n/ w# f+ w6 r
- void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
3 n2 I! B; {2 D" j5 p7 F3 R5 m - {( e; A+ E( k9 G# B7 p* @
- if(rxdata == '1') //点灯LED4
9 Y8 W ]9 y* ~5 }% y/ h - {' y7 [1 f# Z9 {: a$ {
- LED3_Open();
6 S& V* e) Z S3 E7 B: B0 B8 k - HAL_UART_Transmit(&huart2,&rxdata,1,1000);
# Z! I( G. f# [* }9 D5 | - HAL_UART_Transmit(&huart2,(unsigned char *)"\nLED OPEN\r\n",10,1000);
5 E9 |- P. W- l1 c: x2 W8 B4 w( e - }
# j6 A* Q P5 V8 X - else if(rxdata == '0')/ f5 m, h7 J6 p4 ]! D
- { y/ u C3 H4 ~( t) o1 D
- LED3_Close();1 k U$ _$ {! V" h$ I1 |
- HAL_UART_Transmit(&huart2,&rxdata,1,1000);
/ Q2 s2 Q# Z; {( S' u8 x - HAL_UART_Transmit(&huart2,(unsigned char *)"\nLED CLOSE\r\n",10,1000);* t1 K7 Q- X5 L( B4 E) B7 ~% b
- }& s0 G% Q- Z. Q- e4 J- G7 g! b8 h
- HAL_UART_Receive_IT(&huart2, &rxdata, 1); //使程序可重新触发接收中断( X& Q" K4 A! c- c1 x% Q- f
- }
6 m7 |4 D+ F8 N$ F! T" V - }
复制代码 0 Z& i' ^' r- x
printf重定位1 ~1 J. X* R0 R; i; j
/ b( A$ ?# w8 v% J5 a7 _- //发送字符串$ ?, R( l7 G" @& _% ^5 q: h6 u
- void USART_SendStr(UART_HandleTypeDef *huart,char *str)4 Y) W; }- F$ e4 P) C
- {
1 @/ S- b% N: ^, [5 u4 @ j - while(*str != '\0')
0 m" |% k& a! D, e! J1 w - {
7 @# P1 p5 W% [- G, @+ O - HAL_UART_Transmit(huart, (uint8_t *)(str++), 1, 1000);
$ C& N8 W' L) w2 i5 { - }
& V3 j3 b& G! m# ?1 y' E - }3 G6 |/ R- P8 h* n- I D
b0 j% } O$ k4 x# _% p
8 j% s. U" S$ O$ h6 U/ B6 B- //重定向Printf函数
1 H% H2 S/ s) {6 Y - int fputc(int ch, FILE *f)
; Y0 W# A2 I6 s; k/ e/ g1 Q+ ? - {
1 t% \- r/ k4 H$ d G: V1 |
$ J9 `9 {9 V& i7 c3 s8 \" [- HAL_UART_Transmit(&huart2, (uint8_t *)&ch, 1, 0xFFFF);4 z0 ?) s1 ?/ L1 H( E
- return ch;4 R5 Q: D: v! ?/ m+ K9 n
- }
2 L5 Z: D9 k( `$ p- u2 H* P
! B. s+ U3 y! q
% t7 \: y: \- u1 C) H- //
6 D' z" R$ B/ [7 r - //重定向Sscanf函数
' b; H1 _- p$ k! q5 Z - int fgetc( FILE *f) ( s; A3 i& P8 h9 d% j1 B. A
- {
' W/ O: }" T& w" c" \ r5 ?) X
, P- D) d Q2 U3 `5 y& M C2 {- uint8_t ch = 0 ;
9 k" ^- }2 l& ~$ C, b, S4 } - HAL_UART_Receive(&huart2, (uint8_t *)&ch, 1, 0xFFFF);
. V. z7 J( G+ Z7 {+ Q4 P' \, D - return ch;& }9 p+ X# a- u2 Z; _9 L
- }
复制代码 ) M7 B! k) A/ H4 t% v
主函数功能测试5 ]5 r' F; Y1 @0 h5 W
7 w. [ R" j, t
$ b( u% R5 E m- J3 k5 I
6 j5 L& I/ \7 ]" ]. R注意:在进行串口重定位的时候需将Target 里面的Use MicroLib勾选上不然使用不了。
) J' u$ N6 W0 y5 E
3 j" \- M! I/ Y
' t8 o; d9 S0 d, [: c, j0 g5 B0 [! k3 E& D
实验结果
2 y) ?0 c( @& a7 e" Z4 h( |( q( s3 n# F" ]% {$ Q: N
1 y) Z0 w- c" K. A
- N+ f: `7 u& D8 o- v6 M
————————————————
% w+ ?9 [1 j5 b7 _* ?- R版权声明:@slow-walker
" I3 M1 D2 y$ x# v& p, \# N* `! A5 a& W
|