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

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

[复制链接]
攻城狮Melo 发布时间:2024-5-29 18:52
本期我们将利用定时器来模拟串口通信。
1 D( }0 Z$ s3 ~6 C6 ~. o$ x& m1 w2 A" F- n, |
微信图片_20240529185142.png
6 n3 Y8 F$ t# G7 S1 `

/ l; l% l/ E: b2 N4 [首先我们要明白串口通信的帧格式,有一个低电平起始位,八个数据位(可选择校验位)+停止位组成。
! O7 s$ d7 j4 a- f) F8 X8 M, y2 J
( Z1 z" i# @! {" Y) `
需要注意的是,这里的数据位从低到高!!!2 J" a( ~5 H6 F+ Q( }# S5 f
$ v$ _6 `0 x% r1 ~; C1 W% h( r
通常,我们不会设置校验位,选择一个停止位。3 d% e; ]4 e6 c6 s

; c4 w1 q, m: U- `6 L. d
因此我们的一帧数据共一个字节+2位,总计十位。而波特率则是一秒钟可以传输多少位的数据。例如9600的波特率则代表着一秒钟传输9600位,总计960帧,所以总共960个字节,有效位960*8位代表数据。
9 j: }* x, F2 O0 s( C1 o$ S7 d( X" `1 b5 x9 C0 L' C
以9600波特率为例,每一位的持续时间约为104us.+ @2 S1 F4 d( B9 U6 F

% r, b" Q. v/ n& M0 g6 p
因此在CubeMX中我们可以设置定时器的触发时间为104us。4 y0 b1 D+ A) Q/ G+ a
/ X0 Z$ j/ k) ?
微信图片_20240529185139.png ; a' Z% F$ f9 W) r( k* E* W
0 d4 O3 o8 p4 e: }! G$ r
  1. int num = 0;
    / a' P/ n6 b7 v) s6 ]
  2. void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)5 X6 W! r3 T, Z2 K: Y
  3. {
    5 p# V- A3 V% l( v! {& @3 [  |
  4.   ( B' b5 i7 v! H; |. c! o& @
  5.   HAL_GPIO_WritePin(GPIOA,GPIO_PIN_9,Data[num++]);) ?/ P  Y' p) S1 \' Z3 R$ `7 C) V+ D
  6.   if(num == 10)0 @& N. p% W9 W- ^
  7.   {1 E+ t% d6 |% |5 T4 s/ |8 U# R
  8.     num = 0;" D& N. E6 f) y
  9.     HAL_TIM_Base_Stop_IT(&htim1);//关闭定时器5 W. R2 j, h" _0 s7 h- I0 v, m
  10.   }9 p( @$ K$ [. u
  11. }
复制代码

7 d( G3 o  `2 M- j我们在定时器中断回调函数中,将Data(一帧)中的数据逐位发送。& h4 m0 z0 d4 r: }4 |- n

3 Q( D  b2 Y( E3 k- ~, C
  1. void MyPrintf(int s)
    8 w! X9 b* }7 ?5 o4 U6 E4 I% N
  2. {- n! U6 Q$ f1 l$ `! j& ]( z$ ?
  3.   Data[0] = 0;- S9 X" D. Z  D, `0 M1 h2 W7 N  }" g) G
  4.   for(unsigned char i = 0;i<8;i++)5 D+ G: J& Q/ w4 P/ G$ w
  5.   {0 U* F1 F* R4 P) l
  6.     if(s & 0x01){
    0 m; l' N( [! G* r4 E" I/ ]
  7.          Data[i+1] = 1;5 q3 M8 R' _4 M8 \9 H
  8.       }9 j' ~. r  P4 G% ?. v, J& G) K9 }
  9.       else{
    , ?  I! q4 _- M; v6 l6 @5 R: _; M
  10.          Data[i+1] = 0;
    / U: W6 K4 H* M
  11.       }
    0 `% _: A% k! G+ }
  12.       s = s >> 1;
    9 k/ z/ @6 J3 ]. s0 D
  13.   }! H- v7 K! r2 I" d; h- D9 H# [
  14.   Data[9] = 1;& B2 I( @3 c) H$ x
  15.   HAL_TIM_Base_Start_IT(&htim1);
    + H; F/ c' a$ m$ V" K8 O; o
  16. }
复制代码

1 l0 n* ~. k  L1 L" p0 e3 s6 Q写一个函数用来写入串口数据,并且启动定时器。
( P6 n- o/ A0 R2 d. V' }: T$ b7 _$ r5 i
  1. MyPrintf('H');
    & ?. \4 a! B/ \! V
  2.     HAL_Delay(100);7 k' Z/ O5 l, M9 y; ~  X
  3.     MyPrintf('e');4 S. g, G) P# k7 u
  4.     HAL_Delay(100);
    ' w, U! Z+ w- k+ B$ P$ R
  5.     MyPrintf('l');
    " P* v' P. J2 O. `! M( I
  6.     HAL_Delay(100);<div class="blockcode"><blockquote>int fputc(int ch, FILE *f) {
      H1 C: E5 p( y* \3 S( c3 d8 W
  7.     // 发送单个字符
    1 [8 G3 T* m9 e% t
  8.     MyPrintf(ch);
    # q8 I# L( [: x( Z0 W) i( m
  9.     HAL_Delay(50);//稍微延时,等待发送完成
    ! r. C. a% h. M
  10.     // 返回发送的字符
    - |6 w) T) @- U( x9 g1 A( v
  11.     return ch;
    . J! y; j0 l" u  J
  12. }
复制代码

4 x# V+ Y/ P/ S/ k( f    MyPrintf('l');- X& N# ~& n  B
    HAL_Delay(100);
7 o* ]5 i- t: X4 e8 Y    MyPrintf('o');0 C6 N& u& X2 x9 \
    HAL_Delay(100);) D9 u. G2 z' A. s+ A$ W; A: ?8 c
1 w& g( q" @# d
微信图片_20240529185136.png 8 m7 V6 }# ?# R
8 ^5 O. Q7 H* S& L$ p  ?4 p. Y; ^/ {
5 ]* _$ a  o' U  Z0 ^3 P
成功的模拟了串口!!!: L7 U. q' S9 Z( h0 {2 D

) |, K* `: h1 v
属于我的串口重定向!
  S( X2 e( J2 M. T3 H6 [2 U( @* {; B, g; a
  1. int fputc(int ch, FILE *f) {
    / v( u! u. G+ w* Y
  2.     // 发送单个字符
    " u$ Z4 s# q8 @% p2 ~
  3.     MyPrintf(ch);# h% q  y3 K% F+ n1 G6 w
  4.     HAL_Delay(50);//稍微延时,等待发送完成
    3 x/ Y: F" T4 D9 P3 e
  5.     // 返回发送的字符+ H9 [3 O0 t' U. l& V/ n* k# ?3 N
  6.     return ch;' c' o7 T8 i( X, H$ Q* L
  7. }
复制代码
2 D* `4 d2 Q" G6 ~
微信图片_20240529185132.png
: Q% q" d3 e: ~) K
; G% ~3 u0 |% Y: m
微信图片_20240529185128.png # G1 h0 G7 t8 Y3 r2 W
* N; g, H  d7 p
Win,成功的模拟了串口!
" y7 F* R* z% k. T: X: z0 ?, i
6 {% {3 u1 R* i' L. h/ I
下期尝试添加标志位和设置波特率。
6 {0 m$ `/ u* f' V$ V2 V
# e6 p1 {# g* H6 u( z1 o

6 i% Q4 \- G, }* X1 M7 g- b9 }+ e& T# i" l# I2 [: U
转载自:电路小白" Y. e! [. o* z& d3 V
如有侵权请联系删除
  g8 B% P1 S- B! O" i) K  S
. Z& V- [1 s  r
赞 收藏 评论0 发布时间:2024-5-29 18:52

举报

0个回答

所属标签

相似技术帖

官网相关资源

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