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

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

[复制链接]
攻城狮Melo 发布时间:2024-5-29 18:52
本期我们将利用定时器来模拟串口通信。
$ ~0 u0 z- a, @, h" q' K6 b* N4 f7 k, H' i! C
微信图片_20240529185142.png 4 p( A6 H- B+ O9 n" t

3 a- g' \$ C/ I& C  o首先我们要明白串口通信的帧格式,有一个低电平起始位,八个数据位(可选择校验位)+停止位组成。
9 p0 i- y+ H+ {# Z4 F
% a( T1 @( _  w2 m6 d6 _! z2 ^
需要注意的是,这里的数据位从低到高!!!' G7 Z5 T( z/ B* }8 }" v$ S
& J3 s" P0 Z: }2 V6 V# `
通常,我们不会设置校验位,选择一个停止位。; s' L; o( w* F8 {7 g1 O

( ^+ L9 B3 U' [. T" r
因此我们的一帧数据共一个字节+2位,总计十位。而波特率则是一秒钟可以传输多少位的数据。例如9600的波特率则代表着一秒钟传输9600位,总计960帧,所以总共960个字节,有效位960*8位代表数据。
  `9 @8 k( k; {. v% j/ f5 _' A6 }: K5 V8 ?" |
以9600波特率为例,每一位的持续时间约为104us.* G5 }# E4 \* \2 Q5 ], j
* X$ S7 U% z# y0 f: x1 ~4 O' N
因此在CubeMX中我们可以设置定时器的触发时间为104us。
" ~2 w6 \5 R5 i. B! g/ a& U0 b7 c
微信图片_20240529185139.png
4 v9 |5 B5 z+ B
* N1 D3 \) ~3 \% f
  1. int num = 0;& R3 X% X3 }" [1 i: D* M1 X! C. T
  2. void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
    / _% p, X2 c/ m( L
  3. {$ y3 j/ T: P% b
  4.   
    * Y/ _# n# P7 B! p1 H0 n5 S: \  e
  5.   HAL_GPIO_WritePin(GPIOA,GPIO_PIN_9,Data[num++]);
    - [0 U1 T5 j( t% L/ E
  6.   if(num == 10), B  b/ K1 `9 n! z9 z- w
  7.   {' q2 x# X& {) m* f
  8.     num = 0;0 F: \; |5 U: R4 F0 j
  9.     HAL_TIM_Base_Stop_IT(&htim1);//关闭定时器
    & W" D$ i. c; n4 ?* q
  10.   }/ L) C3 a& P/ j5 E' @8 B( H) u
  11. }
复制代码
) H% D9 s, y" j* T
我们在定时器中断回调函数中,将Data(一帧)中的数据逐位发送。% x" o- [  V, |' P# [
( D/ f" M! g- ~" O& ?/ Z
  1. void MyPrintf(int s); X. n7 c- g( S5 X* ?
  2. {
    . n/ a9 s3 y  |; [
  3.   Data[0] = 0;
    8 f+ C% r/ J  A( y9 y  e
  4.   for(unsigned char i = 0;i<8;i++)
    , m5 k* S0 \5 `+ z6 E  t
  5.   {
    4 g+ b0 D8 X3 B( {; S
  6.     if(s & 0x01){: p0 T2 Y6 H) C8 L! g& L
  7.          Data[i+1] = 1;( h8 ^% D, R0 g: c9 m
  8.       }
    * s2 T% I1 Q& p) I& _
  9.       else{
    2 m% U( n( v0 P! j
  10.          Data[i+1] = 0;
    0 L; c8 Z9 u, ?6 ]% G6 b, I+ q6 I1 @
  11.       }: Q9 r, H; o% ]& k! }6 {* t# E. t  x
  12.       s = s >> 1;* i0 c8 z% N) I* g, J# R
  13.   }. t/ Z9 R  M. B6 }( i
  14.   Data[9] = 1;3 I% Q+ j: L$ ~7 Y3 K4 d
  15.   HAL_TIM_Base_Start_IT(&htim1);
    # P2 ], |) u4 r" P3 w+ g$ R- l
  16. }
复制代码
7 b' W- B& @  f# f& i
写一个函数用来写入串口数据,并且启动定时器。
: b1 e; z3 r5 `$ G: B6 |9 t5 t3 w* V& {. c* G/ O" k
  1. MyPrintf('H');9 a" ^. A+ U# _5 [8 w# S
  2.     HAL_Delay(100);
    / Q- W" g7 L; K4 x+ A+ V9 ~
  3.     MyPrintf('e');/ f& V2 p0 z2 P' T
  4.     HAL_Delay(100);* S# f6 h" g( O+ O$ d$ D
  5.     MyPrintf('l');+ _" |1 q' F" S
  6.     HAL_Delay(100);<div class="blockcode"><blockquote>int fputc(int ch, FILE *f) {
    9 z3 p  r0 L* ~7 @
  7.     // 发送单个字符
    ) S% r1 U0 s$ G# `4 o2 j/ {( z
  8.     MyPrintf(ch);
    1 t7 x0 F9 h7 `
  9.     HAL_Delay(50);//稍微延时,等待发送完成& a, R! D5 p* r6 R3 G1 ~
  10.     // 返回发送的字符
    0 C# i( |. h# ]; _
  11.     return ch;3 U" y+ v- [1 d: M2 V9 y
  12. }
复制代码

1 ]! m/ O# Y) I/ I9 h) j    MyPrintf('l');
$ F, q) e3 u1 O. i/ I: P6 j    HAL_Delay(100);
- d" d, a* F9 l* A7 T( q0 n    MyPrintf('o');+ f% R$ u- ^( R) Q2 k. S: ~
    HAL_Delay(100);) c, W$ M# W) z* t. [0 C

- D& @, Q( ^. f  W2 j 微信图片_20240529185136.png 1 C' ?! H* |/ B. n  K, [
8 O3 k$ U7 R6 l, q
: A$ s! c3 ?+ S% P8 ]! A1 A" n6 L- j
成功的模拟了串口!!!
- X7 l9 R6 b' l$ [: D  X( `! Q5 u! R& c4 H" F0 L" F$ A
属于我的串口重定向!: J: T  H- l! E# }/ {" i0 t5 i7 Y
  b& {( a8 X9 @$ ^$ P
  1. int fputc(int ch, FILE *f) {
    5 ~2 W& b/ `. s4 r; J0 y
  2.     // 发送单个字符
    : d5 W) E3 N) p4 \  I$ k
  3.     MyPrintf(ch);9 c' B8 h$ R1 \  p) P
  4.     HAL_Delay(50);//稍微延时,等待发送完成
    ; f( m5 `4 x; g& c1 t
  5.     // 返回发送的字符
    1 R2 M4 |( x/ v: q& r
  6.     return ch;
    , m6 N  M# |2 `. [0 h; O2 h
  7. }
复制代码
0 E! U  q+ D' K% Y- e& f
微信图片_20240529185132.png 0 Q0 u* Y6 J+ J. |4 C

, d: c. w* ^. t1 d" [- w' N 微信图片_20240529185128.png
$ a$ N( ^; p6 V# H, H& Z4 p
) _3 p& J5 K8 n3 I' C0 t4 P$ yWin,成功的模拟了串口!
. s" o3 H% E8 z  Q4 U0 l# f
! _4 r2 S; W+ t+ G7 {' y. }
下期尝试添加标志位和设置波特率。
6 P. z$ u7 F" e+ f. }7 C8 G
; V! R5 j' v% a

' \( P) n$ b5 f1 X+ [# k& ^9 @
" K) U2 R/ b; y+ c% X转载自:电路小白* Q6 ?3 [# X9 O# V
如有侵权请联系删除) P# M8 t- H* b' D5 _8 }
9 R% V% x: S$ h5 v+ b, k( P" [, |
收藏 评论0 发布时间:2024-5-29 18:52

举报

0个回答

所属标签

相似技术帖

官网相关资源

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