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

基于stm32f103的HAL库CUBEMX串口通信经验分享

[复制链接]
攻城狮Melo 发布时间:2023-5-1 16:45
串口通讯 (Serial Communication) 是一种设备间非常常用的串行通讯方式,因为它简单便捷,因此大部分电子设备都支持该通讯方式,电子工程师在调试设备时也经常使用该通讯方式输出调试信息。0 c* Y! I$ h6 P6 a- k( b: b
# I) p6 ?' n* F$ S3 I5 J  e
一.物理层& ?1 d' x, u% n! T( Z, B+ ^
1.标准
( I) Q% W  y1 k0 s. ~
根据通讯使用的电平标准不同,串口通讯可分为 TTL 标准及 RS-232 标准,RS-232相对TTL有更强的抗干扰能力和传输距离。STM32 的 USART 输出的是 TTL 电平信号,若需要 RS-232 标准的信号可使用 MAX3232 芯片进9 `% E4 D" Z! v- J5 F) v5 M
行转换。
, o0 r7 {* ~% ], S9 A/ R- k( V; P9 `3 L; |+ C0 M" D* d
2130b1a6ca0547ff9a58a0b27dc3fbe9.png   d4 B) i5 e2 Z" I- O0 d0 @
2 P0 x+ d6 g& p" t6 L6 i' ?
- Q; U6 i9 L. g" U1 @6 ~, h' w( e7 @2 g9 U
2.波特率5 Q# U2 S3 L& i& Q9 T
串口通讯是异步通信,异步通讯中没有时钟信号,所以两个通讯设备之间需要约定好波特率,即每个码元的长度,以便对信号进行解码。
; T, A- e# c5 X4 c7 o9 z2 t
, @4 t4 n5 J1 [5 P# I# V
3.引脚
1 n4 u$ u9 [. k& n* eTX:发送数据输出引脚。
& f' |8 M$ z* D2 i/ j! P. fRX:接收数据输入引脚。
2 f( K3 S! e3 X  c5 @5 Q  h7 n2 l4 r(与单片机相连接时,TX----RX,RX------TX)0 H" b4 |2 V; B7 X2 ]4 M

: J+ e$ v  K2 s: T5 S

) B( w- J1 o- P7 j0 j7 `7 L二.代码层
9 s1 V5 Z, L2 S# R& h
  1. HAL_UART_Transmit();串口发送数据,使用超时管理机制 " o- K+ M# v$ I' h4 {+ ]' G
  2. HAL_UART_Receive();串口接收数据,使用超时管理机制
      @  k- H% D/ j( v3 _, v8 G! F
  3. HAL_UART_Transmit_IT();串口中断模式发送  
    ; _! c* w- b* X' t* ]
  4. HAL_UART_Receive_IT();串口中断模式接收
    8 }4 B$ E" a4 n
  5. HAL_UART_Transmit_DMA();串口DMA模式发送
    / [9 d2 ~9 Q& n+ p
  6. HAL_UART_Transmit_DMA();串口DMA模式接收: p4 {" v4 J1 E4 K1 v
复制代码

0 X# _, H1 w+ e& {. _. p4 v4 A1.发送函数; v( ]) p  J, s/ B5 _; \
  1. HAL_UART_Transmit(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout)
    ' ^* v& n- h; F7 ^
复制代码

( _  G/ `$ ]6 l2 S' _3 @$ \ 8adf45855eba48089994bc38e0c34343.png
3 ]  }: b" r! @* \' S" E( e) m
  r, v0 `9 G% n: L0 X5 _这里图片引自Z小旋博主的文章
% }) @% F4 c% j( b5 i
* n" K) f) }: B$ ?8 {6 P1 v( D0 N$ h

6 x0 w5 ^0 `* \2 g4 T. d2.中断接收, M+ c9 r7 R: z( ]( b9 D; r/ X5 N
  1. HAL_UART_Receive_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size)% t* {' @- [% L/ W! j% u8 G+ u
复制代码
  1. 举例:    HAL_UART_Receive_IT(&huart1,(uint8_t *)&value,1);   //中断接收一个字符,存储到value中
    . P! v7 c) j0 K
复制代码

6 n. `0 r! z0 |- D) F3.回调函数
* E8 |4 _3 X: R: q- w: I2 L% Y
  1. HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart);  ' `' ]! c; H8 I) H! ~+ x
复制代码

  |! r( P) e9 C5 M在程序发生中断后,并不会立即结束,会先完成回调函数里面的内容,所以这里可以将想要执行的代码放入回调函数中
4 e$ n; {! z* u0 J1 x$ V5 |8 h* e2 ]
4.重定义
0 r+ E; c3 E: ?# {0 k. r; n在代码中可直接使用printf打印数据来检测数据" B  |, ?# _! P2 ]) @" c6 g
  1. /**) |, V* _0 n3 U* H) L: h
  2.   * 函数功能: 重定向c库函数printf到DEBUG_USARTx1 n. O% M3 K( m) S! |+ p8 w
  3.   * 输入参数: 无% q* f  d- |1 d: O3 z$ L
  4.   * 返 回 值: 无8 n+ p8 o3 X/ ?& h5 b
  5.   * 说    明:无
    ) d% J& z( N* F. V6 t  p9 g; U5 H
  6.   */2 \& P' F1 b6 _
  7. int fputc(int ch, FILE *f)
      z+ S) F& D- T& K0 e
  8. {4 B1 T: {8 E( u& [6 W) \
  9.   HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xffff);! [# Q2 F. i0 o6 H+ I
  10.   return ch;" [0 y+ D7 T6 u! W
  11. }) F. m/ C8 d2 X" |% f

  12. * C  p( Q% U/ x) N7 ^0 C) z# M  _
  13. /**
    * I( r# D, L' B7 R! M! z' n
  14.   * 函数功能: 重定向c库函数getchar,scanf到DEBUG_USARTx9 z: C2 h. G$ h# Y. e
  15.   * 输入参数: 无
    + ]* A0 x1 n( k2 B, T8 e! F$ G3 |9 F
  16.   * 返 回 值: 无
    - z$ y* a$ X4 ~( \
  17.   * 说    明:无/ y& `+ t+ r) b5 @1 W
  18.   */& g8 q2 x, B) T5 T+ u+ S
  19. int fgetc(FILE *f); x" A# R; |1 w2 x2 M$ q- p
  20. {0 i) m8 F, F& Y0 Z% q8 G
  21.   uint8_t ch = 0;6 ]; Z0 C6 z' e! D# c
  22.   HAL_UART_Receive(&huart1, &ch, 1, 0xffff);/ D0 I4 _, u8 e4 d8 m
  23.   return ch;) ?+ r! K6 z' q0 z
  24. }
    * F- \/ ?  y4 {3 Q
复制代码
8 K5 t4 H1 c$ \5 {3 x* N" S4 n: L& {
5.上位机0 ~, O" h4 I1 O( \# V
常用上位机就是串口调试助手,有vofa+,等各种方便的软件,波特率一定要和配置里面的对应5 L( C; |" k2 q% Y0 B
5 l6 c- F, g& Y0 w
6.串口中断
: k: ^& K* M7 n) l; ?8 h/ I# J在cubemx中配置好中断之后,声明
1 |) H( S" E, Q( GHAL_UART_Receive_IT(&huart1,usart1_rx,6);  j) |& n! [7 c+ Q: L/ f
在main函数下添加回调函数
8 S. t$ A. E  R1 }( j
  1. void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart): J$ h$ ]% D6 ^* \* q
  2. {
    % Q7 j5 ~5 |& h- a! w$ I
  3.         if(huart->Instance == USART1)        // 判断是由哪个串口触发的中断. |% z* K. ^* R- y$ m) u1 B
  4.         {
    9 ~( E6 c& A* `7 w& l  n
  5.                         HAL_UART_Transmit(&huart1,usart1_tx,6,100);        //发送        指针  数组    字节   时长
    9 a" l3 {$ i2 y
  6.                         HAL_UART_Receive_IT(&huart1,usart1_rx,6);
    + I5 E+ Z8 z" M
  7.         }
    / G( ~0 q. B+ k: O2 A4 _3 F+ ?
  8. }7 K! K& y+ M0 ]% K2 s6 z* _. t0 {
复制代码
2 g) ?: e$ m, K4 i) T+ i
串口打印
/ F3 ~9 f6 h& u, l4 v# L3 _6 X* p- K" E! x& L  L! K& k0 O
2c111eb74d5847e7a6e2dcf991e3f054.png ) l" t1 m1 f9 a, k% I; U
2 }& o9 ]  _& o2 r: c+ Y
每次中断结束都要在回调函数重新开启中断,否则中断里的内容只执行一次
9 u! v* Y' T3 f* i/ S! e- T! K————————————————" R2 y3 v' A- O& {/ W. \1 J$ ^6 s2 [
版权声明:地球先生_
4 g4 P6 y0 x+ z+ s' u. C如有侵权请联系删除
7 o- j% [+ A& _  r4 s- Q
; f# R9 k5 h2 |, W- S4 c- e! y& z' R6 {

/ V3 G9 t  ^5 l5 \- y, P
收藏 评论0 发布时间:2023-5-1 16:45

举报

0个回答

所属标签

相似技术帖

官网相关资源

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