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

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

[复制链接]
STMCU小助手 发布时间:2021-11-8 17:15
芯片基本外设配置1 ^  j/ B: p' x, Q* V' |8 s+ i
在SYS里面开启Serial Wire调试接口$ q  {0 R/ ^/ c% B
在RCC里面使能HSE (Crystal/Ceramic Resonator)
( y4 S" U# e- z6 r+ J, |$ h' |1 d: g配置时钟树6 N+ m  L6 j% t
选中“HSE”、"PLLCLK",在HCLK(MHz)中输入64,回车,软件会自动配置数值。- V! B! z  S7 E" R; U
, \" W- B  c! ?% s
20200502143029653.png
- P9 ^+ h9 p: b. L! i0 v
) [( `) _; F& q! P# L7 X
配置USART1外设1 _8 H9 F5 f; _5 u' W4 G. w
在connectivity选项卡中,选择"USART1",在mode中选择:Asynchronous(异步通讯)
4 {( {6 r- n& u  M
! {! S* J3 T6 b7 \" U" A) c在“Parameter Settings”中设置基本参数,参数可以自定义,但是通讯双方一定要相同
; r& R: A! Q' C" z9 T7 W+ Z0 v' {( k, ]# A( y
Baud Rate(波特率):115200,常用有4800,9600。5 ]% O1 a% I* U$ ~  Q% r
% l9 N9 h" c- l( u, p% D  u
Word Length(数据位):8,可选7、8、9' S% X/ I- m, Z0 t

; ]: F- G* I5 gParity(校验位):None,可选None、Even、Odd; P. d& A) Q( h9 w  w& {; o4 |2 D

+ Q4 a- m8 c. EStop Bits(停止位):1,常用有1、2、0.5、1.5# _3 P) S  }# Z/ u3 S. j- r5 g
# b( o" n/ T9 M  @( a& \
其他参数默认值。
8 ~! ~  T' S9 o4 D5 e8 x( e$ R
; E' K0 ^/ N; t* d, z& i4 y9 z6 t
20200502145229923.png
- _; A/ B( z- M
2 M! g- j4 q$ U' C/ o0 I+ T0 v
生成代码后,在MDK软件中打开,在debug中设置“Reset and Run”。
1 n3 `3 m# I" ^% E) f* T2 S& s$ \, e; N% n9 M* ~/ Y
使用串口的三种方法(直接调用hal库、printf、中断方式)1 z9 L; J8 U$ M* K" b' \0 k
第一种方法(直接调用HAL库)$ W" m& p  o- B  P6 S0 O* }+ ]
在int main()主函数中写入如下代码
9 Q- \4 I& N( H# c; b, Y; h
2 Q9 e  r0 y2 p& v
  1. uint8_t temp_buf[1]="c";                         //定义一个数组,这个数组长度可以自定义7 P$ \. }" {- X& W2 u- g
  2. while (1)
    4 F/ R" |8 s  Q) ^
  3.   {
    $ b# X8 i/ ^2 \
  4.     /* USER CODE END WHILE */. n3 d* D! u1 u" g+ _) g% F
  5.     /* USER CODE BEGIN 3 */
    % z) b) M: a! m
  6.     HAL_Delay(1000);# ?! Y: Q+ x# Q6 N$ m+ A: o
  7.     HAL_UART_Transmit(&huart1,temp_buf,1,10);    //使用usart1串口每一秒发送字符c
    : Y% I9 t6 U# F: j4 ^3 C
  8.   }
复制代码
  1. uint8_t temp_buf=109;                         //定义整数,
    ; C3 F: y# |; P2 c
  2. while (1)  N  N1 B- g% Z
  3.   {8 @) L7 P3 h0 Q8 K: S
  4.     /* USER CODE END WHILE */9 V0 |' {- M  k, l1 F
  5.     /* USER CODE BEGIN 3 */( C- N: T/ [! z$ _1 F+ b5 _9 j
  6.     HAL_Delay(1000);5 D+ A& q' o; p1 J
  7.     HAL_UART_Transmit(&huart1,&temp_buf,1,10);    //使用usart1串口每一秒发送字符m
    8 `) ?% N% h5 V- v! A  r2 D
  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>
复制代码

) J# T- r" x; _$ uUART_HandleTypeDef *huart:指定串口,usart1就是&huart1。usart2就是改为&huart2。
) u! ]5 J& X) U6 |$ x$ I: b% H3 p6 g) c: x. W7 j* L- J, e6 b4 T
uint8_t *pData:就是要发送的数据
. g$ t) r: V# U( k7 \9 U' ?
. \# i4 ?/ a5 K. n. ruint16_t Size:单位为字节,至少要比发送数据长度要大。
) n7 j+ d# I8 x, z. f7 S- v$ l$ Q+ x$ {) u9 O
uint32_t Timeout:超时时间
& z# b6 I) I6 C4 s9 z# g  l+ H5 d; }1 o# \4 ]# \; o
第二种方法(printf)
6 k& m# L& Z1 `8 ~7 R# w: {在main.c文件中添加头文件
. ~4 n% M$ F* H% A1 X" y7 G  T4 K
  1. #include <stdio.h>
复制代码
$ n2 q, g' `! D! D/ G
main.c文件中加入重定向函数 ,代码中添加了#ifdef宏定义进行条件编译,如果使用GUNC编译,则PUTCHAR_PROTOTYPE 定义为int __io_putchar(int ch)函数,否则定义为int fputc(int ch, FILE *f)函数4 K) I3 j# C, w- Z( x& K4 p
  1. /* USER CODE BEGIN 0 */
    " M: q" {4 |3 v# P
  2. #ifdef __GNUC__
    " T$ U6 Z4 D* c
  3.   /* With GCC/RAISONANCE, small printf (option LD Linker->Libraries->Small printf. |- D) u+ I6 f* C
  4.      set to 'Yes') calls __io_putchar() */# ~/ i7 g, B$ d8 c! }1 C  ~: A
  5.   #define PUTCHAR_PROTOTYPE int __io_putchar(int ch)5 B! q0 k% F9 T( v
  6. #else
    + A- N7 G+ y- J/ I" K. K5 f
  7.   #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
    3 B, }; ~8 p- F
  8. #endif /* __GNUC__ */
    9 Z6 @( y, g2 v; [
  9. /**) ?# N: z  g' I" |) P# P) ~. @
  10.   * @brief  Retargets the C library printf function to the USART.
    : q3 Q# l. B; N7 s
  11.   * @param  None
    5 ]; o: `2 l; R2 I: H1 U
  12.   * @retval None
    7 `$ T* d) C8 X# f+ p; m: E! S
  13.   */( V5 d: i9 r9 N4 g* T0 G
  14. PUTCHAR_PROTOTYPE3 V1 M, b& ]+ D% {. e# ]8 y# _7 _
  15. {
    # X8 _6 o! K6 i7 y% o$ `) L# c+ |
  16.   /* Place your implementation of fputc here */
    6 H# [' ]% b7 |2 K+ M. n- L6 n
  17.   /* e.g. write a character to the EVAL_COM1 and Loop until the end of transmission */* O- r; Z: C8 O! w6 t" }: u
  18.   HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xFFFF);! u% Q7 M, Z/ d0 L

  19. & c4 x7 s; i4 }# A
  20.   return ch;
    ; \; Z0 _# r" a* E% z5 B$ Z6 k
  21. }) L. J9 R3 a* r# r, D
  22. /* USER CODE END 0 */
复制代码

% M/ [: G/ z& D在int main主函数while循环中加入代码 . |* U- y8 L" A) }" F) o. x& S1 g
  1. while (1): O! M3 z  }3 x  R
  2.   {; p, h2 \" i1 m, w
  3.     /* USER CODE END WHILE */
    2 F% O2 }' |2 e) K
  4.     /* USER CODE BEGIN 3 */
    5 B1 w0 c' o4 O3 ?! X
  5.                 HAL_Delay(1000);              //延时一秒钟输出字符b' C7 V2 M, u. ^
  6.                 printf("b\r\n");                # ~5 N) w: x, }/ ^4 D1 C
  7.   }; Z* _" \7 [2 o# {
  8.   /* USER CODE END 3 */
复制代码

3 s0 w. v) v6 e! ?8 [1 g第三种方法(使用中断)
) W2 w9 O. ~1 U- X, u) }1 r在CubeMX中,设置USART1全局中断使能,然后重新生成代码。
. z* }0 z! T8 M- A4 q/ j
8 E6 G( y, f3 T/ y& O; L5 L( B
20200502170333550.png
8 ~9 P# A* o( o$ [% U/ X' h- l3 T

! G" y' F- j0 {% ?* x. E3 ~) J, g在main.c文件中定义变量  z0 {. Q# u$ h; E" p8 ~& a
  1. uint8_t TX_Buff[]="THIS IS A MESSAGE!\r\n";        //发送缓存& {2 x! B) ]: T& l" J
  2. uint8_t RX_Buff[2];                                //接收缓存
复制代码
* V/ E$ ^& _; i" y, q' C/ m% c0 @' l/ V
在int main主函数中,MX_USART1_UART_Init();后面写入串口输出函数
, U/ b: U( G1 H9 v& x- H1 q* x
  1. HAL_UART_Transmit_IT(&huart1,TX_Buff,sizeof(TX_Buff));   //用于第一的串口输出信息
复制代码
0 x- Z6 k0 T! V& x
在while(1)循环中,加入接收中断函数
7 t6 w, |6 f7 P" W2 E  d
  1. /*/ M- d; z2 r  |) S9 s
  2. *2表示缓冲字节,发送的字节数要于缓冲的一致。如果发送长度小于2,则等到2字节后再显示出来, q$ l! `* v- b2 q3 l/ n0 k6 P) g
  3. */0 Z5 O# |# I. R4 {7 B. y
  4. HAL_UART_Receive_IT(&huart1,RX_Buff,2);         
复制代码

3 E# d- |# t. f) _再int main函数后面写上中断回调函数  O* `3 L& {' }3 K% K
  1. void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
    1 Z! X# A2 K% `3 o  C1 ^+ u8 |
  2. {, ]6 r' W" J/ u( _( A# l# z' v
  3.         UNUSED(huart);" \1 R9 y9 t; b6 _% q
  4.         HAL_UART_Transmit(&huart1,(uint8_t*)RX_Buff,2,100);        4 `. h" u# m3 l6 _9 Q! R
  5. }
复制代码
4 j. W* a4 u' C
编译,下载到开发板即可
6 Z  y$ b; Y. x. ~
; r- I/ w- y  K) p, ~' |- _: [9 K
$ n# f% S: k, G% O
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 手机版