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

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

[复制链接]
STMCU小助手 发布时间:2022-10-31 11:10
芯片基本外设配置2 L* p- _' b+ o, G8 ]( x
在SYS里面开启Serial Wire调试接口' ]1 A/ r* |% g: {
在RCC里面使能HSE (Crystal/Ceramic Resonator)
- s5 B0 q7 ]) k( f配置时钟树
% K4 o: B7 w0 i- K' h1 Q, l
选中“HSE”、"PLLCLK",在HCLK(MHz)中输入64,回车,软件会自动配置数值。# m5 U7 D# Z8 ]* D- Y# A

+ u0 `* z& a  l$ V+ q 20200502143029653.png ' ~# I3 ?9 R  N& X& w) ]7 ?$ C; C- v

# ^, V5 {; g+ `0 u* r: A. { 配置USART1外设
4 U. o( J) o1 K. z/ k* z在connectivity选项卡中,选择"USART1",在mode中选择:Asynchronous(异步通讯)* G' [" O% B- R+ k& r- r+ B
4 y! x4 I* {( a/ j; b
在“Parameter Settings”中设置基本参数,参数可以自定义,但是通讯双方一定要相同$ W, ?% u1 d7 a9 `6 k0 o7 T9 _! J( D% }! c

$ S& \6 G" V" E) F5 E  mBaud Rate(波特率):115200,常用有4800,9600。( l5 l: I$ O/ D9 Z& E2 S' H
9 W  E% o2 R7 A$ t- n1 |
Word Length(数据位):8,可选7、8、9
4 i( C* G  D2 V/ ?0 B6 s* z1 f& X5 i% N5 `" n! w
Parity(校验位):None,可选None、Even、Odd
+ |. P' x& W$ W  l( T1 A* J  y- b; a# n% q3 I
Stop Bits(停止位):1,常用有1、2、0.5、1.5  f+ A7 W9 D' h2 F$ Q( A

) A5 ?- [' a4 o) b$ A, [# D其他参数默认值。) ?5 \) J/ Z0 }6 _
5 A7 o+ W' u- {, K! u8 n
20200502145229923.png
7 R' W" [3 q3 c) g6 |4 l0 {& O" n: m# W. e% ~
生成代码后,在MDK软件中打开,在debug中设置“Reset and Run”。
4 \4 k9 Z% w+ U4 A5 K: P) f8 l
( ?7 i2 e$ ]; c! [2 u* i. B. z: R0 Q使用串口的三种方法(直接调用hal库、printf、中断方式)& X3 f7 m! M7 h. \, q' U9 i* R( I
第一种方法(直接调用HAL库)
4 y) `! `6 W* m1 Y+ D7 ^; |
在int main()主函数中写入如下代码
& P* z2 c8 j7 f, J6 }7 I2 ]3 J8 k9 _; F5 h; @
  1. uint8_t temp_buf[1]="c";                         //定义一个数组,这个数组长度可以自定义+ D# D; F" @) c5 c  d/ |
  2. while (1)
    6 Y8 ?6 N3 m# s
  3.   {
    / @2 k$ w, \/ M* T$ e
  4.     /* USER CODE END WHILE */* r. T+ I' `! ^3 ]
  5.     /* USER CODE BEGIN 3 */. `5 Z# O# I+ z: o, x- o
  6.     HAL_Delay(1000);1 w$ `: m% a: D. L5 b; z4 O
  7.     HAL_UART_Transmit(&huart1,temp_buf,1,10);    //使用usart1串口每一秒发送字符c/ L' }6 Z  L( h# E
  8.   }
复制代码
  1. uint8_t temp_buf=109;                         //定义整数," U+ Q0 F: o7 L, V1 z
  2. while (1)
    3 d- h! u; |0 |" |. D
  3.   {- ?4 H6 {% H, Y2 O
  4.     /* USER CODE END WHILE */
    , |7 B! L9 \0 e
  5.     /* USER CODE BEGIN 3 */9 `0 D, g& ?5 }- V! m* v! l
  6.     HAL_Delay(1000);
    # Q1 F. P" m: |% i* P" V- }3 j) c
  7.     HAL_UART_Transmit(&huart1,&temp_buf,1,10);    //使用usart1串口每一秒发送字符m
    ' {$ m; @6 j6 d% Z) ^
  8.   }
复制代码

2 Z) t) m. Y* D- N: l) _1 JHAL_StatusTypeDef HAL_UART_Transmit(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout)
, h3 E- O. L0 M7 W8 l1 E
8 ]$ N1 f( d& o
: p( w- e* u/ z2 R2 JUART_HandleTypeDef *huart:指定串口,usart1就是&huart1。usart2就是改为&huart2。
. f. l! x% H" L: I4 W+ _' d+ a$ F2 E4 p9 V/ p* y# u. B" r
uint8_t *pData:就是要发送的数据+ G/ X4 ?$ l" |" C. V
) y$ W& Y+ j% V1 R& h6 S
uint16_t Size:单位为字节,至少要比发送数据长度要大。* Z8 B) T/ q4 B, p7 w
4 t' a) p8 v2 D3 ^0 Q' K% I
uint32_t Timeout:超时时间
$ y& e6 k& {  r6 T# F! I) Z7 `  H$ G. r2 e+ L) ~# I4 L
第二种方法(printf)
5 @% ?' M4 K+ ~$ \$ A2 C在main.c文件中添加头文件7 t( r/ n+ m& g% v+ G0 {" x/ u. c
  1. #include <stdio.h>
复制代码

8 f3 Q2 @! i6 r9 B" R$ ]# ]2 nmain.c文件中加入重定向函数 ,代码中添加了#ifdef宏定义进行条件编译,如果使用GUNC编译,则PUTCHAR_PROTOTYPE 定义为int __io_putchar(int ch)函数,否则定义为int fputc(int ch, FILE *f)函数
/ A$ W0 K3 P' K0 n
  1. /* USER CODE BEGIN 0 */4 F0 c. \# ?$ y
  2. #ifdef __GNUC__
    9 Y3 J8 v  C& I8 B
  3.   /* With GCC/RAISONANCE, small printf (option LD Linker->Libraries->Small printf
    ! A  o2 ]1 b( z5 J5 c
  4.      set to 'Yes') calls __io_putchar() */
    - l& I* P: _+ ^% |1 L: |% s- U5 K
  5.   #define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
    & U1 ~4 [" }6 |+ o% p+ S
  6. #else. R. x* J3 ~  q
  7.   #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)8 ?* z* O( g9 g" h9 _" y
  8. #endif /* __GNUC__ */
    ' `2 ]/ F+ h( _* z+ o  j6 Y: L
  9. /**
    * u$ T! i; w& }! V( v
  10.   * @brief  Retargets the C library printf function to the USART., O0 Z, V. x# ]
  11.   * @param  None0 x3 T# Z9 @2 s# e+ g; d- Z
  12.   * @retval None, j; u  z" j$ K' h
  13.   */1 X) U6 E6 j8 |4 X
  14. PUTCHAR_PROTOTYPE' c' V* R; Q$ Z; r+ O! t- O
  15. {: a, w& f8 ^  Z& D$ [0 V
  16.   /* Place your implementation of fputc here */
    * F0 ]; H. Y  Y! ^7 w) c
  17.   /* e.g. write a character to the EVAL_COM1 and Loop until the end of transmission */
    ; |2 z' U( R% {2 U
  18.   HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xFFFF);
    ) U) J! J6 B: x% o9 P2 T
  19. $ L: m9 W0 ~1 t5 r& F9 Z6 H& Z( ]9 ?
  20.   return ch;
    # [' F# [8 R4 N( v" t4 s7 T. }
  21. }
    / B3 x* g  Y( y+ L. |( X
  22. /* USER CODE END 0 */
复制代码
, i; J, u" e. A5 T
在int main主函数while循环中加入代码
: {9 |/ K! l6 Q( K  |
  1.   while (1)
    ( Q- i# ]* q: F3 m  H) t* G
  2.   {% ~3 S' L$ F* L; E2 f$ \
  3.     /* USER CODE END WHILE */1 h4 w1 n- k' T4 X; z5 A7 E5 q
  4.     /* USER CODE BEGIN 3 */3 U4 X1 Y' x2 g+ ]& g+ C- {
  5.                 HAL_Delay(1000);              //延时一秒钟输出字符b
    3 \& ]0 Q0 J; W1 e
  6.                 printf("b\r\n");                ; j4 [7 R5 F9 t
  7.   }1 U/ B; u! I, Y) i8 @0 D
  8.   /* USER CODE END 3 */
复制代码
# a) d' V4 a! m1 r3 E: f, u# o
第三种方法(使用中断)
$ U$ W- P" E* ]: l$ r- l在CubeMX中,设置USART1全局中断使能,然后重新生成代码。
; R3 @/ q; |; \' ^( b$ U+ N, ]$ U5 e4 I- n4 n) M, t
20200502170333550.png - g0 X1 T* q8 A/ Q
9 ?0 y( ?, F. F) V/ S
在main.c文件中定义变量
/ A" S0 D7 b, J$ F; B( K
  1. uint8_t TX_Buff[]="THIS IS A MESSAGE!\r\n";        //发送缓存0 ?; b- E2 O* l  H
  2. uint8_t RX_Buff[2];                                //接收缓存
复制代码

" B* R! N! ]$ q+ d, F 在int main主函数中,MX_USART1_UART_Init();后面写入串口输出函数
5 z/ X' z6 @5 L! B1 w
  1. HAL_UART_Transmit_IT(&huart1,TX_Buff,sizeof(TX_Buff));   //用于第一的串口输出信息
复制代码

; _6 t% X/ V4 G: P' D* U1 W 在while(1)循环中,加入接收中断函数
/ n9 R2 ~* ~5 ^5 U3 G: T' ]
  1. /*
    ! v- C* F" G: y0 H% a, F9 p
  2. *2表示缓冲字节,发送的字节数要于缓冲的一致。如果发送长度小于2,则等到2字节后再显示出来
    9 x  p. C0 D5 H+ h+ M
  3. */6 u8 h) j0 ~% a$ v* k; J
  4. HAL_UART_Receive_IT(&huart1,RX_Buff,2);  
复制代码
      
8 N8 b5 R1 r+ H. @. ~" W+ |8 P$ O再int main函数后面写上中断回调函数
1 I$ P6 k7 {8 c7 I
  1. void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)# f6 s8 s  P- S; `9 Q
  2. {* W1 V8 t0 B5 G1 r4 k& a' B! K
  3.         UNUSED(huart);
    * P* P: P- X! Z; v1 i
  4.         HAL_UART_Transmit(&huart1,(uint8_t*)RX_Buff,2,100);        " A1 _0 r; b' c' H, [3 A' b
  5. }
复制代码
, [/ f. G3 Y0 J- J
编译,下载到开发板即可
7 V0 B; S) R. \( |6 m* j$ Z6 s3 z$ |' B* J% Z2 x0 ^
20200502225239316.png ; |4 n0 }% s- O* f3 y9 \$ \- G

4 m- Y6 h; h# N( n1 |! G, I8 C7 ]————————————————* \+ P0 z& d3 k) M! c% A
版权声明:SCCELE& I$ W1 H8 a2 s$ @5 G1 d) X" U% O, O6 N
% f* |/ Y% F: K/ Y; E  q# r7 x% d' E2 L

% A. A. p/ [) J
收藏 评论0 发布时间:2022-10-31 11:10

举报

0个回答

所属标签

相似技术帖

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版