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

【经验分享】STM32G0学习手册——使用HAL库进行USART串口通讯

[复制链接]
STMCU小助手 发布时间:2021-11-8 17:15
芯片基本外设配置
" h9 s% @6 a+ i+ R在SYS里面开启Serial Wire调试接口
; N0 ^+ t! q- a1 w/ H在RCC里面使能HSE (Crystal/Ceramic Resonator). ?! U3 ^- D" H5 z1 }
配置时钟树
" w; w, B0 b: U" v5 p* [/ S选中“HSE”、"PLLCLK",在HCLK(MHz)中输入64,回车,软件会自动配置数值。) J, f+ r5 j' o7 @4 e- y1 A

3 S6 z7 R2 ?& ]8 }4 u
20200502143029653.png
6 L/ \# c' w& y1 I7 K1 H; g
: R: `* G( j9 T+ O7 S- e2 p
配置USART1外设
7 s- @& V! g% ~' J6 W在connectivity选项卡中,选择"USART1",在mode中选择:Asynchronous(异步通讯)+ a- w' o4 X  }. }. P

* l! h3 u% @3 P7 w在“Parameter Settings”中设置基本参数,参数可以自定义,但是通讯双方一定要相同! n8 S/ \+ o& G  _. A

2 A. U1 w) `$ U& h) }2 o+ DBaud Rate(波特率):115200,常用有4800,9600。2 G7 C6 N. o; _" u) r0 Q: f

( S- y: b# ?6 fWord Length(数据位):8,可选7、8、9
) ?$ A2 O3 H% Q8 w1 T/ ]- }, p; k0 b. i% g8 A/ |6 g  i
Parity(校验位):None,可选None、Even、Odd; y4 i- R- n& j9 W
+ G  x) y7 c* _$ S
Stop Bits(停止位):1,常用有1、2、0.5、1.5- j1 D5 [! r1 Q. `, o

) V6 h3 p/ l! R* E7 f其他参数默认值。
" D% B7 {2 ^7 S" [9 }5 {; Z4 U2 j) K  W/ y1 W: W, y/ I4 {& W
20200502145229923.png

; h: q' b( M" Y- R2 |$ g9 j8 j% @  p! _- x9 |5 c8 y
生成代码后,在MDK软件中打开,在debug中设置“Reset and Run”。
& b+ U( |% K6 }$ w
3 {! l9 F# ]4 B0 s4 y% @& X& B使用串口的三种方法(直接调用hal库、printf、中断方式)1 [- U5 X( ^( C9 u* Y# M
第一种方法(直接调用HAL库)4 m7 Y! ?" X) K, v, G  k
在int main()主函数中写入如下代码
$ H; v. d2 ?. l; O9 d& F0 w* W( l2 x; x
  1. uint8_t temp_buf[1]="c";                         //定义一个数组,这个数组长度可以自定义
    ' j3 C1 ~6 m6 x) y, Q+ N: s2 ^1 @
  2. while (1), z; `/ S) _0 [# M; U: W5 d& ~6 I! i
  3.   {
    ' l" r9 ]4 `. D( t
  4.     /* USER CODE END WHILE */4 w2 r! S$ D# E, W  U( F
  5.     /* USER CODE BEGIN 3 */8 L; J5 u, T6 w* `% u
  6.     HAL_Delay(1000);
    # x5 T- w0 q0 h# e) K# U
  7.     HAL_UART_Transmit(&huart1,temp_buf,1,10);    //使用usart1串口每一秒发送字符c. X9 ^$ M0 k: c# o; r* a
  8.   }
复制代码
  1. uint8_t temp_buf=109;                         //定义整数,# K# F- Y* V5 o* ^
  2. while (1)
    % ]% s5 k4 G) [. N0 |6 J" q" @
  3.   {" R3 D2 N1 ~: G; D9 ]# H
  4.     /* USER CODE END WHILE */. e; i8 g4 ~$ L
  5.     /* USER CODE BEGIN 3 */+ a' \7 A2 S' ?- ]2 l
  6.     HAL_Delay(1000);! B' X1 R& ?" _) [$ \) w4 Y: m: J/ D
  7.     HAL_UART_Transmit(&huart1,&temp_buf,1,10);    //使用usart1串口每一秒发送字符m
    4 S) e: T- Z6 b# `; m
  8.   }
复制代码
  1. HAL_StatusTypeDef HAL_UART_Transmit(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout<span style="background-color: rgb(255, 255, 255);">)</span>
复制代码

1 T# N+ H% g4 o0 ]UART_HandleTypeDef *huart:指定串口,usart1就是&huart1。usart2就是改为&huart2。$ W$ |. m! V( _- {4 Z  z
+ j5 E6 A0 B& T% \' T: ~
uint8_t *pData:就是要发送的数据) s+ Y) ~% O8 Z* @0 C7 _. r

' g+ @4 t- o% x# U& o, \uint16_t Size:单位为字节,至少要比发送数据长度要大。
" h3 P7 z( M& o% q4 h
! C- A5 u7 p9 R4 z$ |9 ]$ n6 ~uint32_t Timeout:超时时间+ @3 I6 s7 y3 R( P6 T/ u
  ?! h6 m3 M: F+ s$ P6 }. d
第二种方法(printf)
1 u. O! [, M: j0 L1 j在main.c文件中添加头文件
( Z% O! r  N5 \+ z* |5 U
  1. #include <stdio.h>
复制代码
) J4 D/ B' X+ _" r. k
main.c文件中加入重定向函数 ,代码中添加了#ifdef宏定义进行条件编译,如果使用GUNC编译,则PUTCHAR_PROTOTYPE 定义为int __io_putchar(int ch)函数,否则定义为int fputc(int ch, FILE *f)函数
8 t& G& Q/ e2 \& x" O8 h6 C
  1. /* USER CODE BEGIN 0 */
    + }1 v( W, C3 M
  2. #ifdef __GNUC__* n% T- K* G5 a+ i% c
  3.   /* With GCC/RAISONANCE, small printf (option LD Linker->Libraries->Small printf3 ]) K! w: H& P' Q# |
  4.      set to 'Yes') calls __io_putchar() */
    8 }+ c/ ~, A) o3 l9 m4 Z, U
  5.   #define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
    0 i$ J1 b  j& Y  T$ M& Q
  6. #else
    ' s9 \5 j4 x8 e- [8 O! z
  7.   #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
    $ x* T+ D! D3 D  a+ h3 z5 f
  8. #endif /* __GNUC__ */0 A6 P- f9 X1 J# M& Z0 i1 p0 J
  9. /**
    3 K" S; u' @, K5 i$ m; ], k
  10.   * @brief  Retargets the C library printf function to the USART.
    5 [8 Q/ e; a7 [7 Y, v5 N
  11.   * @param  None0 P4 u( f& o% o. T
  12.   * @retval None8 y1 E- Z9 J4 Z& i: j4 |
  13.   */* w% T6 @  o: Q8 o  G
  14. PUTCHAR_PROTOTYPE$ a5 q& O6 H( V# C/ o9 s2 G
  15. {
    . Y* f' i% z1 _0 U& E6 q* l
  16.   /* Place your implementation of fputc here *// j1 g/ Y' ]2 M
  17.   /* e.g. write a character to the EVAL_COM1 and Loop until the end of transmission */& T% N2 v; F+ \' x7 K- L
  18.   HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xFFFF);: f: ?& P4 a9 N2 m1 v4 A

  19. % N8 x' Z% F' J" g' r* }) C( y
  20.   return ch;
    $ O: I1 R; q" F4 H% x) x0 c+ X  ]
  21. }! \# P5 n" U, G( g  \* _# E
  22. /* USER CODE END 0 */
复制代码
4 _5 ?1 S! `7 X+ S
在int main主函数while循环中加入代码 0 K( l" F0 v. |3 t5 e9 q
  1. while (1)3 n8 }' n. R) ?4 ^* O
  2.   {0 @+ S8 d$ g3 }; i
  3.     /* USER CODE END WHILE */
    7 Y3 Q  I" c! e& _1 q- E
  4.     /* USER CODE BEGIN 3 */
    # p% C. \  X) g1 F4 N! z7 U
  5.                 HAL_Delay(1000);              //延时一秒钟输出字符b
    ( c/ m% z, k; f) M7 E0 F3 S( F
  6.                 printf("b\r\n");                $ {, t1 E  ^# i; f, G, L; ^7 }
  7.   }( J9 D  {6 X' G. d2 ?8 b6 `  {
  8.   /* USER CODE END 3 */
复制代码

- I# Y& b- N) |4 ?6 ^8 `, w2 d. B( {* I第三种方法(使用中断)
8 g8 o4 r3 `: y" y在CubeMX中,设置USART1全局中断使能,然后重新生成代码。
5 n$ m1 {" g: a: C1 e0 `) [& h$ b0 e& r7 t  H
20200502170333550.png
7 ]- ^3 \, K. U2 y# }8 z. V' m: ^

8 I! S. Y5 }5 H6 A; K9 u在main.c文件中定义变量
  `# U  h3 u, R3 i
  1. uint8_t TX_Buff[]="THIS IS A MESSAGE!\r\n";        //发送缓存# I8 b9 d' ?# q4 K
  2. uint8_t RX_Buff[2];                                //接收缓存
复制代码

- I' b! x4 _& [* p) G+ E/ |+ h; Q 在int main主函数中,MX_USART1_UART_Init();后面写入串口输出函数
* ~0 B$ T* ~( m4 k2 o5 h: T8 l) \9 I
  1. HAL_UART_Transmit_IT(&huart1,TX_Buff,sizeof(TX_Buff));   //用于第一的串口输出信息
复制代码

, p/ q6 f. o" t; k3 \ 在while(1)循环中,加入接收中断函数/ |5 E) A) D: s1 J( Z4 d3 B- T
  1. /** ~7 r2 ]! h2 z, r6 t( }
  2. *2表示缓冲字节,发送的字节数要于缓冲的一致。如果发送长度小于2,则等到2字节后再显示出来
    0 P2 Y7 F. `) r" [+ ^' d' ]$ G
  3. */- s- A. L' q4 v) v+ h6 O
  4. HAL_UART_Receive_IT(&huart1,RX_Buff,2);         
复制代码

, }( B. _; v9 p# g再int main函数后面写上中断回调函数4 z" S8 r. U% c) b8 Q6 W
  1. void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
    ) t/ P/ O- G' A
  2. {
    9 I; k" h" y  K9 n
  3.         UNUSED(huart);# S9 W% T' n* d$ `
  4.         HAL_UART_Transmit(&huart1,(uint8_t*)RX_Buff,2,100);        
    ( ?+ R% D- X1 v
  5. }
复制代码
; o5 E' J, I( O
编译,下载到开发板即可
* [( k2 Q: i2 k; H! ^; E& e; q
5 C7 B; s: @. g: y9 F9 G4 h! L; T' y! H+ e

0 R& ]* {6 E8 u# O/ H
20200502225239316.png
收藏 评论2 发布时间:2021-11-8 17:15

举报

2个回答
ghost110 回答时间:2021-11-8 17:36:29

每日学习小技巧,提升看得见

STMWoodData 回答时间:2021-11-9 09:09:31

谢谢分享,学习一下

所属标签

相似分享

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版