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

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

[复制链接]
STMCU小助手 发布时间:2021-11-8 17:15
芯片基本外设配置
' {  o9 M6 ]: A" g' Y9 H! S& k在SYS里面开启Serial Wire调试接口
9 f# u4 k3 c* ]2 D( Y  R  w% W在RCC里面使能HSE (Crystal/Ceramic Resonator)$ Q: x8 ^$ r5 i/ g% Z2 y
配置时钟树) A' S, m9 ]/ j3 p
选中“HSE”、"PLLCLK",在HCLK(MHz)中输入64,回车,软件会自动配置数值。
; ?* G, r( n; S4 f( k$ U
. W# O2 a' t* z. }' j
20200502143029653.png
3 ~+ F! p  o3 m  _

) }+ ?/ C3 ^" s% s 配置USART1外设, E, |6 r+ W4 D
在connectivity选项卡中,选择"USART1",在mode中选择:Asynchronous(异步通讯)
2 s- x% d' a  C$ f( K. X: B& d0 ?4 q
在“Parameter Settings”中设置基本参数,参数可以自定义,但是通讯双方一定要相同
: y5 o- R% ~6 }9 p% @# F0 v# |
- E8 g' ]( _' r' G" JBaud Rate(波特率):115200,常用有4800,9600。/ s& U) r  E5 H# G' _" W. v

1 r' R- c1 q& H# b" b7 q" JWord Length(数据位):8,可选7、8、9/ r  }" g. n6 e3 S

7 v' m4 {5 q. G& uParity(校验位):None,可选None、Even、Odd) J9 B. ^  R, b7 P
5 [+ d+ L+ z0 o& {  w
Stop Bits(停止位):1,常用有1、2、0.5、1.5( u+ \4 m% @. e' g' ]9 C- |4 K- `

2 d" [2 ?: P  `其他参数默认值。
" j' k1 p; V5 G; N
  u& V9 g, C7 ]. P
20200502145229923.png

( \/ b. i% S* K2 r
* }: R. T2 q+ V3 ^+ T" v 生成代码后,在MDK软件中打开,在debug中设置“Reset and Run”。
6 \. t) c7 T, M. Q6 S0 ~4 V: ]& x, g( ^9 Y. t: W1 r! d
使用串口的三种方法(直接调用hal库、printf、中断方式)" T7 b! D2 ~& u$ {" b
第一种方法(直接调用HAL库): s! c% b/ z4 {! [' E; @9 d% Z. n
在int main()主函数中写入如下代码
* v: U% E( P$ M/ m5 y; [' }0 {8 y$ l9 q8 w& I/ Z
  1. uint8_t temp_buf[1]="c";                         //定义一个数组,这个数组长度可以自定义
    6 L1 x6 a! s) V% e/ f: d, b3 K5 W
  2. while (1)* y* |; h& o' y" t
  3.   {6 ]" }+ m/ Q7 V( {6 x- s+ p
  4.     /* USER CODE END WHILE */
    : [- j: j5 L: D9 y# q) j, L
  5.     /* USER CODE BEGIN 3 */
    ; g; l( ]7 Z; ^6 X+ U% w
  6.     HAL_Delay(1000);6 x& ]' t& r% z) f
  7.     HAL_UART_Transmit(&huart1,temp_buf,1,10);    //使用usart1串口每一秒发送字符c4 [% d( x: L9 e
  8.   }
复制代码
  1. uint8_t temp_buf=109;                         //定义整数,
      e0 i) j; X2 _" @& n
  2. while (1)( l& ^* L* f8 q1 U) q9 c, Q) |
  3.   {
    3 S3 _0 t$ X' t2 y6 O+ `& J; ~
  4.     /* USER CODE END WHILE */
    4 W0 p6 X- _/ }5 W
  5.     /* USER CODE BEGIN 3 */
    + E4 B* s. J+ r3 ?& T) `
  6.     HAL_Delay(1000);
    6 D1 N' f' B/ g! M/ }4 H
  7.     HAL_UART_Transmit(&huart1,&temp_buf,1,10);    //使用usart1串口每一秒发送字符m4 ~0 v2 Z* J* t, h, U+ A
  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>
复制代码
, o0 g  E4 C* B% I. S
UART_HandleTypeDef *huart:指定串口,usart1就是&huart1。usart2就是改为&huart2。
+ U" H9 Q7 e$ T$ T1 A
4 d3 B% ^6 Q+ _" @) quint8_t *pData:就是要发送的数据- h( v7 s$ F( R6 d# A+ n

! J2 F( u' ]: j- |uint16_t Size:单位为字节,至少要比发送数据长度要大。9 j" R# ?/ Y+ L
6 Y) V! q% V9 f% \
uint32_t Timeout:超时时间
! w5 |7 B# w% x" K9 w7 l
+ o6 |4 p/ o$ Y1 Z: J. M第二种方法(printf)
' Y# O0 v: D8 T6 H( b) B在main.c文件中添加头文件
! ?2 ?$ ^/ A4 H
  1. #include <stdio.h>
复制代码
# y8 B" }; K  c) G
main.c文件中加入重定向函数 ,代码中添加了#ifdef宏定义进行条件编译,如果使用GUNC编译,则PUTCHAR_PROTOTYPE 定义为int __io_putchar(int ch)函数,否则定义为int fputc(int ch, FILE *f)函数/ F# V. U" L/ J$ V3 a" X8 G
  1. /* USER CODE BEGIN 0 */
    " G: V# j4 q& @0 m9 ]
  2. #ifdef __GNUC__) B- d  Y+ E! s, l* R1 Z
  3.   /* With GCC/RAISONANCE, small printf (option LD Linker->Libraries->Small printf% `  `* L' q+ a; e3 M! e
  4.      set to 'Yes') calls __io_putchar() */% t; r, k( ?3 P
  5.   #define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
    / `/ f" h+ i  T# D/ n2 |
  6. #else; ~. L+ w/ j6 N( \. f9 b+ _
  7.   #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)! W  F4 F0 l: J$ u6 e  J" M/ P# z1 ?
  8. #endif /* __GNUC__ */
    + w4 T3 e, `/ K4 g
  9. /**
    ' i1 J' @) j9 r6 l1 ^6 w
  10.   * @brief  Retargets the C library printf function to the USART.
    ) P' i- a; @$ F8 p% @" y* y% \8 G7 _: {
  11.   * @param  None
    : X% D$ M! Z  x0 ?: x
  12.   * @retval None
    ! @0 T6 Q; t/ J( Y0 [  ^
  13.   */* J1 G2 B; J- f0 `6 \5 t/ O4 c
  14. PUTCHAR_PROTOTYPE
    0 w4 d+ L% A0 i0 I# f
  15. {
    1 v2 h  ?2 Q) @5 i, n
  16.   /* Place your implementation of fputc here */
    1 K( ^$ F1 K6 p# _) d% Z9 H4 s2 ]
  17.   /* e.g. write a character to the EVAL_COM1 and Loop until the end of transmission */; m4 {" N2 \  c0 {
  18.   HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xFFFF);
    : }* V9 L- n; k% s6 h7 K

  19. 7 ~7 ]5 m! h$ A8 q. t, C7 e
  20.   return ch;
    ( Y6 c& {2 E( I9 t
  21. }2 {2 T2 a$ X5 p, n0 [4 t& y- q# G
  22. /* USER CODE END 0 */
复制代码
4 U( ~, D2 P9 `/ d0 y
在int main主函数while循环中加入代码 % U0 D+ _5 |4 i, k  F; n( c6 x/ t. v
  1. while (1)
    - c  y  t1 m/ n5 f
  2.   {
    ( v$ ^7 m- N2 A! ~. w
  3.     /* USER CODE END WHILE */+ _5 P, h; U) u/ q- \9 @. t
  4.     /* USER CODE BEGIN 3 */
    0 ^3 X" I1 L0 A' U0 r% M3 R0 L
  5.                 HAL_Delay(1000);              //延时一秒钟输出字符b% S8 {; }* o" {- [$ ], w7 n
  6.                 printf("b\r\n");                $ \) \/ _, _! V  c- x
  7.   }! [! @4 T5 {, d+ v% a6 ~$ v/ r3 f
  8.   /* USER CODE END 3 */
复制代码
2 h- c9 K1 a2 A0 K& z! \$ v
第三种方法(使用中断) $ n, Y  N( G  L( _3 p# H2 D  g
在CubeMX中,设置USART1全局中断使能,然后重新生成代码。
+ U! L: G3 @0 c# W7 o6 p' p5 m" ^- V! x8 E8 r% v8 w
20200502170333550.png
, I! H6 W8 X- U9 f. Z* i
2 j' e) a1 L4 b/ S4 f/ G
在main.c文件中定义变量
' V+ g$ g6 K5 L* [; [
  1. uint8_t TX_Buff[]="THIS IS A MESSAGE!\r\n";        //发送缓存- z; K! m0 |9 J' N$ l$ X: {$ c2 ]
  2. uint8_t RX_Buff[2];                                //接收缓存
复制代码

! k, [3 O, e, P, O9 Q 在int main主函数中,MX_USART1_UART_Init();后面写入串口输出函数; G+ }# o, \* s) E* C
  1. HAL_UART_Transmit_IT(&huart1,TX_Buff,sizeof(TX_Buff));   //用于第一的串口输出信息
复制代码
# o/ i: e9 y: S2 P( k$ M4 v
在while(1)循环中,加入接收中断函数
% _2 A2 H5 E5 X' l
  1. /*# h3 j- g  l6 w3 u2 i7 {( v
  2. *2表示缓冲字节,发送的字节数要于缓冲的一致。如果发送长度小于2,则等到2字节后再显示出来
    / L) e" Y+ j- S( Q1 Z: a
  3. */
      q/ ?: ]1 ^$ S
  4. HAL_UART_Receive_IT(&huart1,RX_Buff,2);         
复制代码

2 U( t1 s! y: Q1 h8 n再int main函数后面写上中断回调函数
8 N5 j8 A4 o% ^) Q
  1. void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
      [$ `  Z1 }1 K
  2. {
    - q  g& t4 T& C3 C% f: s
  3.         UNUSED(huart);1 }0 X) K  E4 D% d- W) z4 {
  4.         HAL_UART_Transmit(&huart1,(uint8_t*)RX_Buff,2,100);        " n9 M" L- u. k* z+ i/ s( x
  5. }
复制代码
+ R8 f) r+ `2 g7 D
编译,下载到开发板即可
  {( I$ Q- i$ f1 e2 \. C
& i  ?$ ?' F# b
+ \$ B* s5 ?9 G3 L$ Z- o% k4 s+ x7 B  B( h* P6 y: c' r3 ^% d
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管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版