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

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

[复制链接]
STMCU小助手 发布时间:2022-10-31 11:10
芯片基本外设配置3 ?3 k2 S1 |1 Z' K% ~
在SYS里面开启Serial Wire调试接口
: t( c1 v9 X" ]) q+ f% d在RCC里面使能HSE (Crystal/Ceramic Resonator)
# N# y, {% E9 ]% |; b  v8 r配置时钟树
9 z9 z  ^/ u- z' S, |. Q' p
选中“HSE”、"PLLCLK",在HCLK(MHz)中输入64,回车,软件会自动配置数值。; y% H- f1 ~$ C( @0 [: v  t& q  Z
  n3 H$ {1 m$ S
20200502143029653.png
' I8 m: A1 X/ B. Z# s) x0 K: t# w/ r6 u7 Q4 Z
配置USART1外设
" t4 L. _0 z" ^3 S5 f+ _3 {  X在connectivity选项卡中,选择"USART1",在mode中选择:Asynchronous(异步通讯)
% v/ e9 m9 B# f8 }8 R  g6 m6 y9 X8 `) T% T# u* Q  i
在“Parameter Settings”中设置基本参数,参数可以自定义,但是通讯双方一定要相同
9 a# k( e+ c# j3 o* H9 S: ]- i5 b% ^/ j  A; ?) z7 f
Baud Rate(波特率):115200,常用有4800,9600。4 k5 z. T" s* E0 X- b/ z* N% O
% w2 z4 \6 P# f3 A' f2 I
Word Length(数据位):8,可选7、8、99 p' y0 g1 N$ u  B

8 a. C% D- p1 t9 ]1 s% L& x7 iParity(校验位):None,可选None、Even、Odd
  P3 X1 D' _5 T/ a* h3 V8 W/ o7 N7 r
6 H$ F4 i7 @7 x! S  O6 A" TStop Bits(停止位):1,常用有1、2、0.5、1.54 g& Y# y* G% }# S5 X
6 p/ \- e- {& R* l6 s  u7 `3 e7 z4 S$ Z
其他参数默认值。0 c2 w' ?8 @/ Z# ?& n
# Y: w$ {- l6 k+ p2 P4 J
20200502145229923.png 0 k+ G* M( r8 Y/ }$ }9 Z8 q5 h

, w7 C2 v  l' `0 `7 O 生成代码后,在MDK软件中打开,在debug中设置“Reset and Run”。8 U6 T+ Z( I9 O) e6 k

) Y/ F8 K1 w! ^使用串口的三种方法(直接调用hal库、printf、中断方式)
8 u9 A1 ^, P8 c5 L; p第一种方法(直接调用HAL库)
4 X9 O# x! m8 p* ~
在int main()主函数中写入如下代码
" l8 z' F0 |" q8 s$ i7 _( S8 M
$ p; I: u9 y- @/ z
  1. uint8_t temp_buf[1]="c";                         //定义一个数组,这个数组长度可以自定义) a# Y  W8 V' u
  2. while (1)* n6 W9 m* |& d) J
  3.   {
      @* @3 d$ F& a7 q3 E
  4.     /* USER CODE END WHILE */( N0 c* b! N; M# Z6 D8 q
  5.     /* USER CODE BEGIN 3 */
    + V; \. X* `! r1 ^7 t- J
  6.     HAL_Delay(1000);
    5 W! p# D+ L  }
  7.     HAL_UART_Transmit(&huart1,temp_buf,1,10);    //使用usart1串口每一秒发送字符c/ x& h$ a. Y; r- D5 ~) F
  8.   }
复制代码
  1. uint8_t temp_buf=109;                         //定义整数,1 A0 z* p# N3 I
  2. while (1), h6 N( j% }/ g1 \, i& ]+ Y
  3.   {
    , z0 p( p% v9 V. F
  4.     /* USER CODE END WHILE */
    9 ~# _$ ]  y& ?/ N' U' C
  5.     /* USER CODE BEGIN 3 */: r. C1 |! n) N8 W- ]
  6.     HAL_Delay(1000);
    . {9 ^* f& Q+ X! d4 m" w$ k+ m/ D0 s
  7.     HAL_UART_Transmit(&huart1,&temp_buf,1,10);    //使用usart1串口每一秒发送字符m
    % B9 [7 p% Z, g2 L0 n7 ~
  8.   }
复制代码
/ H' F' }* t, V2 V, P+ ]( O
HAL_StatusTypeDef HAL_UART_Transmit(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout)
. h: L" G3 t9 G
3 I7 f# B5 Q$ k9 a+ r7 A- V
0 L" ^$ R. s8 `7 ]: {UART_HandleTypeDef *huart:指定串口,usart1就是&huart1。usart2就是改为&huart2。
4 f5 g- D+ B# \
" y2 v5 ^9 {% q8 e/ |1 Puint8_t *pData:就是要发送的数据! n: ~5 h6 W. k9 r8 }3 B* L- y

% x) U; g8 _0 a' q- Iuint16_t Size:单位为字节,至少要比发送数据长度要大。/ E6 b# b8 [" S9 u  Z9 A

" y& Q) J* E& ?% L& x! fuint32_t Timeout:超时时间
! h5 g: w# x- l5 k: B: X. J6 {7 M, X) A  f
第二种方法(printf)/ \( g6 B# R2 D" [5 e3 k) ~; P
在main.c文件中添加头文件) o$ ]1 _3 R. J9 Z! u+ }& C2 V
  1. #include <stdio.h>
复制代码

( L1 m; b$ l9 i% Smain.c文件中加入重定向函数 ,代码中添加了#ifdef宏定义进行条件编译,如果使用GUNC编译,则PUTCHAR_PROTOTYPE 定义为int __io_putchar(int ch)函数,否则定义为int fputc(int ch, FILE *f)函数2 ~) R' F) g9 `! [, P6 D
  1. /* USER CODE BEGIN 0 */
    " q) ]" Z: z5 O3 b6 T& Q' o  e+ f! R
  2. #ifdef __GNUC__& t5 O) ?4 A' U' J$ `- F9 c; q
  3.   /* With GCC/RAISONANCE, small printf (option LD Linker->Libraries->Small printf
    0 x# m% T1 a0 n8 P! C3 a
  4.      set to 'Yes') calls __io_putchar() */
    . J+ N) e( Z% Y" I7 M
  5.   #define PUTCHAR_PROTOTYPE int __io_putchar(int ch)) B( G$ |1 e' M! @1 E! x/ L
  6. #else9 x, S- A+ F0 K
  7.   #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)* R0 g' N6 i2 b& _& T, ?! e: ?7 w
  8. #endif /* __GNUC__ */$ [" ~, v+ K8 g" G  z' v! x
  9. /**
    ( A7 F. O4 U& X. l" S
  10.   * @brief  Retargets the C library printf function to the USART.
    3 t- s) _5 L  y, r+ W
  11.   * @param  None% q3 m, U) M2 X' [
  12.   * @retval None
    1 r5 U# r6 ^" d8 N
  13.   *// }; N8 M, Y7 O2 ]' [  c) o; p
  14. PUTCHAR_PROTOTYPE1 G* O& M! g7 r" ^1 O
  15. {
    ) v- z4 ?2 ^6 R0 a( Q# f
  16.   /* Place your implementation of fputc here */, c! v6 p* ?1 s. F
  17.   /* e.g. write a character to the EVAL_COM1 and Loop until the end of transmission */; s) X) B2 ~4 m7 \  F
  18.   HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xFFFF);
    ' C* m5 c; N) E" S/ [+ f: ~

  19. ( h  t# Z; d$ M) X
  20.   return ch;# ?6 s' B  D- T4 y
  21. }7 Z5 f3 j7 J& q
  22. /* USER CODE END 0 */
复制代码

0 K& G# U% P& |( x在int main主函数while循环中加入代码
- o/ n$ r( U# Q7 P0 c
  1.   while (1): |  F6 `* H; c% n. o
  2.   {
    ( j% D; v! }+ l+ l8 b3 M# k; w
  3.     /* USER CODE END WHILE */( J7 x) {; `5 Z' I
  4.     /* USER CODE BEGIN 3 */6 s1 q3 c1 [" L6 z% ?: T
  5.                 HAL_Delay(1000);              //延时一秒钟输出字符b
    + p1 J  C; X* ^" d  ~
  6.                 printf("b\r\n");               
    3 k4 @% B' Q. P8 m1 H- {
  7.   }) f; ]( q- c: O- ^* }- ]( J8 B- v
  8.   /* USER CODE END 3 */
复制代码
# Q) {6 t$ _) K- j5 q" |7 S3 x5 T
第三种方法(使用中断)
4 |+ S) e. |7 E2 p在CubeMX中,设置USART1全局中断使能,然后重新生成代码。, }5 O4 [4 c. e# a$ ]

% b& D' f" ~( `2 u/ J" O 20200502170333550.png " r) z( Z  W  v/ c$ c# S

% g! a- B3 C" j) b+ a在main.c文件中定义变量
( K6 b  o' m- X6 r; h
  1. uint8_t TX_Buff[]="THIS IS A MESSAGE!\r\n";        //发送缓存
    ( d, f2 M4 R- _) P
  2. uint8_t RX_Buff[2];                                //接收缓存
复制代码

9 m: T( O! C4 A! s5 t8 x3 q+ C9 v 在int main主函数中,MX_USART1_UART_Init();后面写入串口输出函数
4 j/ i/ [4 x2 j$ i
  1. HAL_UART_Transmit_IT(&huart1,TX_Buff,sizeof(TX_Buff));   //用于第一的串口输出信息
复制代码
9 J2 p- a% v9 h, X5 ]" l
在while(1)循环中,加入接收中断函数& a/ ?! S% T* t8 I; B1 C
  1. /*
    . f1 J/ M" j# _5 M
  2. *2表示缓冲字节,发送的字节数要于缓冲的一致。如果发送长度小于2,则等到2字节后再显示出来9 s+ v0 I& V: @4 e+ V" u
  3. */9 x. [. w& B4 W  y' u$ }' l3 L+ Z
  4. HAL_UART_Receive_IT(&huart1,RX_Buff,2);  
复制代码
      ( z7 Z$ q, A6 M5 @, c0 g# c: f% |4 b5 o
再int main函数后面写上中断回调函数. B6 w3 _" q" P4 {4 e3 t
  1. void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)+ n- v. _- `2 r5 a: {3 m
  2. {
    $ k4 d  ]8 X6 {  J- [
  3.         UNUSED(huart);3 h" E5 B* c$ W4 ^; w
  4.         HAL_UART_Transmit(&huart1,(uint8_t*)RX_Buff,2,100);        
    ; T/ X. J! V( {1 Z; ?
  5. }
复制代码
! g" g& Q" K3 d& |7 A4 v
编译,下载到开发板即可- T" L( c* k$ C" y+ o& i  v( x
* Z4 I9 W+ n- c0 V  [9 Z$ f1 @3 p! x) M
20200502225239316.png
- f0 J! z% H# z$ Q( Y% v
3 d3 S+ |8 F+ c! F————————————————
6 h1 ]' w) m, k6 e6 i! t9 M6 e版权声明:SCCELE1 V" N" c. {5 c$ H" u( G& `

- K' y- G( F# U+ z- d+ Z' O9 d2 Y4 d! [, R  Z( [7 L
收藏 评论0 发布时间:2022-10-31 11:10

举报

0个回答

所属标签

相似分享

官网相关资源

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