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

基于STM3利用GPIO翻转模拟串口进行重定向经验分享

[复制链接]
攻城狮Melo 发布时间:2024-5-29 18:52
本期我们将利用定时器来模拟串口通信。
. s2 S- ~( i" R. `, s" J* p- Y# e; D1 C1 S$ [" Z
微信图片_20240529185142.png - M3 c4 [( @. q+ Y
2 i. C( X5 e0 \$ y; ~$ u; Y
首先我们要明白串口通信的帧格式,有一个低电平起始位,八个数据位(可选择校验位)+停止位组成。) X7 p, o) y7 U8 d+ A6 _- A, Z
" T) A; f8 Y8 k/ f8 T6 |
需要注意的是,这里的数据位从低到高!!!
' C7 I; Y; X  C) [, |  z" z+ D- Z- W% r4 M( e
通常,我们不会设置校验位,选择一个停止位。; _( {3 n- K! q6 @# m: O

+ F6 h  o5 t/ r5 T
因此我们的一帧数据共一个字节+2位,总计十位。而波特率则是一秒钟可以传输多少位的数据。例如9600的波特率则代表着一秒钟传输9600位,总计960帧,所以总共960个字节,有效位960*8位代表数据。8 f% r4 l' r+ n+ c% k/ p9 ^
4 `* y9 {0 `* F
以9600波特率为例,每一位的持续时间约为104us.
, _+ C9 I" H9 v5 k9 T" H4 ?
$ s: _/ J2 b2 x/ x/ \7 r5 A
因此在CubeMX中我们可以设置定时器的触发时间为104us。
' r6 ~# G! I0 N0 Q# \  R. Y
( P/ S: ~7 }* U. W" B
微信图片_20240529185139.png
3 Z, y) E: L: P$ Q: h1 \" Y- N, r% w2 }3 d# n4 [
  1. int num = 0;/ C; c- u. P4 ^4 J2 ^
  2. void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)" P' h  t, ]1 G  }9 z
  3. {
    + g1 v4 S- V( _5 w$ i
  4.   0 ]6 E8 U$ V. ?3 M
  5.   HAL_GPIO_WritePin(GPIOA,GPIO_PIN_9,Data[num++]);
    - K5 A2 n+ N5 K
  6.   if(num == 10)+ D2 R! d7 f1 W* ]: Y
  7.   {2 k& f5 t4 S3 c7 u' P: Q2 }. u. q
  8.     num = 0;/ t0 X. s* ~; R3 r
  9.     HAL_TIM_Base_Stop_IT(&htim1);//关闭定时器
    ' r9 ^$ R3 [3 K- I$ u* x5 A' I; P/ H
  10.   }
    - z* d! E; p/ S$ J. `; q3 k
  11. }
复制代码

& J3 W1 `4 i' _( S- m我们在定时器中断回调函数中,将Data(一帧)中的数据逐位发送。6 ]$ C( p# W0 A3 v
9 u0 F; Q% e/ k- h: V
  1. void MyPrintf(int s)
    # I( @6 z& Q  I9 ^
  2. {. ?) p  ~3 T1 P2 o  t. S. W1 h
  3.   Data[0] = 0;) l7 l  i7 j9 o( s" h
  4.   for(unsigned char i = 0;i<8;i++)
    ! D, m5 c0 ~( t. a4 T5 G8 ~$ J
  5.   {& K3 r0 q) t* y4 f
  6.     if(s & 0x01){
    / J6 M3 C0 L% [2 l3 N
  7.          Data[i+1] = 1;
    / d6 X' @0 r& g+ n# M) h
  8.       }
    $ u, W& A3 s& T! V, `
  9.       else{
    ' d" K& F) g  }+ Q
  10.          Data[i+1] = 0;
    ( J! y: e( j0 j# e3 H
  11.       }
    % y1 V3 o3 i+ M
  12.       s = s >> 1;
    ) O6 G" ^: \- Q8 F. N, g: y5 O8 @
  13.   }
    ' x3 R/ R" D' n6 j' L
  14.   Data[9] = 1;
    6 y9 o' k6 r0 J* l5 ^
  15.   HAL_TIM_Base_Start_IT(&htim1);. ^# k! B# {7 v8 q7 O4 H: s
  16. }
复制代码
2 V5 k) m* E& b) h
写一个函数用来写入串口数据,并且启动定时器。
6 ~$ s2 {7 Y" L% U: H1 [- X" }+ h  ?8 P$ g/ o" f# u  T
  1. MyPrintf('H');
    5 V/ Q9 v2 x! N9 G/ \
  2.     HAL_Delay(100);, m" \% t2 x0 t- j3 ~9 Z5 i
  3.     MyPrintf('e');
    ' d% \2 Q/ O7 b! a) k
  4.     HAL_Delay(100);* o0 d/ a! k0 W# E" E
  5.     MyPrintf('l');: m/ B9 A/ N+ z1 h/ f: `5 K! @
  6.     HAL_Delay(100);<div class="blockcode"><blockquote>int fputc(int ch, FILE *f) {3 c( y1 ~, f1 r# B8 \
  7.     // 发送单个字符, @) \4 K3 y' K; m+ I
  8.     MyPrintf(ch);# V+ \/ @% ^7 w1 t% k6 ?2 x
  9.     HAL_Delay(50);//稍微延时,等待发送完成; t+ n, Y2 U; j& F8 v* m# A
  10.     // 返回发送的字符. h: f- \: Z  N* K' b& a: n: [
  11.     return ch;( S% P8 {! X4 A
  12. }
复制代码
" |1 }8 a& M* d# \$ ^& Y
    MyPrintf('l');
4 S1 I' J2 l5 Y8 v# w6 j/ [    HAL_Delay(100);
2 J2 n" V! C0 \/ z% C& W    MyPrintf('o');" B/ E9 i8 p* A" _0 }8 I' _
    HAL_Delay(100);
" P7 o1 z& i& [) d$ [4 [: G0 c, B* n
1 j" I) c9 Y3 N1 T9 E* B- U" r 微信图片_20240529185136.png
* n* d6 n  v- T
+ z# s: `( h: f' p' H, u* F3 P# D7 O" k5 P) H/ z% }& [5 ~
成功的模拟了串口!!!; f! W: W# \& q8 b+ e6 k

8 \' B$ H: r% \4 @, Z- A
属于我的串口重定向!" A, D9 a) U6 }1 j7 C+ n
! K/ H# q. Z- ^( i( m7 R) [4 C7 Z
  1. int fputc(int ch, FILE *f) {
    - A- Q; P4 g% c/ G+ U
  2.     // 发送单个字符
    . ^. ~$ n/ C( {, z: x& }
  3.     MyPrintf(ch);
    ; Q- L. [# `4 y
  4.     HAL_Delay(50);//稍微延时,等待发送完成
    * p; T  L% j6 ]! a* j: G% F
  5.     // 返回发送的字符  ?! }9 m' G( `
  6.     return ch;
    ( @# l) d6 L3 G& S7 M/ p
  7. }
复制代码
/ C/ s; \: U* d2 {! ?( \6 w
微信图片_20240529185132.png
$ v2 j, X! N$ S1 ^( ]" g- [% J
6 R/ I+ E7 n$ \( C% F: u
微信图片_20240529185128.png 7 W1 A4 K$ i5 z! |# \
$ t5 ]  L( r5 N6 u
Win,成功的模拟了串口!
9 z- b7 H0 b6 A0 Q; ?( z
( ~& k3 W" e8 ^$ b! _4 R7 a
下期尝试添加标志位和设置波特率。$ `5 o, S/ @  T# q8 ~2 Q" G6 u2 s

$ w( f2 E; i& L1 Q

  a$ c( c/ G+ ?" J5 n
0 B/ N/ o: n5 }; g8 s- I转载自:电路小白7 C- e- }2 E. A& o  ]2 q
如有侵权请联系删除% |  X( o8 W6 w9 x2 Y
) x0 }* @( p/ b1 i/ o. `
赞 收藏 评论0 发布时间:2024-5-29 18:52

举报

0个回答

所属标签

相似技术帖

官网相关资源

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