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

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

[复制链接]
攻城狮Melo 发布时间:2024-5-29 18:52
本期我们将利用定时器来模拟串口通信。8 k2 `9 _) e0 B7 U

. N6 g; k$ w" v6 @* k 微信图片_20240529185142.png
9 F0 l9 W4 [! i2 `* g

5 F$ [" B9 I  ?" P1 M$ f9 K首先我们要明白串口通信的帧格式,有一个低电平起始位,八个数据位(可选择校验位)+停止位组成。' q) V/ |6 f2 k# o( \

% o: Q' v3 [) C. K" c0 A
需要注意的是,这里的数据位从低到高!!!6 c# D# F0 E( ^+ K3 e

( `/ f3 d6 \" }" A; a
通常,我们不会设置校验位,选择一个停止位。6 ~7 K0 H' G4 M* a/ d( g* [

3 C6 r/ A6 S* H( T& t6 w- j6 D
因此我们的一帧数据共一个字节+2位,总计十位。而波特率则是一秒钟可以传输多少位的数据。例如9600的波特率则代表着一秒钟传输9600位,总计960帧,所以总共960个字节,有效位960*8位代表数据。
9 O' ^' ~3 m5 F" E, I# h8 V- Z3 n5 U; \+ K
以9600波特率为例,每一位的持续时间约为104us.9 }) [, G4 M; O* @: v% `
1 v. V, B& |0 X5 r
因此在CubeMX中我们可以设置定时器的触发时间为104us。
# }$ H& N: u+ _6 ?
# X7 t+ s: X' S: z) q5 }7 Q' Y
微信图片_20240529185139.png ( r& e# U' E7 U% \' C+ H8 j! ^- ~

# i1 i+ B: b1 a' d+ q
  1. int num = 0;7 U$ Y+ J* ?. X! z+ J% J
  2. void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
    2 ~, c: U. d/ X( [" _/ {4 g; S
  3. {7 L4 U+ s" R: A' B/ i
  4.   
    : `/ ]1 h8 p7 |
  5.   HAL_GPIO_WritePin(GPIOA,GPIO_PIN_9,Data[num++]);
    * ~( U' k4 [  h% e8 }# k; x
  6.   if(num == 10)( X" [# u, l) [7 P
  7.   {7 w( x, _" |4 h: i, m
  8.     num = 0;
    : q* t/ [: _' m* n7 h
  9.     HAL_TIM_Base_Stop_IT(&htim1);//关闭定时器
      ^' ^# P! t- c- d% d; c
  10.   }' \3 _4 A, J4 E1 p% d( E
  11. }
复制代码
/ s* ]# \1 H) g, r/ p. Q$ I/ _
我们在定时器中断回调函数中,将Data(一帧)中的数据逐位发送。: N5 T+ D* j0 _7 m7 q6 [" O. F

+ O3 d' r+ H: k5 {/ \! ^
  1. void MyPrintf(int s)
    : J) t' @2 K6 D! g! \+ p& A8 b
  2. {% P( i2 L2 t; c& z% |& s0 k0 K
  3.   Data[0] = 0;
    " p& `, z' i6 x5 }5 {! F) i. U' l
  4.   for(unsigned char i = 0;i<8;i++)5 |# ^+ a% ~5 r" n0 Q
  5.   {
    " Y/ D& |9 v2 X
  6.     if(s & 0x01){- n2 o9 q- {) t) H  C/ w
  7.          Data[i+1] = 1;
    % }( w8 Q- Q& A
  8.       }
    ! V6 W1 X" z1 Z' r( H7 f( c% [
  9.       else{
    3 X( f6 @: U% }  w
  10.          Data[i+1] = 0;
    $ E" b: V. @- R
  11.       }, q. L6 O. o, ^8 s
  12.       s = s >> 1;
    2 m4 X* V" L( D4 b5 @
  13.   }
    ( e! H* T6 p9 b+ e1 A: u' L9 N
  14.   Data[9] = 1;1 f6 n$ r7 _8 z5 e1 @& F7 R0 {
  15.   HAL_TIM_Base_Start_IT(&htim1);
    5 f4 Y* i9 D, i) m' d
  16. }
复制代码
8 [! J7 F9 @3 t3 V$ E+ D
写一个函数用来写入串口数据,并且启动定时器。) B, r* V% `9 o$ W8 H
  g1 C& e+ R) v
  1. MyPrintf('H');$ G2 J6 x8 g. _  V8 v
  2.     HAL_Delay(100);
    1 R1 `$ J$ y  k7 E, ^  g# @* W
  3.     MyPrintf('e');
    1 G( F8 |/ V0 n- ~% w6 t; a
  4.     HAL_Delay(100);
    8 ^, b7 d( [9 J* }0 ?! t
  5.     MyPrintf('l');
    1 H* s/ Z* ?" h& T2 r
  6.     HAL_Delay(100);<div class="blockcode"><blockquote>int fputc(int ch, FILE *f) {
    ! m: \, j. i) k+ H; f; S
  7.     // 发送单个字符
    $ i4 L. S1 \& i' Y
  8.     MyPrintf(ch);: f1 F' g6 a+ {& q8 {
  9.     HAL_Delay(50);//稍微延时,等待发送完成  G  C- `/ P! a9 c8 t
  10.     // 返回发送的字符1 Z' o- D# F" }+ I# B* o  X
  11.     return ch;
    9 y' x3 u% j% Z* i1 k
  12. }
复制代码

# n& L; q1 V' \) k) R7 o    MyPrintf('l');/ F& f/ [) ~8 A' k
    HAL_Delay(100);
3 A+ ~1 D6 k+ l; x7 n) a    MyPrintf('o');/ U; {( X7 {4 ^; U
    HAL_Delay(100);
: I: i) u6 g) @, A' G! `
5 I' x) e/ z( G9 l3 t 微信图片_20240529185136.png
2 K+ A) R3 p+ D& h9 Q
" h: q- z: o- v3 }7 A3 ~" w1 l) x
成功的模拟了串口!!!0 B6 m2 @7 H3 k9 h; L: w

/ [# l7 {& E. o) E. N( v
属于我的串口重定向!$ S( ?4 F  L1 q; _4 G
% F5 t( u* Z! N$ V8 v, _
  1. int fputc(int ch, FILE *f) {/ I; c: p" Q  P0 h( d- a9 H8 N
  2.     // 发送单个字符
    ( W* A8 l* S3 Y0 w: h, ~
  3.     MyPrintf(ch);. x' ~/ Z$ W4 B, v
  4.     HAL_Delay(50);//稍微延时,等待发送完成
    / G6 v( l9 P! L1 @1 i
  5.     // 返回发送的字符  u2 b. j2 h. M/ Z
  6.     return ch;
    " Q9 _6 u  Z2 g, \: C0 Z: s$ x
  7. }
复制代码

+ _( \, L' h* `) J: m1 Z$ a 微信图片_20240529185132.png % {. K/ S/ d, p/ _$ W2 H  z- u( d! z
4 G, f7 z$ {2 t5 p  T* }" w' Y
微信图片_20240529185128.png
1 z+ `' q1 N' o$ @) y' r% o0 {/ Q! A9 B1 {# p
Win,成功的模拟了串口!: D# [/ E' i5 k7 e: I0 E

$ R0 s6 e+ n/ R
下期尝试添加标志位和设置波特率。
0 R- A  {: Q3 ]) _4 E: a4 I5 d
& W% v' a# A; A* E6 j5 |
& c- _3 O& X. v! u$ S* w# K8 z
# A. U% t$ ], n+ g" @3 h: q
转载自:电路小白% Q7 m) b; [5 G: P
如有侵权请联系删除
7 a" t. x  R$ O& m  n) ~

4 t; J7 q$ G# J2 U
收藏 评论0 发布时间:2024-5-29 18:52

举报

0个回答

所属标签

相似分享

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版