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

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

[复制链接]
攻城狮Melo 发布时间:2023-5-1 16:45
串口通讯 (Serial Communication) 是一种设备间非常常用的串行通讯方式,因为它简单便捷,因此大部分电子设备都支持该通讯方式,电子工程师在调试设备时也经常使用该通讯方式输出调试信息。
# I/ F5 |; l7 F3 D' ^& m+ q
4 b, [# T' L6 l$ ], l一.物理层
  z* L; ?: N; y: B, q' m$ B1.标准
7 o" V! V# M4 S! T6 g2 j1 I8 k
根据通讯使用的电平标准不同,串口通讯可分为 TTL 标准及 RS-232 标准,RS-232相对TTL有更强的抗干扰能力和传输距离。STM32 的 USART 输出的是 TTL 电平信号,若需要 RS-232 标准的信号可使用 MAX3232 芯片进5 C& Z- r! `8 `8 |2 u
行转换。" F( q  G" D. K2 z
* D! X# n; }5 I6 n) A! z1 J  H# l9 H
2130b1a6ca0547ff9a58a0b27dc3fbe9.png ) u5 S. A0 h- q) h0 }2 v/ r, Q

4 D3 F, Q0 K7 ~! D! B' A' ^
$ I* y# p2 b! q# I
2.波特率
! q. e: p: d1 m串口通讯是异步通信,异步通讯中没有时钟信号,所以两个通讯设备之间需要约定好波特率,即每个码元的长度,以便对信号进行解码。
. X* i* H& I1 a  Z4 j
& n1 [, B7 G4 s, w4 x# H8 t
3.引脚
0 B; h9 ?: ~- q0 f+ H9 J! nTX:发送数据输出引脚。
- ?1 I: i* D$ u4 f5 J0 ~RX:接收数据输入引脚。% d* Y/ r( C. P# l6 n
(与单片机相连接时,TX----RX,RX------TX)' Q9 P, l! T1 e4 S
6 u) y, c3 @, s5 }" I

7 R  t0 T$ J7 F$ n9 o  g  D二.代码层
! T1 x: D+ }- ^+ ^) w
  1. HAL_UART_Transmit();串口发送数据,使用超时管理机制 6 k- V+ {$ D& b% B" q" R5 Y/ z
  2. HAL_UART_Receive();串口接收数据,使用超时管理机制* @; d$ R. q$ `, i6 \$ e! ~! C
  3. HAL_UART_Transmit_IT();串口中断模式发送  
    7 W5 Z7 b$ L. U8 T- H
  4. HAL_UART_Receive_IT();串口中断模式接收) s) ]( _+ O+ k; u
  5. HAL_UART_Transmit_DMA();串口DMA模式发送
    & o6 |( |9 A4 \* t5 j3 A% Z2 z5 ^
  6. HAL_UART_Transmit_DMA();串口DMA模式接收# r2 w$ C3 |, f* @
复制代码

! Z& J9 p" W% I4 z+ B# v1.发送函数
7 @; ~- C5 f( e' I, @3 q) ]
  1. HAL_UART_Transmit(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout)9 c. t! B6 b6 {, _6 R' @9 c2 H* C: h& M
复制代码
/ `+ T7 \& \" {/ m
8adf45855eba48089994bc38e0c34343.png & I0 p; c7 G4 y9 J% r# }5 p( W
& ^% w# k" ?0 A6 k- w
这里图片引自Z小旋博主的文章
$ I, F6 O+ r# q( q6 H: l" e: n3 O' s: X; |( V4 w9 H: v& ^# z

* h6 H) `: w  Q* y/ _2.中断接收0 E( ?- R# W" C3 b) ?+ J2 H6 C
  1. HAL_UART_Receive_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size)
    4 V: e5 M. G4 _: p6 Q
复制代码
  1. 举例:    HAL_UART_Receive_IT(&huart1,(uint8_t *)&value,1);   //中断接收一个字符,存储到value中
    , r, s! B; L- j7 u2 A) q- O3 f( b  u! e
复制代码

8 H4 l; |( x3 I" P) E3.回调函数; l4 @2 G" l# X
  1. HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart);  , x# N: u- P5 N( ~( k2 p; {- T$ T$ s
复制代码
9 c2 \2 j& U. |4 Q
在程序发生中断后,并不会立即结束,会先完成回调函数里面的内容,所以这里可以将想要执行的代码放入回调函数中. r8 F" {. Z2 E9 R( @! q
, y3 P: V; O6 m- s; T
4.重定义) w) ^# ^0 ^3 F2 ~" [" ~( b% M
在代码中可直接使用printf打印数据来检测数据" F. q( D" D8 }
  1. /**  V' j4 T3 J0 O* L. P/ M
  2.   * 函数功能: 重定向c库函数printf到DEBUG_USARTx( {/ t' s0 v8 p) N: t' T$ F) ^  g
  3.   * 输入参数: 无
    $ z; K5 Z; W, A# C1 r1 ~
  4.   * 返 回 值: 无* N$ X; X, u! F; d) x/ C: e
  5.   * 说    明:无' ?2 S( v) g3 |7 g- K# d
  6.   */
    0 I# S, B( T8 c' Q
  7. int fputc(int ch, FILE *f)$ w1 @- Z: J; H0 U# [3 L
  8. {7 _: h4 b5 L7 l0 E5 w
  9.   HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xffff);, W2 m3 N5 E5 N/ p' r. g
  10.   return ch;
    $ g) P3 A2 h& X3 {* S
  11. }
    . G& T, u, ~  |' }8 w
  12. % a9 [/ }4 L2 l8 q( z
  13. /**- J  k) F" y& j+ c4 `9 s! f
  14.   * 函数功能: 重定向c库函数getchar,scanf到DEBUG_USARTx$ B9 T' k: K" H& j( }% z/ }* ]
  15.   * 输入参数: 无
    / \! I. L8 y' L; I7 t$ g; f% i
  16.   * 返 回 值: 无
    ' ?, j! b$ [' |" g2 ~$ [' z
  17.   * 说    明:无9 j3 P1 }4 g/ C) t6 v1 G9 C. o8 H& T
  18.   */7 j% l' z$ c; o9 K! n# k
  19. int fgetc(FILE *f)+ `  T1 [/ N3 ~2 u  G
  20. {/ G" _1 W3 d5 ^8 a
  21.   uint8_t ch = 0;& h/ [% Y: W5 V/ M3 ~
  22.   HAL_UART_Receive(&huart1, &ch, 1, 0xffff);  l7 |2 t' W0 S2 h5 k% h; `" @! G+ ^; l
  23.   return ch;
    . R; o. E* W' o, ~, ^: a
  24. }
    , `' o" ?- G: W' e
复制代码

; E3 v6 V  f4 A  S: ]( T5.上位机
' y3 j  ^0 b: @常用上位机就是串口调试助手,有vofa+,等各种方便的软件,波特率一定要和配置里面的对应5 \# _( T. b' e) p" v
3 e. c* @) A+ M0 P
6.串口中断
+ ]) [3 y% y- H; q5 i+ d3 I在cubemx中配置好中断之后,声明
& a) y8 X4 P1 d3 hHAL_UART_Receive_IT(&huart1,usart1_rx,6);
, c! U3 B' U+ g3 E在main函数下添加回调函数
6 n; W& Z, ^: Y3 P8 e
  1. void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)% S1 ~0 S  ?" m
  2. {
    7 |: S: }. t# b4 R: h) p
  3.         if(huart->Instance == USART1)        // 判断是由哪个串口触发的中断  Q2 ], }- b( l" a7 U* W, c  H
  4.         {
    7 h( m  P8 |' V* L: T6 q1 h  }
  5.                         HAL_UART_Transmit(&huart1,usart1_tx,6,100);        //发送        指针  数组    字节   时长$ L# S+ ~& ?) d8 g- s; \
  6.                         HAL_UART_Receive_IT(&huart1,usart1_rx,6);
    4 i- h* ^# `1 Q& K4 Z
  7.         }
    % J7 P( z; R! M1 x/ r3 h
  8. }
    . m/ @. H: H& j7 y5 z) y3 O1 \
复制代码
, n6 w9 }- y+ W2 G* p' x
串口打印
' E; A! g2 X+ k) G  V. x- k% V0 E0 B2 @/ H
2c111eb74d5847e7a6e2dcf991e3f054.png
) L+ \6 _6 F& g4 O

* X- a% A& a0 s7 t" g每次中断结束都要在回调函数重新开启中断,否则中断里的内容只执行一次# s$ z+ Z7 ^2 M4 h8 E
————————————————
2 r+ ]' d7 k0 {$ [版权声明:地球先生_
6 y9 F- r! N; m) N如有侵权请联系删除
: j) y/ B. D7 w: l+ [
& W! d" U7 L8 }# O& V" i% M' b
0 E6 D! ~6 |, H8 u6 v! p  g0 ]4 a% a1 L, ^
收藏 评论0 发布时间:2023-5-1 16:45

举报

0个回答

所属标签

相似技术帖

官网相关资源

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