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

基于STM8的模拟串口

[复制链接]
黑溱郎 发布时间:2015-1-6 17:04
本帖最后由 黑溱郎 于 2015-1-7 10:54 编辑 ! l* t$ H6 ]( ^2 N. J
6 Q" t, _& b/ g! B" l) _% J
+ W% G5 r8 C) S- ]4 P# O8 f# E

$ n2 e/ W- O1 m: F
下面是STM8的模拟串口实验例子
实验工具:STM8S103FP6最小系统版, ST-linkV2 PL2303转串口模块
5 j% d9 \% o6 o4 z
9 r* n0 i) {% n" `
步骤1、算出定时初值, STM8内部晶振为16M 采用8分频后震荡周期 =8/16 =0.5us,所以发送或接受以为数据的采样定时器初值应为48~52
- K: D7 Z& T3 e+ D' a1 U" |- @3 r
下面为定时器初始化代码:
+ S# o& N' v/ C0 g
void Tim2_Init(void)
. y3 h* h$ R  g
{
  G4 v4 L& M+ U8 h
        TIM2_DeInit();& \& D! d- y% k% T8 Y, L8 U. V
       TIM2_TimeBaseInit(TIM2_PRESCALER_8, 48);: S7 q/ e" |& `: c  S- ?* ?- T
       TIM2_ClearFlag(TIM2_FLAG_UPDATE);
8 s1 `0 U% a, G6 e9 z
       TIM2_ITConfig(TIM2_IT_UPDATE, ENABLE);9 |# a, K0 y4 o* ]- }6 o5 c, s& \* a9 Z
        TIM2_Cmd(ENABLE);
' S4 P' p% b  d9 G
}
) `& h, o& A5 J8 ]! f: ]0 i0 H* e% K1 K
步骤2RXDTXD初始化,RXD为上拉输入,TXD位推挽输出高电平
, U6 z8 B+ y( e* H+ U& [  I* d
#define Uart_RXD_Init()                     GPIO_Init(GPIOD,GPIO_PIN_6,GPIO_MODE_IN_PU_NO_IT)
: F1 h3 i! b9 m, w  u+ t
#define Uart_RXD_Status()                 GPIO_ReadInputPin(GPIOD,GPIO_PIN_6)
7 {% M; E$ z1 T
2 a6 ^+ t: J, Q% Q$ F# l. E) q
#define Uart_TXD_Init()                      GPIO_Init(GPIOD,GPIO_PIN_5,GPIO_MODE_OUT_PP_HIGH_FAST)% N, b) m, M$ d" e5 ~- |
#define Uart_TXD_Out_HIGH()            GPIO_WriteHigh(GPIOD,GPIO_PIN_5)
! L) Q/ d3 N: }$ A. s5 ^$ ^6 |. d+ y
#define Uart_TXD_Out_LOW()            GPIO_WriteLow(GPIOD,GPIO_PIN_5)
, j- n. k) Q& }$ [. J
; E$ [, t. F) N  o& I: _
步骤3、中断调用函数6 c2 w+ O5 E1 O# b) m
void Uart_Interrupt(void)
( P8 H0 d" X: _& j
{
4 Z, o( z9 P) {; r# U( _/ I& z
        uint8_t i;
8 W4 X: B! D, P# ?$ @
1 C, J' G7 i. g& R* K* o
        if(1 == flag_rxd_finish)
$ b" h! ^! s5 v" n2 T2 K4 J
        {
" U3 q/ I* r: m! G$ A$ s9 w' Y# b
               flag_rxd_finish = 0;
6 m/ g6 H; b1 L- Y' ^$ ?
               flag_rxd_txd = 0;
; p* a" U, L; M: v) L4 [
               for(i = 0;i < TxXKCnt; i++)' h7 t! t, V- d. e$ H7 D. o# j7 V. r
               {
3 O: k" a6 E2 M% }+ o2 Q% L
                       UartTxBuff= UartRxBuff;
9 V( Y/ A4 S# r7 R9 x7 E}; h. q. u- p& k  M
        }

; B3 W. G/ j! i" {% a! R3 `

/ b) `2 M/ _2 A* D
        if(1 == flag_rxd_txd)         // 为1,接收
$ s# N. j; d* o( i) w        {
, p9 B" y$ K/ _& ^) w" `: B3 o                Uart_Rx_Byte();
, C- B9 s9 C+ _' D3 Y        }1 U( U2 [& Q3 e  v
        else                                        // 为0,发送
: ]! c7 ]% i4 c* L8 A        {
9 j' N8 r2 j# p0 \8 A% i+ A6 H# f                Uart_Tx_Byte();
" `  f1 W9 \+ G# V, n        }
' t1 H: v4 z* p$ b5 V  J}" a% X0 z: r. Z* |( b

$ `$ Z( `1 T# n8 ^8 ]; k# y2 ?2 Y* J8 z* h
步骤4、接收函数
+ G, I( i- U+ Y' bstatic void Uart_Rx_Byte(void)" R8 ?5 @# y& {3 \  y5 {
{
7 ]/ {( W% S+ e% g0 F/ {8 P+ _        static uint8_t RxBitNum;        //接收位计数+ _: @* b' Q' u2 R, ?4 l
        static uint8_t OverTime;         //接收超时计时器
) _8 a1 k$ k7 S        static uint8_t RxByteBuff;         //一字节数据接收缓存
# t* }- Y9 U" k$ ~; [4 \$ Q8 i3 c% F3 B
        if(1 == Uart_RXD_Status())
( B" X' v. L- v6 \8 i7 H/ I5 g- q        {; O4 o& w  u: ^, G% Q+ ~
                OverTime++;
* N) n3 H+ g8 q: l8 R% Y7 C        }  c4 ?3 y/ t$ O& Z) s4 i% ~5 x
        else
8 }: w% e* j8 T- ~9 A2 D        {& i/ H  ^1 _. r
                OverTime = 0;7 N  V7 W( ^- T& x, Y6 V- ^
        }/ s1 ^4 v3 U* \/ R" Y  @
4 ~" R8 E7 Z* P9 e1 R* {; h, g
        if(OverTime > 44)
( O0 ?8 x5 t0 Z) u& l% I        {
4 J1 I% G( a9 ~  b3 G1 n! r                OverTime = 0;
8 _- T0 h3 B3 s% o/ u" A: C                RxByteIndex = 0;
$ o+ g/ U$ W) N5 r. Z/ g                RxBitNum = 0;# M+ p. H, J  x7 ~
        }
) g0 D' u8 |' M1 b& s) s4 m2 R- ?0 e0 t9 z! r7 f6 C
        if((1 == Uart_RXD_Status()) && (0 == RxBitNum))
1 O; i. X7 `, {1 H+ \        {5 @  |3 _' G: `
                RxSampFreq = 0;
3 M- m- T7 {/ G        }
& r7 V. l% m, }5 u1 c        else
6 z. m; E9 ], a        {- }5 _6 _: C3 L; ]+ y( y
                RxSampFreq++;+ P' r8 v; N0 i4 v* e1 D/ ]4 i
        }
/ V  Q& m/ s; a" [: r& }& L* D
& _$ N6 S' X! R        if(1 == RxSampFreq)
0 ~: p4 N& a, W: J" {+ @& m        {
" p* F% |9 e% u) N( p                if(0 == RxBitNum)
6 Q/ w0 I6 X' A$ c" |1 V                {% ], q3 R' h3 f$ B
                        if(0 == Uart_RXD_Status())
8 d6 @( S& S4 l5 d& p5 W3 O6 `                        {
; \5 g+ G% @7 {. ^* E: d                                RxByteBuff = 0;
" e* t0 q1 \2 [+ A4 Y* V6 n                                RxBitNum++;
9 ~- Y' J, ^1 V4 i( Z# M; P                        }
9 i0 b/ F/ H: i; \  d/ y: M7 d                }+ F3 T& P7 q" K3 Z) I
                else if((RxBitNum > 0) && (RxBitNum < 9))
# v8 D- _$ U" }                {
0 v. \9 [3 J, J6 x& n! P7 j8 x$ f, @* @                        if(1 == Uart_RXD_Status()); D7 |3 N- x" S+ v5 w1 F
                        {) z. ?/ h! T8 a7 l( k. r
                                RxByteBuff = RxByteBuff | (1 << (RxBitNum - 1));- n7 A% J% p& b& b
                        }
) f$ b- V* i- k0 J7 K# I1 J                        RxBitNum++;
& l; s) f- M3 E3 p+ M0 X- q  K; s                }
% U4 R2 L9 b9 @! r                else if(9 == RxBitNum)
8 S+ m6 z! d" E" @9 Z                {
) Y, c2 S* ]/ Y1 V) r                        if(1 == Uart_RXD_Status())
6 _8 h. q$ j% w; Y                        {6 P: P$ x8 }: h3 v; ?
                                RxBitNum = 0;
5 E- E, ~; K: h! M% T                                if(0x0d != RxByteBuff && 0x0a != RxByteBuff)
, [' J1 E( Q- {4 O                                {9 p/ [6 F+ W1 a1 J7 }* G
                                        UartRxBuff[RxByteIndex] = RxByteBuff;
1 F5 X7 r" n; i: e! A                                        RxByteIndex++;& D- y) ?& M2 l- j2 |
                                        if(RxByteIndex > 63)
6 I! b( Y6 T! L! n$ A- g                                        {% y0 Z; g5 A' r' Q' k
                                                RxByteIndex = 0;" C, e- U, H& X4 `& Y- c6 u2 J
                                        }2 |) c/ @+ H, Z7 i0 T6 |- v0 ?
                                }' U5 @: h" i8 J9 T* Y! _; a
                                else
! ^3 X* T7 [, c" y                                {
; m& ?: f' w- ]  Y6 q                                        TxXKCnt = RxByteIndex;
! D2 |3 \7 d" \* ^% k" G% `3 ?                                        RxByteIndex = 0;
9 i7 P8 |$ `8 b                                        flag_rxd_finish = 1;2 d# H0 I( G' n* C# J
                                }
. |* n7 `$ L" l3 {- ]* {/ ~7 k                        }
5 }8 r' Y! E. x& ]7 g                }
  ?# l# B! c+ t# C$ j                else) }* T) ^" |! _4 c
                {7 S5 c7 G% b+ d- j2 L* h7 x" t
                        RxBitNum = 0;2 u$ L9 a! d8 K& D# X
                }3 @: Q& G) v/ x) g1 o
        }3 r. J/ L% g' h- v; @% W: ~
        else if(RxSampFreq > 3)' n5 a2 K( [+ m8 Z; d
        {/ a8 [; M$ Z8 c4 l
                RxSampFreq = 0;- A8 q9 K. J6 \. f5 {" n' g
        }
1 J% B; h9 E4 ?0 E: S, S! n# h}
1 A5 v4 J# {; P. i6 H- {$ _' f
# [4 Y* u: t' C7 y: }9 z贴子超长,接下页。1 ~+ y/ S/ s; M4 T. Z  c

6 e$ ]! q1 R4 x1 w7 r7 t" M
% J/ M: @8 p* s* `, r4 r" i' y- h; B( M8 \. t5 j

2 F8 e1 K0 k1 W& m" s- O' j( |  F) n$ ]4 K$ ~* F. K! i  \4 s, l
5 X8 d0 ]* i& E8 c

  f. k$ |8 m* R/ H. x, R) z$ J+ n
STM8摸拟串口.jpg
收藏 2 评论20 发布时间:2015-1-6 17:04

举报

20个回答
黑溱郎 回答时间:2015-1-6 17:04:54
本帖最后由 黑溱郎 于 2015-1-7 10:55 编辑
: @' R9 L4 t3 f; H+ {: \; T5 T( C& f9 H1 y4 J" D1 k( T% Q: C9 \
接上页。& Y" H& v) e9 K8 g: b" |
: j5 o6 c( U& Z" h  f
! b  ]& y% _: T6 c- D/ |
步骤5、发送函数
+ T' h/ G. n8 |' r4 _8 {' p1 P: Hstatic void Uart_Tx_Byte(void)+ [6 d& M% d$ V2 |6 W2 q0 h/ z8 N
{2 }3 E) B& V9 ?. O
        static bool SendFinish = 1;        //发送完成标志$ D  ?3 {& w# }/ t$ m
        static u8 TxSampFreq = 0;                //发送计数        采样4次
4 x% J5 Q, J; N% O" Z& g        static u8 BitNum = 0;                        //位计数
6 G1 L+ s1 B6 @% O+ U* b; N/ h        static u8 ByteLock;                         //发送字节锁定(防止在发送途中 发送数字被改变)
" J9 ?$ \: n+ Q; \        static u8 TxIndex = 0;                        //当前发送索引9 B2 `6 y1 F) Q& C; N7 _7 C
* `; E7 a6 V9 A6 s/ ^9 d
        if(SendFinish); D3 P$ t4 u; ?( o* ?1 h
    {
2 U6 @% H3 X6 H% r2 m2 k       SendFinish = 0;- e8 _8 ^5 |9 A
       RxSampFreq = 0;, Q; s$ T& I& X0 h2 x# Y, p! U! s
       BitNum = 0;! h' B- b+ I, q. h6 U1 W( \4 l2 D
6 y4 O: _' a2 ~8 ~5 b
       if(TxIndex < TxXKCnt)        //控制发送的字节
& z" ^; m3 W; Z% z* z9 H       {% F" E  P% }& Y5 |9 ?
          ByteLock = UartTxBuff[TxIndex];
! r$ @) `, `+ u$ y0 {9 b+ @          TxIndex++;
0 g# X3 ?0 t& w. I5 p. F" v          RxByteIndex = 0;, K7 Y! m" h, ?; n! |
       }0 _8 E$ R( E( {( r. ]5 [5 O
       else if(TxIndex == TxXKCnt)
2 b' U9 X" q- {. u7 h% T       {3 J4 K0 v* f( Y# g% `, }  @# X6 ^
          ByteLock = '\n';. s0 s$ s' F0 M9 |# W( n: J
          TxIndex++;! n9 S3 e2 Q/ L! n) j
          RxByteIndex = 0;+ g5 _7 I; h. A: x5 F
       }1 ?/ Y! [. p& y  p  _8 }8 {0 _
       else
5 y- m8 A; H5 f' n' w       {
9 a6 S# v$ C  H7 u          flag_rxd_txd = 1;
3 L  u/ j: o$ Y# V0 `8 q( Z; n; A8 ?          SendFinish = 0;) z; B2 j! Y5 [% r  Z& @; w7 s7 P5 s# o1 C
          TxIndex = 0;
- E3 Q" \9 l- t! D3 \8 n       }* d: G. Q& x- G3 p
    }
% T3 g2 v+ {" L+ m- x" |/ o
6 [7 j+ F* s1 Z9 T) z  D, M9 t    if(++TxSampFreq > 3)
. T: L/ o- p$ X# O. S; w    {
7 j6 V  `+ F# k( M        if(BitNum == 0)                             //起始位
& [" K5 i+ p' q) @        {
8 X" B! X! b7 F) }% ~  z            Uart_TXD_Out_LOW();& J  j& z% q9 }' W
            BitNum++;5 ]4 V* u* G) O5 K1 U* X
        }
7 e6 ~: |- a  D7 ?; |: C        else if((BitNum >0) && (BitNum < 9))        //数据位
: P6 ]+ v' x# |$ r) P7 d- e        {
- N. f& G* U  D. K: {            if(0x01 & (ByteLock >> (BitNum-1)))     //先发低位0 c6 d* i$ r8 C$ p3 L& {1 z
            {0 ?- T6 d' r; i8 J7 B/ I
                Uart_TXD_Out_HIGH();
3 \6 M' g) D) q            }
4 g/ _, a7 o6 }            else
* }; j( p1 ]- q2 H( n            {
. }" `1 N; U/ t6 n( I                Uart_TXD_Out_LOW();
1 i0 i* P6 G7 C7 j% X            }
. g; ^- d: u- m5 l0 m. f+ W5 m            BitNum++;6 z' Z3 a8 W- X/ @2 D
        }
" E, C2 C) J; S9 A        else if(BitNum == 9)                        //结束码, z) H+ k$ M5 n* |6 o5 Z
        {
/ K' N8 q' @! ?2 P, ?            Uart_TXD_Out_HIGH();* ~2 Z. T7 G- a1 w
            SendFinish = 1;- `) M* B" t! W! T0 }1 W' x
            BitNum = 0;) N. W9 |6 J- H$ M7 U1 J
        }+ @: K. z6 a. m# n7 H
        TxSampFreq = 0;
; r8 M7 b/ \# p/ q    }6 I: G2 x. d" a+ r
}
: w6 i/ ~% a5 J! M. h+ b
holts1 回答时间:2015-1-9 15:33:46
黑溱郎 发表于 2015-1-9 15:22; \. ?' M3 j% r3 i9 Y- g# ]9 Y4 J
能正常运行啊!
' s# a3 A+ G) C. s0 X& o
当然可以的,我还打了板的
黑溱郎 回答时间:2015-1-9 15:22:31
holts1 发表于 2015-1-9 14:25# f& W; _0 t9 k& b+ Q7 M
能正常运行吗?

* h8 c0 U) U2 V0 Z( [能正常运行啊!
zndz410 回答时间:2015-1-7 16:05:15
不错,学习学习,楼主最好上传个附件。
光光子 回答时间:2015-1-7 16:14:16
模拟串口资料网上有,这个实验可以借鉴。
郎爱上羊 回答时间:2015-1-7 16:23:55
收藏一下,什么时候也试试。
白云悠悠-2021021 回答时间:2015-1-8 16:52:04
改天也试试楼主的代码。
默默前行 回答时间:2015-1-8 17:14:26
不错,有空会试一下。
abend 回答时间:2015-1-9 11:22:10
又看到一个不同的串口测试软件
holts1 回答时间:2015-1-9 14:25:32
能正常运行吗?
与非凌 回答时间:2015-1-9 16:19:28
谢谢分亨,收藏了。
STM832 回答时间:2015-1-9 16:49:42
谢谢分亨,学习学习。
ABCDE 回答时间:2015-1-10 20:42:55
楼主这贴不错, 好好学一下.
木易-357428 回答时间:2015-1-10 21:39:23
谢谢分享,学习一下
12下一页
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版