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

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

[复制链接]
STMCU小助手 发布时间:2021-11-8 17:15
芯片基本外设配置4 Q4 z1 |: b2 C  U5 Y0 L
在SYS里面开启Serial Wire调试接口  M4 S4 ~6 e) c3 A" V) D. l# a5 |
在RCC里面使能HSE (Crystal/Ceramic Resonator)
* m0 T+ i  Y" e! j; E2 D配置时钟树  i4 \- Z1 d$ ?# U$ Z) [* k
选中“HSE”、"PLLCLK",在HCLK(MHz)中输入64,回车,软件会自动配置数值。
1 ?$ f5 G. h( J. [/ S
( t# f: }$ h5 p, M+ i
20200502143029653.png
" t7 c: ?8 O9 d$ l
/ m9 c0 U+ U# J  Z6 M. {
配置USART1外设" D2 d6 \: @- V! ]6 ?0 q: S+ ^9 [
在connectivity选项卡中,选择"USART1",在mode中选择:Asynchronous(异步通讯)2 S: P3 a- B1 d4 X/ p
+ {4 F/ i$ Q2 T" a2 i
在“Parameter Settings”中设置基本参数,参数可以自定义,但是通讯双方一定要相同
8 i( M5 E% N+ r
( |  Z! _6 p0 x; F4 B+ X0 gBaud Rate(波特率):115200,常用有4800,9600。
# z$ k- G7 A5 f6 ?. b* u# T
- o, V; [& J( Z" t! C, u8 MWord Length(数据位):8,可选7、8、9
' {' T2 A9 q: j5 d3 l+ J
0 \% K+ O, @( b) mParity(校验位):None,可选None、Even、Odd
. c0 ^0 ?& b' j' `, `  B$ y4 i) M/ Y' H/ T8 W' s
Stop Bits(停止位):1,常用有1、2、0.5、1.5+ I3 j# \: p0 ?
0 t5 K4 n0 n$ q8 J. a1 e
其他参数默认值。: e0 H: I3 i9 y

2 b$ m8 x5 m! f2 X
20200502145229923.png

$ M1 o9 I$ I2 u8 d( {5 n
5 M. |: M# F( t/ b& g: }3 t 生成代码后,在MDK软件中打开,在debug中设置“Reset and Run”。& u3 v9 y; F& Y! h+ v$ O( Y8 Q

; z; ^5 o" |- ^: l+ m, K( w- H. s使用串口的三种方法(直接调用hal库、printf、中断方式)
1 e  g# j9 b' [; o3 d- [0 ?: l第一种方法(直接调用HAL库)
3 C5 F/ m/ h) O, ?7 ~1 \/ l3 `! d7 T 在int main()主函数中写入如下代码1 z" i; s4 c4 z" Z( u6 `
/ o: A: |+ T, I) J
  1. uint8_t temp_buf[1]="c";                         //定义一个数组,这个数组长度可以自定义
    2 ?2 ^6 P  u( s
  2. while (1)
    ' \  v8 ~6 w  R: W4 h
  3.   {
    - i- ~$ E- W$ E! F
  4.     /* USER CODE END WHILE */
    , P5 h0 `- z  O1 q
  5.     /* USER CODE BEGIN 3 */
    & G( s) C- `9 \
  6.     HAL_Delay(1000);) \, c: Z3 E8 s' O
  7.     HAL_UART_Transmit(&huart1,temp_buf,1,10);    //使用usart1串口每一秒发送字符c6 g* v; ?# v' y8 P$ V# y2 v( Y
  8.   }
复制代码
  1. uint8_t temp_buf=109;                         //定义整数,5 h0 N1 R8 W/ z8 S+ Q& P3 ?, w
  2. while (1)
    ) ]) a& i6 W7 A1 c# E* E
  3.   {
    : D) p. F0 I* T+ x
  4.     /* USER CODE END WHILE */
    ( N/ Y7 {( C8 A/ W0 J6 W8 L4 y/ D. n
  5.     /* USER CODE BEGIN 3 */- Q3 u6 O/ i% M! F5 n
  6.     HAL_Delay(1000);
    5 E4 w$ T! m$ K6 R2 b! |: y
  7.     HAL_UART_Transmit(&huart1,&temp_buf,1,10);    //使用usart1串口每一秒发送字符m
    3 U; R: t) H9 K$ S  q! ^% g
  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>
复制代码
/ K( W5 K% \7 \8 J( D* }
UART_HandleTypeDef *huart:指定串口,usart1就是&huart1。usart2就是改为&huart2。
6 H# p3 j1 N) X/ ?
1 _5 ~, z8 J8 Fuint8_t *pData:就是要发送的数据6 g2 G& {" g  z2 {% {

4 n% h. i9 L; h) h4 o: Fuint16_t Size:单位为字节,至少要比发送数据长度要大。* |  v+ N( L& H, I; A, k

# j$ f7 H# h& y3 vuint32_t Timeout:超时时间
& V; I9 K8 @8 q( C
/ u  c% P# {- X9 u+ I/ S第二种方法(printf), p! t; k; n6 H5 I. L
在main.c文件中添加头文件" D1 @6 g% D0 A* G
  1. #include <stdio.h>
复制代码
3 _; V5 W4 Z) l, h; R
main.c文件中加入重定向函数 ,代码中添加了#ifdef宏定义进行条件编译,如果使用GUNC编译,则PUTCHAR_PROTOTYPE 定义为int __io_putchar(int ch)函数,否则定义为int fputc(int ch, FILE *f)函数) d+ P6 X  A. j0 E/ d% C! L4 f8 {) [
  1. /* USER CODE BEGIN 0 */9 _- p6 g5 V8 L+ L
  2. #ifdef __GNUC__
    & _! F6 j3 Z. M  O( z9 S
  3.   /* With GCC/RAISONANCE, small printf (option LD Linker->Libraries->Small printf2 M$ `9 }# X) U- a* M
  4.      set to 'Yes') calls __io_putchar() */9 q) @  O7 n8 W" L& Z- m) |/ b: u$ n
  5.   #define PUTCHAR_PROTOTYPE int __io_putchar(int ch), g$ G; ?) A5 p8 ^5 l% a2 L
  6. #else
    5 ]: g4 d8 U. W
  7.   #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)' r/ i" I) H1 m- n
  8. #endif /* __GNUC__ */- ~. a0 y' E9 ~) N8 f7 E( V4 z
  9. /**
    4 i/ j9 R$ i# q/ V7 x
  10.   * @brief  Retargets the C library printf function to the USART.8 n+ x. f. E0 E* l
  11.   * @param  None
    ) @: H. `4 a' L+ D
  12.   * @retval None8 ~1 E, p" i% @
  13.   */
    : h# [4 d. k' |: x+ m* b
  14. PUTCHAR_PROTOTYPE
    : ?1 e8 l  ^3 _# a: w( W) G
  15. {
    / z+ @! j, }" `$ v; A4 x3 [
  16.   /* Place your implementation of fputc here */
    % Q8 y+ Q, _: r& ~9 n" d
  17.   /* e.g. write a character to the EVAL_COM1 and Loop until the end of transmission */' H; s7 F3 r" W) N0 k( H
  18.   HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xFFFF);
    $ }! j6 y4 W( b* y
  19. & [( a1 M7 p$ u/ E( y" Z
  20.   return ch;
    4 ^9 ^9 h8 b1 w% m6 A+ L
  21. }
    5 u* e$ q0 T* r  o! z3 h
  22. /* USER CODE END 0 */
复制代码

/ w; g1 M/ z# W; Q. F; ?在int main主函数while循环中加入代码 $ ?7 s. t" B* }
  1. while (1)) z! {0 C! C- L) ?+ g
  2.   {
    " p1 N& P# T& f) _  B& w
  3.     /* USER CODE END WHILE */! F6 Y' x$ u1 u% f7 s; e
  4.     /* USER CODE BEGIN 3 */8 |3 ~& H/ w* H- d8 X
  5.                 HAL_Delay(1000);              //延时一秒钟输出字符b
    : B1 m! s' b8 t/ y( e) ~
  6.                 printf("b\r\n");                ! X3 A- s7 d  u. b6 }3 z. U
  7.   }
    3 o9 b1 S. ^4 |( @8 ?* t' M( y3 m
  8.   /* USER CODE END 3 */
复制代码

: E4 z6 a0 q. B1 v9 k  q: t2 P第三种方法(使用中断)
/ x6 F3 v" a, U: U在CubeMX中,设置USART1全局中断使能,然后重新生成代码。4 F! i; a# S2 c8 a7 r, a

2 J; l1 ]# R- I, w6 ]' F( _
20200502170333550.png
# I. \7 J7 c8 E7 {6 i! ?& l
! S2 D/ S" _( v% S/ D, P
在main.c文件中定义变量
# R0 J$ Z/ f+ B. }, W8 G# P& N
  1. uint8_t TX_Buff[]="THIS IS A MESSAGE!\r\n";        //发送缓存; k! D: S8 Z! Q- p8 o7 n* {5 x' b! Z+ k
  2. uint8_t RX_Buff[2];                                //接收缓存
复制代码
% Z) b# r4 T; I: b% j1 w: z
在int main主函数中,MX_USART1_UART_Init();后面写入串口输出函数
( V2 c3 ], g) D! Z; F
  1. HAL_UART_Transmit_IT(&huart1,TX_Buff,sizeof(TX_Buff));   //用于第一的串口输出信息
复制代码
0 W0 g& k- M5 V; }) A
在while(1)循环中,加入接收中断函数/ V  G9 R- F' |' A& e  F# v
  1. /*4 f$ ]# |4 i. n+ i; n8 y
  2. *2表示缓冲字节,发送的字节数要于缓冲的一致。如果发送长度小于2,则等到2字节后再显示出来' j9 \2 _/ m) N) i% t
  3. */: m4 e" p. v5 q! W
  4. HAL_UART_Receive_IT(&huart1,RX_Buff,2);         
复制代码
  R0 T- P6 E0 N
再int main函数后面写上中断回调函数
  `3 F0 P! w5 q, V
  1. void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)/ K# T+ v  C* D
  2. {
    ; d( ]2 H0 e( X3 T* j7 f* |4 X  |
  3.         UNUSED(huart);! T& q/ f+ }4 b! l2 m
  4.         HAL_UART_Transmit(&huart1,(uint8_t*)RX_Buff,2,100);        ( c/ L  Y* T4 P  E
  5. }
复制代码
* e- _3 u& }: K9 I( O# C$ d8 X
编译,下载到开发板即可
) i6 V( n% r- ~& r* S: A% b: D8 r0 d( U- ~* r1 a) }

! I+ |. o7 G; |' x
" L# I7 L1 H3 ^7 P4 E2 z
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管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版