STM32G0-HAL库串口控制1 u3 L8 a" x( ] X/ ]
今天分享的是基于HAL库进行串口的配置输出以及重定位实现,使用的开发板是STM32G0B1RE,和F1系列的芯片使用方法是一模一样的。# b4 y* w% \1 t: S) K M
& M& f9 ]7 _8 O6 R一、打开CubeMX进行工程配置 这里使用的是串口2% i# y7 H/ A& P1 l' d9 t/ t* W
具体的操作步骤就不重复了,就介绍一些关键步骤- a7 Q% J6 y& B% D- M3 ^
从配置的结果可以看出 串口2 使用的是A2->TX A3->RX
1 A7 `! v i. R* i
6 G1 k% F5 ~0 s6 U
5 I" S y5 H6 Q& e8 s. m; j% K( z5 F& i' {) ?
这里我使用了串口中断就行数据接收控制LED的亮灭,所以不要忘记将中断使能打开。
( H/ l) d3 V# \/ O2 h; X3 x
5 v0 {2 k5 ]/ [7 J
& d1 j( e0 P3 D. n+ x5 b
9 D/ r+ Z7 _7 A/ V
时钟我还是默认的 没有做修改,将这些配置完成后 就可以生成工程了8 W& E: c: w" z; V$ U
1 K1 K: P1 F: d4 I; n( {" d3 e代码编写
% ^) ~% @$ p' Z" [. ]
2 r3 q9 S+ F# m* B% u+ x- //常用函数( q" O1 s) }5 L* [' O( N/ M0 \
- 0 q! C, k- _6 f
- HAL_StatusTypeDef HAL_UART_Transmit(UART_HandleTypeDef *huart, const uint8_t *pData, uint16_t Size, uint32_t Timeout);
& w0 ^( ~" Z* L2 K9 L1 I2 X( t - HAL_StatusTypeDef HAL_UART_Receive(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout);
- {2 J8 }0 c+ C$ W4 U$ w/ n# l - HAL_StatusTypeDef HAL_UART_Transmit_IT(UART_HandleTypeDef *huart, const uint8_t *pData, uint16_t Size);; L! ]) ]) O' m' G& Z
- HAL_StatusTypeDef HAL_UART_Receive_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size);7 N# x: n+ N) K% @9 b
4 R3 {& y& h" Y. {+ |" ?& ~- //接收回调函数. a% q$ b7 ^& z. w
- void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
复制代码
, m/ Y- K5 Q; F我们在进行配置的使用不要忘记配置接收中断这个函数HAL_UART_Receive_IT,要不然在回调函数里面中断接收可能不能正常使用,这句也相当于是串口中断使能。
0 b( x8 x' F0 }2 P/ i% l2 o& v; o" b1 k1 ]1 p
串口回调编写
, b, x+ ~& a% C' R& S, y6 N" T8 {& D9 r" ~. d, q8 E5 j# ?
- ( F$ W; G8 e& s" H% |
- void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)' Z( p, [5 i/ S7 m. m
- {( Y2 O( {0 M9 y9 y9 h
- if(rxdata == '1') //点灯LED4
- }1 A0 Y# r( M) A' Y& j - {
/ R- O# W0 H% b1 I$ _. z - LED3_Open();( o) C% ?4 h: {0 V/ G& a$ z+ ?8 K
- HAL_UART_Transmit(&huart2,&rxdata,1,1000);0 S* A& @; A5 S" Q& ~6 N7 R% [
- HAL_UART_Transmit(&huart2,(unsigned char *)"\nLED OPEN\r\n",10,1000);
+ [. N- y( Y$ a/ H. ?; H - }
4 _; w9 d; l. u& G g - else if(rxdata == '0')
# a) r7 I5 T6 V: N! v3 T+ k _ - {4 h" T( s. _6 C1 @
- LED3_Close();
9 l$ ~/ L! M5 | E. \ - HAL_UART_Transmit(&huart2,&rxdata,1,1000);) I9 ]. k1 ?! O+ O" M4 a
- HAL_UART_Transmit(&huart2,(unsigned char *)"\nLED CLOSE\r\n",10,1000);
% ~9 |1 t+ w; E( {( Z5 |" c5 B - }
/ _1 j+ d- F( D! V6 w; w - HAL_UART_Receive_IT(&huart2, &rxdata, 1); //使程序可重新触发接收中断
* G" l: h" [( c5 m - }
# |. X8 L, O8 ` - }
复制代码
0 ]( p' _1 g/ Y" K0 Y6 L' `9 v! {printf重定位
) n/ \2 x! L# p2 Y" z4 l2 K9 b/ z6 L6 _7 r$ g7 O3 f
- //发送字符串2 g* E6 t% e; S# Y* J
- void USART_SendStr(UART_HandleTypeDef *huart,char *str)+ g* B- C% N: R( t
- {# |- d5 I: x( g0 Z
- while(*str != '\0')
- X+ N. ?: i" V* E - {' b+ o+ i7 @1 P: m5 o- d3 f7 {& f6 ~9 M
- HAL_UART_Transmit(huart, (uint8_t *)(str++), 1, 1000);
) j2 ]1 {8 }9 m4 R# q) r* \ - }
5 q4 L8 }. X7 w/ A - }& ^& ^8 k9 c; D. M; e8 ` C
7 T* W1 Y0 I t# B/ }8 M4 E
: o" ]& [# s# J4 Y e% ]9 q- //重定向Printf函数) Y4 m% e8 q/ b4 d/ o
- int fputc(int ch, FILE *f) 8 b2 J2 r6 k2 ?1 i. t% n
- {+ \, A" w0 K5 ]5 {. @
; S6 w& t( K6 a) V- HAL_UART_Transmit(&huart2, (uint8_t *)&ch, 1, 0xFFFF);6 T# p# x+ \5 s+ N( ~" g, y
- return ch;
$ J$ J. ~2 i& g; [. } - }2 m! l9 @, F! o v9 \
/ G3 o+ a \# O- 3 H. y5 ]" @6 j" V: p. i7 e Y
- //. J% n n/ S5 Z6 ^+ m) ~* I
- //重定向Sscanf函数. |1 E2 d0 Y' N" I. L5 t
- int fgetc( FILE *f)
0 K6 |+ u! N9 i1 {. f. C, q+ e - {
, v1 r- R! y8 Y5 }: s# J- [, x2 o - 5 @( v% c. f0 v V! R* w0 \, p$ `, D
- uint8_t ch = 0 ;* O2 ^, Y+ e- \4 u' ]. @- J
- HAL_UART_Receive(&huart2, (uint8_t *)&ch, 1, 0xFFFF);
$ n0 v/ r; q" ` - return ch;% e( c# i' I/ p, Q
- }
复制代码
% B8 A$ S! }! I& w. R" M3 j9 N主函数功能测试
) u% F* y4 ^. s
- H. |3 j5 y5 i2 d( o7 c/ A
- b. [; I5 E& j C
" E1 Y* Z0 s6 U! z; z注意:在进行串口重定位的时候需将Target 里面的Use MicroLib勾选上不然使用不了。
0 c6 G, X! r6 k9 O, y% Q
( I5 h6 P' W' F
q3 l% S' f: k- |+ S$ s- m5 g: J
( L* f0 ~8 V& T! ?, D
实验结果
7 X6 N9 P3 ?9 |" u$ m/ y$ _# I2 t- U s% E' Q2 J6 B/ w
9 O* X3 b$ g1 N# m- a2 Y/ a# D3 k$ f8 ?
————————————————9 E% }6 p1 m' W
版权声明:@slow-walker3 [' F! v+ L8 d1 a1 E
7 s z, @/ X R: k9 B$ e8 b |