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

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

[复制链接]
STMCU小助手 发布时间:2022-10-31 11:10
芯片基本外设配置1 ]3 v. K* Z/ x# u
在SYS里面开启Serial Wire调试接口
+ p; O( T. S& l在RCC里面使能HSE (Crystal/Ceramic Resonator)0 d, `' u+ w  [; e* x- Y
配置时钟树
; A! f9 f0 t1 A# O7 L" ?/ Z& ^5 n! P
选中“HSE”、"PLLCLK",在HCLK(MHz)中输入64,回车,软件会自动配置数值。
3 y9 J7 R( V' z6 P( D  \$ D  c+ S0 p* h* U5 ]
20200502143029653.png 7 b! N+ Y; T& G

- D5 w" |2 }3 b, r: `( u$ o 配置USART1外设" ~; ?5 ~$ @5 k9 M% c3 Q, |
在connectivity选项卡中,选择"USART1",在mode中选择:Asynchronous(异步通讯)% g9 a& J  C! `+ Z& D/ P

! c9 d% `1 O# v4 L' I* `4 h2 m4 Q. b在“Parameter Settings”中设置基本参数,参数可以自定义,但是通讯双方一定要相同
% ?; g9 Q/ A; b; l
+ C+ B" z& M# d: u+ J8 Z* B0 eBaud Rate(波特率):115200,常用有4800,9600。
1 U: |1 O2 m/ t% r( D0 ?7 L
% Z) ]. [" N, G* `Word Length(数据位):8,可选7、8、91 T+ u# H% R. h* v1 @

4 d" L, i3 M$ S: I  ]. VParity(校验位):None,可选None、Even、Odd
% ]5 r) v) n# Y' q' M: y" Y! K6 _7 O/ L  [4 S0 d+ W
Stop Bits(停止位):1,常用有1、2、0.5、1.5
! D7 n+ R! s# t2 q  d
; A0 L) _; H8 G! H" y. y- ?其他参数默认值。
# r4 l2 I$ f& j  e+ a% O3 e' F% m, C3 q5 c+ g. c
20200502145229923.png
( T; q2 h+ G/ C# T- l- R! g+ p7 G0 }0 T% M5 }& I& t0 X* e( c
生成代码后,在MDK软件中打开,在debug中设置“Reset and Run”。/ F/ l: d5 \+ `7 \0 ]6 T

; Q) ?6 I1 }: u3 c# P4 O1 H8 H0 t使用串口的三种方法(直接调用hal库、printf、中断方式)
: c, @6 H6 x& F& Y第一种方法(直接调用HAL库)
: Q1 `" j& F- P
在int main()主函数中写入如下代码4 M, J7 d' T" ~+ c4 y
' x, @, B$ ~1 C' b
  1. uint8_t temp_buf[1]="c";                         //定义一个数组,这个数组长度可以自定义
    2 ]& Z: ?2 ?' n% }, N5 \
  2. while (1)
    % a9 B$ A3 C) u  d2 v2 m: ~
  3.   {" v5 J, J8 h4 C# w1 h' a( [6 V7 K
  4.     /* USER CODE END WHILE */% K, L' g0 {2 n4 H% w
  5.     /* USER CODE BEGIN 3 */, K! ^4 J5 C) H+ x
  6.     HAL_Delay(1000);8 [+ D& O* r* O; v# K
  7.     HAL_UART_Transmit(&huart1,temp_buf,1,10);    //使用usart1串口每一秒发送字符c2 c( F$ ^# w9 R) C3 M
  8.   }
复制代码
  1. uint8_t temp_buf=109;                         //定义整数,
    " Y' `  v# J& U* X
  2. while (1)
    - H  O  B5 M% b; W: q
  3.   {, C& b  U- J5 \  r$ K9 n) A& s# v# v* j
  4.     /* USER CODE END WHILE */
    9 [# q' N0 _+ D2 l$ Y
  5.     /* USER CODE BEGIN 3 */
    ! ^2 p( ~) m8 T2 t# S9 w
  6.     HAL_Delay(1000);$ O7 H) c; m: _& p- [
  7.     HAL_UART_Transmit(&huart1,&temp_buf,1,10);    //使用usart1串口每一秒发送字符m, p) ^; m+ K; g: W2 v* ]- s; [
  8.   }
复制代码

+ h; @; Y7 |0 C5 [HAL_StatusTypeDef HAL_UART_Transmit(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout)# |# L0 |( D( w- F: j
8 @# S7 a2 l2 {# d6 {; [4 x

, o% O, w! V! w0 F1 n6 bUART_HandleTypeDef *huart:指定串口,usart1就是&huart1。usart2就是改为&huart2。+ h4 F' h: @  c7 f5 S

& O: }  G/ E8 Quint8_t *pData:就是要发送的数据
: ?. I/ E6 e% S  g( p" _* I! _' g! s. P$ P
uint16_t Size:单位为字节,至少要比发送数据长度要大。
! Q1 l/ F6 D" L7 @, S& }( W, o. }
$ l8 d  d1 |; m( U9 [uint32_t Timeout:超时时间
0 B" k+ O+ C7 \( B7 \% k) z1 |/ p; |) W. A4 o8 ]
第二种方法(printf)* H0 T7 @# [3 r* V' ]
在main.c文件中添加头文件% p1 Y( n3 l2 x' |5 |
  1. #include <stdio.h>
复制代码
+ [: e: p3 g7 p' b) k6 v- ?
main.c文件中加入重定向函数 ,代码中添加了#ifdef宏定义进行条件编译,如果使用GUNC编译,则PUTCHAR_PROTOTYPE 定义为int __io_putchar(int ch)函数,否则定义为int fputc(int ch, FILE *f)函数
7 v7 X  G! P8 Q, G
  1. /* USER CODE BEGIN 0 */: }; `1 Z, t8 ?( d
  2. #ifdef __GNUC__
    ' n# I( N1 d  @! v
  3.   /* With GCC/RAISONANCE, small printf (option LD Linker->Libraries->Small printf& k" _, B! [9 N. v
  4.      set to 'Yes') calls __io_putchar() */
    4 e; V" x4 v  Y' s8 E0 Y7 g
  5.   #define PUTCHAR_PROTOTYPE int __io_putchar(int ch)0 U2 M# u- n4 G+ a, ~
  6. #else
    * K2 V# F1 Z4 i6 n) a; O
  7.   #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)& R& R% g2 z) [, w4 i
  8. #endif /* __GNUC__ */% _, p. t/ L; l' m- F2 f# }! O
  9. /**9 |. U, Q- \; @( F. k
  10.   * @brief  Retargets the C library printf function to the USART.6 p; [3 `7 o& }* i
  11.   * @param  None
    5 T) F' g. ?; K( r
  12.   * @retval None
    ) T% a. A( |" f* \
  13.   */9 `  p) \' N% C7 A+ N7 e7 f: H, t0 _
  14. PUTCHAR_PROTOTYPE
    $ i  y, }6 ]) b' Y+ O, s
  15. {
    * k1 n: r4 K0 ?0 q# [
  16.   /* Place your implementation of fputc here */
    4 G2 P/ m+ L0 }
  17.   /* e.g. write a character to the EVAL_COM1 and Loop until the end of transmission */
    5 j/ ?4 O9 N0 g3 _5 L
  18.   HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xFFFF);8 v: Y' {2 Y8 Z; W1 ?  i
  19. 9 u8 }- r; G8 ~
  20.   return ch;/ ^; i& A, P) c* |6 X) @
  21. }2 H" h9 o0 c2 I2 [7 y8 X# R
  22. /* USER CODE END 0 */
复制代码

% T/ V- n0 P+ c$ z; U在int main主函数while循环中加入代码 , H# u0 J" j4 I, D0 T" K) \5 o& O
  1.   while (1)
    , C5 K) x7 n/ `, B3 m" L
  2.   {
    - n& c+ K7 E. [2 {
  3.     /* USER CODE END WHILE */: m$ m  P( e& G( X
  4.     /* USER CODE BEGIN 3 */
    5 n8 }% I* A$ g# z
  5.                 HAL_Delay(1000);              //延时一秒钟输出字符b& n$ L/ I) F- g5 y
  6.                 printf("b\r\n");               
    3 A+ F/ s- ~  `
  7.   }
    % T$ ?" b: t  d& Y4 |5 }
  8.   /* USER CODE END 3 */
复制代码

" n. d0 l5 a1 i4 \$ r- t& m2 f第三种方法(使用中断)
5 J2 U% |5 L" q4 ^在CubeMX中,设置USART1全局中断使能,然后重新生成代码。0 x4 N/ q) n6 B  ~

# N$ m* J- d1 d% s9 w& V1 L  f, a 20200502170333550.png
; C0 I( Q2 y& T' {, z% d  U" j" J' v
在main.c文件中定义变量# ?  G# z1 k0 \) K, |% K
  1. uint8_t TX_Buff[]="THIS IS A MESSAGE!\r\n";        //发送缓存- n3 a' C4 i% D/ w: ?/ z
  2. uint8_t RX_Buff[2];                                //接收缓存
复制代码

, D4 a0 |+ W$ h. w. L; ]3 i) z# C3 ` 在int main主函数中,MX_USART1_UART_Init();后面写入串口输出函数
  f& @$ h% E) ^
  1. HAL_UART_Transmit_IT(&huart1,TX_Buff,sizeof(TX_Buff));   //用于第一的串口输出信息
复制代码
7 \- t& l* v; T% e- I( X
在while(1)循环中,加入接收中断函数4 k$ L, O$ k* S# U* g4 E
  1. /*
    # G, h7 [0 ~) K$ I. Q: v
  2. *2表示缓冲字节,发送的字节数要于缓冲的一致。如果发送长度小于2,则等到2字节后再显示出来) Y- \7 Y9 l' s8 l. j* z. n7 z
  3. */
    . U/ I# U1 z6 \
  4. HAL_UART_Receive_IT(&huart1,RX_Buff,2);  
复制代码
      
! q  f9 t; @- C! T- p% d+ l: H再int main函数后面写上中断回调函数# c) {) [5 u* Z
  1. void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
    % z7 D! k, G' {  @
  2. {+ b% H! Z- E# n8 F/ O
  3.         UNUSED(huart);2 Y( o; z, I6 k. S: B- D) C
  4.         HAL_UART_Transmit(&huart1,(uint8_t*)RX_Buff,2,100);        
    9 \4 f% ]9 s6 y9 J! a
  5. }
复制代码
- {3 k3 Q. {+ N! X4 E5 q8 B( W
编译,下载到开发板即可
( A' C- i& U+ s6 @$ T
: ~. {! ]  w  \+ x; t4 e% K 20200502225239316.png
* m. X( Q4 n, Z! @$ S; P4 I  |: B" \; X) B( s$ x: l
————————————————' W: G% F1 c% l. b' p! o
版权声明:SCCELE* G' e  v  q4 m5 {# p6 }

7 c8 `6 W% F, y' X+ z  y
. G" x5 M+ P  O- |9 ]* d% l
赞 收藏 评论0 发布时间:2022-10-31 11:10

举报

0个回答

所属标签

相似技术帖

官网相关资源

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