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

STM32G0学习手册——使用HAL库进行USART串口通讯

[复制链接]
STMCU小助手 发布时间:2022-10-31 11:10
芯片基本外设配置3 z9 O3 C( D7 e7 O. P- N
在SYS里面开启Serial Wire调试接口
) A' Z) T1 t% U. X9 [7 h$ {在RCC里面使能HSE (Crystal/Ceramic Resonator)
! O' P9 |2 ^& Z1 p; M1 x5 }3 Q, c- S配置时钟树
5 T7 F$ G$ ^# I% _9 s2 L& o
选中“HSE”、"PLLCLK",在HCLK(MHz)中输入64,回车,软件会自动配置数值。9 W4 }. Z; D- F: j/ ]- g

# T9 ]0 z. ]; k, }" Z( F6 t; |6 u 20200502143029653.png   r% J/ \4 `$ s( P0 l) b
9 d$ o6 D+ c; Q- d; b( Z& t
配置USART1外设
5 ?* {4 c  Z0 V- y) v0 Y在connectivity选项卡中,选择"USART1",在mode中选择:Asynchronous(异步通讯)
1 U! B, _2 h1 H  _5 L2 i6 q3 g7 V* W
$ o' i) X6 x2 t: H6 L) V2 v9 V) E在“Parameter Settings”中设置基本参数,参数可以自定义,但是通讯双方一定要相同; J" }% i/ U+ b
! X+ U  I, C7 s% h
Baud Rate(波特率):115200,常用有4800,9600。
* E6 {5 j, v+ q! I: p
( x) J. @4 W& L. L: sWord Length(数据位):8,可选7、8、9
1 o: J* S$ a/ O0 }2 z8 W2 u( X4 G8 Q$ I7 u1 b( ~
Parity(校验位):None,可选None、Even、Odd9 r# ~8 h2 g, d4 T+ @
0 J/ |" n* Q8 _4 Q* w! v% n+ [
Stop Bits(停止位):1,常用有1、2、0.5、1.5
, q; Q5 z/ p2 L9 y( Y, G
& ^: Y  I  p+ F  F6 c$ `其他参数默认值。
+ E4 [  X" H5 L% W3 ~0 j, k
) s, D( r: t" P! f7 C" y9 ~# c/ P 20200502145229923.png 5 H* H9 l! g7 S7 a, Q' B

, d# l  u. O# |" C5 N3 `! ?$ V 生成代码后,在MDK软件中打开,在debug中设置“Reset and Run”。8 q" a4 c& V& u; k' S$ b
+ k! X3 n# M5 b& Q
使用串口的三种方法(直接调用hal库、printf、中断方式)  {+ h! i- a' G  n% i0 j
第一种方法(直接调用HAL库)

/ \# |1 j2 p7 b5 U# @ 在int main()主函数中写入如下代码
% P, r5 J! D# q3 \: y( `
/ S/ w9 V8 O: W. n7 d3 `: x+ @
  1. uint8_t temp_buf[1]="c";                         //定义一个数组,这个数组长度可以自定义
    4 O- N* c" G0 S3 I# O
  2. while (1). w7 H( T, I0 U& D/ b7 U, W( q
  3.   {3 L) O1 ]* R( y" O1 r, H: X
  4.     /* USER CODE END WHILE */# C1 [' T$ e  r! `
  5.     /* USER CODE BEGIN 3 */# C, |/ m3 p1 E% z0 ^/ k0 Y* ~
  6.     HAL_Delay(1000);
    $ T5 y" g/ O5 c8 ?& y% |
  7.     HAL_UART_Transmit(&huart1,temp_buf,1,10);    //使用usart1串口每一秒发送字符c8 [$ D+ N, I8 |4 X% P
  8.   }
复制代码
  1. uint8_t temp_buf=109;                         //定义整数,8 `0 v0 @2 y; c0 H- Y( [
  2. while (1)/ e* X/ S. |2 T9 B, I( V; b' A
  3.   {. ?8 C& @7 i! @* q' l! J
  4.     /* USER CODE END WHILE */
    ( V. C! B2 Y6 }0 V% E5 ~
  5.     /* USER CODE BEGIN 3 */+ z- e. c6 {& I% T
  6.     HAL_Delay(1000);3 s  A+ Q7 S5 d  [, i8 E) U& T( {2 t
  7.     HAL_UART_Transmit(&huart1,&temp_buf,1,10);    //使用usart1串口每一秒发送字符m
    5 Y/ L% l/ c4 C' t4 u7 T
  8.   }
复制代码
, t+ D6 i% g/ E4 N
HAL_StatusTypeDef HAL_UART_Transmit(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout)
* W4 m" t2 f- y% @# a1 D$ F
% W' r8 T9 a" U' d2 D! \
9 T: l; _, w7 aUART_HandleTypeDef *huart:指定串口,usart1就是&huart1。usart2就是改为&huart2。
6 I/ o' N7 q5 ^. z, ]
8 ~4 u: L3 [# W  `1 k/ B$ Buint8_t *pData:就是要发送的数据) f+ }- ]6 J2 u4 A" k4 g

0 ^0 ]6 X; G' Q, I1 Euint16_t Size:单位为字节,至少要比发送数据长度要大。/ M; X4 R7 |0 f* B' |) ]4 E: b5 X7 F
  E6 {6 b# t  F: o& m8 N0 `1 V, r
uint32_t Timeout:超时时间6 B. |  W, n+ n5 V4 f2 A7 B+ O

$ J' e2 X: R2 O% Z5 G" _2 E第二种方法(printf)
  o+ A! @( u1 C( z$ x+ [在main.c文件中添加头文件
# y& ]1 P4 S  r% T) B+ N7 L
  1. #include <stdio.h>
复制代码

* g9 z# V. @! [  Q& O* Gmain.c文件中加入重定向函数 ,代码中添加了#ifdef宏定义进行条件编译,如果使用GUNC编译,则PUTCHAR_PROTOTYPE 定义为int __io_putchar(int ch)函数,否则定义为int fputc(int ch, FILE *f)函数
7 G7 o3 V* b0 z, c
  1. /* USER CODE BEGIN 0 */
    ) V) `3 {3 V; V% i
  2. #ifdef __GNUC__
      w6 h6 E4 t2 \5 d1 ?
  3.   /* With GCC/RAISONANCE, small printf (option LD Linker->Libraries->Small printf9 I9 k0 ^% @0 \2 x& B; [% o) h( E
  4.      set to 'Yes') calls __io_putchar() */3 q9 B& f9 G- z' W: x1 H5 u/ e% `
  5.   #define PUTCHAR_PROTOTYPE int __io_putchar(int ch)1 r* L1 }5 A; l2 Z/ g5 Y7 j0 B
  6. #else/ k$ T9 e- h, X' X# V3 U
  7.   #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)- r4 p% W1 Z' B, Q6 j
  8. #endif /* __GNUC__ */
    * i: i& A2 q1 p" h
  9. /**
    - ~; Q+ f) |# U% U! c0 M
  10.   * @brief  Retargets the C library printf function to the USART.
    6 I8 k! \0 v) z3 M
  11.   * @param  None) A) k& F- f  V: u- {( ^
  12.   * @retval None  [: v# {5 U7 u  {
  13.   */* N: ]! i, S$ W& i
  14. PUTCHAR_PROTOTYPE
    5 d' K6 r  b, K' c3 e
  15. {1 \% w' r# o) i' S( Z
  16.   /* Place your implementation of fputc here */
    , j0 q% _/ i) F) \+ ~1 J& i
  17.   /* e.g. write a character to the EVAL_COM1 and Loop until the end of transmission */
    ; d- I- ^2 j6 X9 i
  18.   HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xFFFF);2 A4 N' X, k5 e) c- G7 T  @+ D9 t
  19. # Q4 g9 E9 T2 e' T4 r! ], F
  20.   return ch;7 f8 J# D2 S7 Q8 u7 t
  21. }
    " R( s& V2 k  C! W
  22. /* USER CODE END 0 */
复制代码

0 ~4 Y6 d+ \, w9 ^: Z3 ~) B在int main主函数while循环中加入代码
$ V) c' m  \6 R
  1.   while (1)' @5 P1 e, o, F8 t# [
  2.   {8 W6 ^8 C. ]0 A1 h- p  `' B
  3.     /* USER CODE END WHILE */6 p* `$ ~+ Z1 E2 w( [# H% B& l
  4.     /* USER CODE BEGIN 3 */" T6 W6 |# H0 \+ T- |9 t/ v; @. D
  5.                 HAL_Delay(1000);              //延时一秒钟输出字符b. p$ w" W! i1 G! Q4 J
  6.                 printf("b\r\n");                9 q8 v2 k' n4 K8 h0 e' o
  7.   }
    + [3 a% I& z5 p- n; p- g
  8.   /* USER CODE END 3 */
复制代码

4 {8 X# \; P: m; \; s第三种方法(使用中断)
2 K. C. G  O0 e7 M+ x. @3 V在CubeMX中,设置USART1全局中断使能,然后重新生成代码。
' d! @2 u2 x! g' l' A0 N
7 O$ S; _- ]" n$ ]5 j6 J 20200502170333550.png 6 i9 a) x/ O. J) }& `  T) k9 ~

7 |# g1 [- R# T) `/ q在main.c文件中定义变量
! V- W$ o' O+ E- j% T+ `
  1. uint8_t TX_Buff[]="THIS IS A MESSAGE!\r\n";        //发送缓存
    ; |; i# m$ |4 S; t& w. U+ c9 j
  2. uint8_t RX_Buff[2];                                //接收缓存
复制代码
. [5 e5 H6 @5 d' c' {
在int main主函数中,MX_USART1_UART_Init();后面写入串口输出函数
) d$ w) J. R' d
  1. HAL_UART_Transmit_IT(&huart1,TX_Buff,sizeof(TX_Buff));   //用于第一的串口输出信息
复制代码

2 \& t, r7 Y" Y1 p% {" F4 | 在while(1)循环中,加入接收中断函数
9 u6 E0 k0 L( k2 d2 E+ }- Y) [
  1. /*
    / W& n: E: d3 g8 ?  ?
  2. *2表示缓冲字节,发送的字节数要于缓冲的一致。如果发送长度小于2,则等到2字节后再显示出来6 {4 G7 z  _: n& ?# P% p0 n
  3. */5 D, X8 J- m, t5 s
  4. HAL_UART_Receive_IT(&huart1,RX_Buff,2);  
复制代码
      6 Y% f  g# r9 G% p+ e
再int main函数后面写上中断回调函数
+ P; H" v& w' D& G
  1. void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart); h8 m8 l0 V- d4 i' ]
  2. {
    4 o: v$ u# n/ ?. w; m/ n
  3.         UNUSED(huart);
    ! b& a7 F  s: g+ j1 P& q" {& c$ }
  4.         HAL_UART_Transmit(&huart1,(uint8_t*)RX_Buff,2,100);        
    3 ], \% d) {) j2 l; |, I
  5. }
复制代码

6 V; N* x; B( N- X$ @% m  D& F0 {: V6 i编译,下载到开发板即可
' @. p% _( p, V
! K5 L5 l7 l, K( r# t 20200502225239316.png 3 k+ k9 ~, V) w& p6 K9 t' x

) {1 i8 P! ^: W; A& X" o————————————————0 `3 ]3 N9 u$ R
版权声明:SCCELE. u/ m- C' H" `5 \1 \. I* S2 m
# l# w2 y1 l8 X- ^3 l. u5 w, \
$ m8 Z9 R) ~) {* ^
收藏 评论0 发布时间:2022-10-31 11:10

举报

0个回答

所属标签

相似分享

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版