STM32G0-HAL库串口控制
- d4 }4 B% V; U5 |* v今天分享的是基于HAL库进行串口的配置输出以及重定位实现,使用的开发板是STM32G0B1RE,和F1系列的芯片使用方法是一模一样的。0 E/ ~4 S) q. \9 m. o% D( F) O4 H
( V; x2 E6 k9 E一、打开CubeMX进行工程配置 这里使用的是串口2
, B1 R; y. ?% g% [0 z具体的操作步骤就不重复了,就介绍一些关键步骤, v$ {, M }+ X/ W/ V. Q0 g$ e$ ?6 c
从配置的结果可以看出 串口2 使用的是A2->TX A3->RX
- W8 h/ a6 Z8 }! \/ L1 i+ Y1 O; x' e
` m) u9 E: C n6 S& Q& i) x4 N
" `2 N7 ]8 J2 n$ R6 W1 C8 @5 Y0 h
; u; z2 V0 y# l* e5 f这里我使用了串口中断就行数据接收控制LED的亮灭,所以不要忘记将中断使能打开。
0 i9 _6 f C1 y1 T8 |7 k/ B. |7 i$ o. K+ y* h6 P
4 ^- s/ y' T" r$ m9 H
; S7 W# Q' a2 `4 G6 F时钟我还是默认的 没有做修改,将这些配置完成后 就可以生成工程了
- z' e9 T4 s+ h2 k7 E; J
5 E! ]) S" \' s d. C) Z6 I代码编写
" u& P/ U) P4 D* q2 {
1 [7 c N/ d1 C( L, Y- //常用函数5 G: ~ B4 i0 p9 t+ S$ e
! F! a! g0 k$ }7 L( o- HAL_StatusTypeDef HAL_UART_Transmit(UART_HandleTypeDef *huart, const uint8_t *pData, uint16_t Size, uint32_t Timeout);
. j+ K) _% N$ u( }& z4 a& B. ~ - HAL_StatusTypeDef HAL_UART_Receive(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout);
1 K5 q; w. @9 D; A4 _! _9 y* { - HAL_StatusTypeDef HAL_UART_Transmit_IT(UART_HandleTypeDef *huart, const uint8_t *pData, uint16_t Size);3 T* z+ Q) c& i0 Q) ]
- HAL_StatusTypeDef HAL_UART_Receive_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size);' |. s% C. s* C+ s8 Q6 H
- ; e: {7 ?( o4 I3 ]% @4 o
- //接收回调函数6 j/ J8 ^9 M @5 g
- void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
复制代码
, G: Z9 }" l8 f n/ U4 [我们在进行配置的使用不要忘记配置接收中断这个函数HAL_UART_Receive_IT,要不然在回调函数里面中断接收可能不能正常使用,这句也相当于是串口中断使能。
" R: e4 F: e6 ~) l+ g' f$ s
- w+ \9 R* B; G( n0 V串口回调编写
/ B: h7 Q$ E* {8 |! H" N, N6 G6 `4 a) E3 M! s2 Q
5 g, Y# T! ^' \. _* H- void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
3 X! k% ?( W- M- h G) O - {
( y5 e9 P* O6 Y- l4 A; T - if(rxdata == '1') //点灯LED4
6 K; T! {8 [/ [9 k9 C% t - {
/ I. l) [7 F) | - LED3_Open();& {4 S! r! G/ ]( y* ^& B7 J y! k
- HAL_UART_Transmit(&huart2,&rxdata,1,1000);5 z. l$ _5 F+ h) F; t
- HAL_UART_Transmit(&huart2,(unsigned char *)"\nLED OPEN\r\n",10,1000);
( e9 D F, p/ i6 i9 w - }
6 p4 k2 d+ g% O& W: E. ^2 k. @/ K3 S; F - else if(rxdata == '0')* @3 n4 p) A' l6 j4 v% R- l
- {
9 a- {0 d$ f. `) E R - LED3_Close();
8 R2 b7 [( g1 ~3 j - HAL_UART_Transmit(&huart2,&rxdata,1,1000);
5 k8 O5 Z2 m2 k6 A9 T2 K - HAL_UART_Transmit(&huart2,(unsigned char *)"\nLED CLOSE\r\n",10,1000);
* B* M0 o% _1 _: _8 y' A - }
$ O1 D5 q8 S1 B) v, N) ?9 \ - HAL_UART_Receive_IT(&huart2, &rxdata, 1); //使程序可重新触发接收中断3 @4 [5 [# d8 {1 p; Q0 d% Q, g9 j
- }
( F1 s9 p% l9 p7 W% n - }
复制代码 # B' l" B8 q7 Q# T9 _
printf重定位- U9 Z) w3 E) ?7 j
% {) x) A8 Z% T0 _6 w! f- _0 [+ ?/ F$ O0 r
- //发送字符串, H! B0 ^# t d' [9 q' h
- void USART_SendStr(UART_HandleTypeDef *huart,char *str)
( W5 G9 A" M) L5 C4 L! c8 T6 ^ - {
, `5 B. V. ]$ l - while(*str != '\0')
* p) f: g/ |+ l1 I q - {* b$ e2 L0 b6 |) F
- HAL_UART_Transmit(huart, (uint8_t *)(str++), 1, 1000);
* u( a( I7 g$ r - }
' t( U4 s% j) C2 H3 N - }2 k4 @9 x: G, D0 v9 Q
# L) @5 `5 t# W/ r3 z* ?$ r8 j- # ]5 \# D- S! f+ D { x" O4 c6 a9 {+ J ~
- //重定向Printf函数
5 Y3 [: t& S. _2 m8 \5 a - int fputc(int ch, FILE *f) + G+ q" ^; r1 {6 m& a' E
- {, {! t" D7 x5 ^! Q
6 o: P# P( P. F- HAL_UART_Transmit(&huart2, (uint8_t *)&ch, 1, 0xFFFF);4 j( b1 ]- t# n0 s0 g
- return ch;- H3 n3 g' [0 Q$ P
- }7 ~, N4 K" T# o3 K/ p# x
$ x) J& g8 U0 d9 F2 t
9 G3 m* h! Y/ ~. l" r- N- E- //, T9 ^2 I6 R4 U
- //重定向Sscanf函数
) r ^8 z+ y& e& C7 R7 |9 E: \ - int fgetc( FILE *f)
; [6 |, J: e5 {' k X6 K8 v - {: l9 r5 @8 |. d* O3 {2 U4 C
+ ~# Z3 i) {# _) \# z* K- uint8_t ch = 0 ;
" o/ Y+ G5 q9 p8 r5 C - HAL_UART_Receive(&huart2, (uint8_t *)&ch, 1, 0xFFFF);
$ t/ J4 ]) I6 [5 f* Y1 s - return ch;
5 [5 ~6 R. W9 D1 S6 Q - }
复制代码 8 P+ ~0 i; m, B* G# |
主函数功能测试% ]2 n' f+ q2 D8 m( W; D. _# q
* i& p: H* N l7 [( N
0 }/ s6 q( O0 ~; G
7 b; L6 {# |7 c0 A) D- \1 ^
注意:在进行串口重定位的时候需将Target 里面的Use MicroLib勾选上不然使用不了。
6 I/ `+ o( ]3 E7 ]) ~4 z) T& _; [7 G9 i7 w2 ?* c% P) X
3 c/ r. [- }; Y" s/ ]2 T* i8 u
2 X' V5 p# p' b实验结果
* }4 y1 a2 n0 b& S7 R
: y9 J8 Y5 f |) O
. l* M2 O+ Y& j `- d
# \8 b! H! B: W9 X. l7 C" @8 u————————————————
9 a. g8 Y9 E" x3 M- R: L版权声明:@slow-walker$ C- v8 a% U; ~ v# G/ K6 p: V
9 n0 D4 O( }) F. l; t) V0 T9 \( Q; `! K |