请选择 进入手机版 | 继续访问电脑版

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

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

[复制链接]
攻城狮Melo 发布时间:2024-5-29 18:52
本期我们将利用定时器来模拟串口通信。  H0 f! U! t1 }5 Q

/ H+ n8 U: S& Q7 e3 n 微信图片_20240529185142.png
. O% \2 [# ]% T3 o# Q3 c- I

! ]$ L* y; j! a# g+ _& s首先我们要明白串口通信的帧格式,有一个低电平起始位,八个数据位(可选择校验位)+停止位组成。
5 H' H  u4 F0 \( s5 j8 n! h* P; G9 c2 K5 G* A* t
需要注意的是,这里的数据位从低到高!!!
) `& f9 ?. f( e8 K6 z- Q# A: R( @4 m2 i$ J: X- w; Q& S& [3 P1 R$ {3 P$ ?
通常,我们不会设置校验位,选择一个停止位。
7 s6 c" A3 v3 M3 O$ N7 V% C
4 b& U/ [) j+ T, g: j5 B
因此我们的一帧数据共一个字节+2位,总计十位。而波特率则是一秒钟可以传输多少位的数据。例如9600的波特率则代表着一秒钟传输9600位,总计960帧,所以总共960个字节,有效位960*8位代表数据。0 a8 h9 S3 \; f; `" y  s

, ?+ R" X' a: o) `: b
以9600波特率为例,每一位的持续时间约为104us." G  x/ e* R, Y" x6 J" s
+ I7 U: a5 M! ~$ Y2 c" E- M
因此在CubeMX中我们可以设置定时器的触发时间为104us。
8 H8 E4 P( G; U* i5 N3 z& o2 O# x7 u2 n2 k# E7 u2 i& c
微信图片_20240529185139.png
" H5 C3 r# c' U
% ~5 n) A) W' i4 F
  1. int num = 0;1 W" t& G" d2 Y2 R5 _
  2. void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)$ \) ?# y, B, Z( [2 }% j& ?6 F$ F
  3. {# q" c2 ]0 L: L# i
  4.   
    ) s  b, `: Z# d. _# p% o; b
  5.   HAL_GPIO_WritePin(GPIOA,GPIO_PIN_9,Data[num++]);) r7 s7 R7 G7 o3 N2 v
  6.   if(num == 10)
    4 d& `# v: k7 W2 ^3 l
  7.   {0 K8 i( n$ u* r
  8.     num = 0;% Y+ [* l- G& f* W3 s8 }( C
  9.     HAL_TIM_Base_Stop_IT(&htim1);//关闭定时器5 B+ @0 R6 A+ ?) w
  10.   }3 l1 f' x: B2 Q) S
  11. }
复制代码
* _, ~" F* G5 P6 L2 f" x0 H
我们在定时器中断回调函数中,将Data(一帧)中的数据逐位发送。
) d- c0 k$ E/ t
+ m$ T+ R* U3 X1 Q9 l9 t8 ], K
  1. void MyPrintf(int s)
    ! R+ M( N/ B& V# D+ p6 n5 Z* q
  2. {6 g. r% Y' p- ]/ t
  3.   Data[0] = 0;: M  V* M2 ^( a9 x
  4.   for(unsigned char i = 0;i<8;i++)
    2 k' A2 c# ^$ i  _4 \* T, h+ {7 v
  5.   {
    4 Q) B4 l, k2 t
  6.     if(s & 0x01){
    9 f1 s; {: b+ x7 Z) b1 }
  7.          Data[i+1] = 1;
    # ~/ l; o6 |! R- ?! }- K
  8.       }3 T- W# Z% k4 n- a' S& ?( N! O; L
  9.       else{
    1 n+ A  p& J, t& I, N0 I  X
  10.          Data[i+1] = 0;
    ) o! `! o, g! Y7 Y$ c0 \8 @7 P
  11.       }$ }7 r- y$ v+ O! o3 I
  12.       s = s >> 1;/ g; |7 G2 H+ }0 Q, S' X0 K! |
  13.   }
    0 n2 m1 t7 u0 f$ u. G9 k) n
  14.   Data[9] = 1;) C: H. Q5 e3 j6 {* w6 j7 M
  15.   HAL_TIM_Base_Start_IT(&htim1);
    0 y- J; U7 G5 f4 U6 N" \7 F$ s, k
  16. }
复制代码
3 W9 X$ _! J% T
写一个函数用来写入串口数据,并且启动定时器。
! ^9 g4 q1 B# l; w
% T* e3 E. d2 Q2 ^
  1. MyPrintf('H');
    8 S9 t4 c3 @3 W6 x8 L
  2.     HAL_Delay(100);
    % G; X/ q" o: ]  Q
  3.     MyPrintf('e');
    & J! C) M3 p( m( B/ C- d5 Q2 t
  4.     HAL_Delay(100);2 A3 W' f2 W& N5 V* s
  5.     MyPrintf('l');
    4 g% f; e% E* K( m# M* b$ m
  6.     HAL_Delay(100);<div class="blockcode"><blockquote>int fputc(int ch, FILE *f) {5 v; e7 j! h, n1 s) ?' X
  7.     // 发送单个字符) d9 r, `6 T6 D/ }3 K
  8.     MyPrintf(ch);! s& w/ T5 L3 `! e
  9.     HAL_Delay(50);//稍微延时,等待发送完成/ z' C1 r  V% [) _" _% S, ?
  10.     // 返回发送的字符! \; r- H6 J$ j8 [
  11.     return ch;
    # I7 o( f+ s3 m% ]3 M! N: x4 D
  12. }
复制代码

! ?4 E. w0 ?, [( `+ W/ L    MyPrintf('l');
( g4 C) S3 E+ y4 o; L8 k1 X2 B" t    HAL_Delay(100);
9 D6 H( ]9 \( e1 j    MyPrintf('o');4 Y4 u+ |( c' m$ t: N
    HAL_Delay(100);) G% A+ J# c8 c! x& Y. i
2 J3 t9 T# z+ T, P6 B( ]* i
微信图片_20240529185136.png # W) ^, r3 Y& s9 N

( X6 k5 v: A( ~3 x0 g% b5 f9 b* M- ^& s+ B* K8 U+ ~# }& C
成功的模拟了串口!!!/ y5 C& l1 s6 E; B. v# r  r0 [- s

3 Q! S" |/ G. x2 F8 K$ z; Y7 d
属于我的串口重定向!
* A1 z5 W/ p6 g4 Q* X
8 K: O% A) \+ j
  1. int fputc(int ch, FILE *f) {% V" n8 X. s; Z* T" {
  2.     // 发送单个字符
    : k+ t% W5 A. H
  3.     MyPrintf(ch);
    2 `* v9 X1 ?: [' f6 L
  4.     HAL_Delay(50);//稍微延时,等待发送完成' _' d- f. ]& }  u
  5.     // 返回发送的字符
    / c  ]% \% d, v9 I
  6.     return ch;
    9 i/ W4 j* k) S0 D+ t, N! W
  7. }
复制代码
/ m6 f. ?0 q; t/ r( C
微信图片_20240529185132.png - ^' J% @/ {1 ~% K. m$ s( G
2 c/ ~+ p9 P  v* D( l: w
微信图片_20240529185128.png
2 b* N; D5 ~4 a( W0 W# z8 U4 q+ G
5 q8 q/ o* ~: }4 |$ Q* H0 V; s, \Win,成功的模拟了串口!
3 T) @' y! c7 d8 Q7 d( \+ n- B+ ^& a3 {6 o. c8 N6 |6 W
下期尝试添加标志位和设置波特率。' y& c# o: l' w
3 M8 a# v1 k- a  h
0 ~( G# {) G/ {/ Y1 n1 q2 j

9 V' N4 B- v$ f( u+ `1 Q转载自:电路小白8 W; Q5 h" W  t8 L
如有侵权请联系删除* p4 f! f) V) O

) ?3 U9 u. f4 f, ~( H1 ^
收藏 评论0 发布时间:2024-5-29 18:52

举报

0个回答

所属标签

相似分享

官网相关资源

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