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

STM32G0-HAL库串口控制

[复制链接]
STMCU小助手 发布时间:2022-10-26 23:44
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
92e3ecda7f954070a36abe11fd34f4b2.png - 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 ]! ~
7a749a584551400ab390d9f0fd0a57f7.png 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
  1. //常用函数. {8 S! G4 Q, q  u# t4 d

  2. 3 j" y. X: \( n) V5 W4 e% N
  3. 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
  4. HAL_StatusTypeDef HAL_UART_Receive(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout);! M! L6 `, [* _0 X5 ?
  5. HAL_StatusTypeDef HAL_UART_Transmit_IT(UART_HandleTypeDef *huart, const uint8_t *pData, uint16_t Size);
    + h, [0 `/ Q! r
  6. HAL_StatusTypeDef HAL_UART_Receive_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size);. o$ ?" L) D5 ^8 Z
  7. # Z' j7 K! B% j3 E
  8. //接收回调函数' d) I1 S9 d, f7 ?* E( ]9 H
  9. 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
  1. $ c2 P) \- }' Y/ n/ w# f+ w6 r
  2. void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
    3 n2 I! B; {2 D" j5 p7 F3 R5 m
  3. {( e; A+ E( k9 G# B7 p* @
  4.         if(rxdata == '1')  //点灯LED4
    9 Y8 W  ]9 y* ~5 }% y/ h
  5.         {' y7 [1 f# Z9 {: a$ {
  6.                 LED3_Open();
    6 S& V* e) Z  S3 E7 B: B0 B8 k
  7.                 HAL_UART_Transmit(&huart2,&rxdata,1,1000);
    # Z! I( G. f# [* }9 D5 |
  8.                 HAL_UART_Transmit(&huart2,(unsigned char *)"\nLED OPEN\r\n",10,1000);
    5 E9 |- P. W- l1 c: x2 W8 B4 w( e
  9.         }
    # j6 A* Q  P5 V8 X
  10.         else if(rxdata == '0')/ f5 m, h7 J6 p4 ]! D
  11.         {  y/ u  C3 H4 ~( t) o1 D
  12.                 LED3_Close();1 k  U$ _$ {! V" h$ I1 |
  13.                 HAL_UART_Transmit(&huart2,&rxdata,1,1000);
    / Q2 s2 Q# Z; {( S' u8 x
  14.                 HAL_UART_Transmit(&huart2,(unsigned char *)"\nLED CLOSE\r\n",10,1000);* t1 K7 Q- X5 L( B4 E) B7 ~% b
  15.         }& s0 G% Q- Z. Q- e4 J- G7 g! b8 h
  16.         HAL_UART_Receive_IT(&huart2, &rxdata, 1);        //使程序可重新触发接收中断( X& Q" K4 A! c- c1 x% Q- f
  17.         }
    6 m7 |4 D+ F8 N$ F! T" V
  18. }
复制代码
0 Z& i' ^' r- x
printf重定位1 ~1 J. X* R0 R; i; j

/ b( A$ ?# w8 v% J5 a7 _
  1. //发送字符串$ ?, R( l7 G" @& _% ^5 q: h6 u
  2. void USART_SendStr(UART_HandleTypeDef *huart,char *str)4 Y) W; }- F$ e4 P) C
  3. {
    1 @/ S- b% N: ^, [5 u4 @  j
  4.                 while(*str != '\0')
    0 m" |% k& a! D, e! J1 w
  5.                 {
    7 @# P1 p5 W% [- G, @+ O
  6.                         HAL_UART_Transmit(huart, (uint8_t *)(str++), 1, 1000);
    $ C& N8 W' L) w2 i5 {
  7.                 }
    & V3 j3 b& G! m# ?1 y' E
  8. }3 G6 |/ R- P8 h* n- I  D

  9.   b0 j% }  O$ k4 x# _% p

  10. 8 j% s. U" S$ O$ h6 U/ B6 B
  11. //重定向Printf函数
    1 H% H2 S/ s) {6 Y
  12. int fputc(int ch, FILE *f)
    ; Y0 W# A2 I6 s; k/ e/ g1 Q+ ?
  13. {
    1 t% \- r/ k4 H$ d  G: V1 |

  14. $ J9 `9 {9 V& i7 c3 s8 \" [
  15.         HAL_UART_Transmit(&huart2, (uint8_t *)&ch, 1, 0xFFFF);4 z0 ?) s1 ?/ L1 H( E
  16.         return ch;4 R5 Q: D: v! ?/ m+ K9 n
  17. }
    2 L5 Z: D9 k( `$ p- u2 H* P

  18. ! B. s+ U3 y! q

  19. % t7 \: y: \- u1 C) H
  20. //
    6 D' z" R$ B/ [7 r
  21. //重定向Sscanf函数
    ' b; H1 _- p$ k! q5 Z
  22. int fgetc( FILE *f) ( s; A3 i& P8 h9 d% j1 B. A
  23. {
    ' W/ O: }" T& w" c" \  r5 ?) X

  24. , P- D) d  Q2 U3 `5 y& M  C2 {
  25.         uint8_t ch = 0 ;
    9 k" ^- }2 l& ~$ C, b, S4 }
  26.         HAL_UART_Receive(&huart2, (uint8_t *)&ch, 1, 0xFFFF);
    . V. z7 J( G+ Z7 {+ Q4 P' \, D
  27.         return ch;& }9 p+ X# a- u2 Z; _9 L
  28. }
复制代码
) M7 B! k) A/ H4 t% v
主函数功能测试5 ]5 r' F; Y1 @0 h5 W
7 w. [  R" j, t
c7380e7ad65e46c9a125d335aa76232b.png $ 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 2a1a0572122a4490907d8e222d2156dd.png
' 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
2e9a5bb632034a90a416326bd5b00b38.png 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
赞 收藏 评论0 发布时间:2022-10-26 23:44

举报

0个回答

所属标签

相似技术帖

官网相关资源

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