你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM32G0-HAL库串口控制

[复制链接]
STMCU小助手 发布时间:2022-10-26 23:44
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 92e3ecda7f954070a36abe11fd34f4b2.png
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 7a749a584551400ab390d9f0fd0a57f7.png & 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
  1. //常用函数( q" O1 s) }5 L* [' O( N/ M0 \
  2. 0 q! C, k- _6 f
  3. 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
  4. 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
  5. HAL_StatusTypeDef HAL_UART_Transmit_IT(UART_HandleTypeDef *huart, const uint8_t *pData, uint16_t Size);; L! ]) ]) O' m' G& Z
  6. HAL_StatusTypeDef HAL_UART_Receive_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size);7 N# x: n+ N) K% @9 b

  7. 4 R3 {& y& h" Y. {+ |" ?& ~
  8. //接收回调函数. a% q$ b7 ^& z. w
  9. 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# ?
  1. ( F$ W; G8 e& s" H% |
  2. void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)' Z( p, [5 i/ S7 m. m
  3. {( Y2 O( {0 M9 y9 y9 h
  4.         if(rxdata == '1')  //点灯LED4
    - }1 A0 Y# r( M) A' Y& j
  5.         {
    / R- O# W0 H% b1 I$ _. z
  6.                 LED3_Open();( o) C% ?4 h: {0 V/ G& a$ z+ ?8 K
  7.                 HAL_UART_Transmit(&huart2,&rxdata,1,1000);0 S* A& @; A5 S" Q& ~6 N7 R% [
  8.                 HAL_UART_Transmit(&huart2,(unsigned char *)"\nLED OPEN\r\n",10,1000);
    + [. N- y( Y$ a/ H. ?; H
  9.         }
    4 _; w9 d; l. u& G  g
  10.         else if(rxdata == '0')
    # a) r7 I5 T6 V: N! v3 T+ k  _
  11.         {4 h" T( s. _6 C1 @
  12.                 LED3_Close();
    9 l$ ~/ L! M5 |  E. \
  13.                 HAL_UART_Transmit(&huart2,&rxdata,1,1000);) I9 ]. k1 ?! O+ O" M4 a
  14.                 HAL_UART_Transmit(&huart2,(unsigned char *)"\nLED CLOSE\r\n",10,1000);
    % ~9 |1 t+ w; E( {( Z5 |" c5 B
  15.         }
    / _1 j+ d- F( D! V6 w; w
  16.         HAL_UART_Receive_IT(&huart2, &rxdata, 1);        //使程序可重新触发接收中断
    * G" l: h" [( c5 m
  17.         }
    # |. X8 L, O8 `
  18. }
复制代码

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
  1. //发送字符串2 g* E6 t% e; S# Y* J
  2. void USART_SendStr(UART_HandleTypeDef *huart,char *str)+ g* B- C% N: R( t
  3. {# |- d5 I: x( g0 Z
  4.                 while(*str != '\0')
    - X+ N. ?: i" V* E
  5.                 {' b+ o+ i7 @1 P: m5 o- d3 f7 {& f6 ~9 M
  6.                         HAL_UART_Transmit(huart, (uint8_t *)(str++), 1, 1000);
    ) j2 ]1 {8 }9 m4 R# q) r* \
  7.                 }
    5 q4 L8 }. X7 w/ A
  8. }& ^& ^8 k9 c; D. M; e8 `  C

  9. 7 T* W1 Y0 I  t# B/ }8 M4 E

  10. : o" ]& [# s# J4 Y  e% ]9 q
  11. //重定向Printf函数) Y4 m% e8 q/ b4 d/ o
  12. int fputc(int ch, FILE *f) 8 b2 J2 r6 k2 ?1 i. t% n
  13. {+ \, A" w0 K5 ]5 {. @

  14. ; S6 w& t( K6 a) V
  15.         HAL_UART_Transmit(&huart2, (uint8_t *)&ch, 1, 0xFFFF);6 T# p# x+ \5 s+ N( ~" g, y
  16.         return ch;
    $ J$ J. ~2 i& g; [. }
  17. }2 m! l9 @, F! o  v9 \

  18. / G3 o+ a  \# O
  19. 3 H. y5 ]" @6 j" V: p. i7 e  Y
  20. //. J% n  n/ S5 Z6 ^+ m) ~* I
  21. //重定向Sscanf函数. |1 E2 d0 Y' N" I. L5 t
  22. int fgetc( FILE *f)
    0 K6 |+ u! N9 i1 {. f. C, q+ e
  23. {
    , v1 r- R! y8 Y5 }: s# J- [, x2 o
  24. 5 @( v% c. f0 v  V! R* w0 \, p$ `, D
  25.         uint8_t ch = 0 ;* O2 ^, Y+ e- \4 u' ]. @- J
  26.         HAL_UART_Receive(&huart2, (uint8_t *)&ch, 1, 0xFFFF);
    $ n0 v/ r; q" `
  27.         return ch;% e( c# i' I/ p, Q
  28. }
复制代码

% B8 A$ S! }! I& w. R" M3 j9 N主函数功能测试
) u% F* y4 ^. s
- H. |3 j5 y5 i2 d( o7 c/ A c7380e7ad65e46c9a125d335aa76232b.png
- 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 2a1a0572122a4490907d8e222d2156dd.png   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
2e9a5bb632034a90a416326bd5b00b38.png
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
赞 收藏 评论0 发布时间:2022-10-26 23:44

举报

0个回答

所属标签

相似技术帖

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版