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

基于STM8的模拟串口

[复制链接]
黑溱郎 发布时间:2015-1-6 17:04
本帖最后由 黑溱郎 于 2015-1-7 10:54 编辑 ; l; Y$ Z% d; G4 P" h

8 T9 z/ }) U/ [; i' G+ h: k4 B& @9 o: ?4 V1 a
( Z3 `" N' C, z6 l) z* y
下面是STM8的模拟串口实验例子
实验工具:STM8S103FP6最小系统版, ST-linkV2 PL2303转串口模块. E# x+ U5 ~% M- i  J5 g

0 G% k* A- }) f& v3 m" Z
步骤1、算出定时初值, STM8内部晶振为16M 采用8分频后震荡周期 =8/16 =0.5us,所以发送或接受以为数据的采样定时器初值应为48~52  }+ N& `0 S" s' f+ }8 o
下面为定时器初始化代码:* q- W9 G: D8 K4 k3 w$ R# S5 L
void Tim2_Init(void)3 J$ y# I2 A: a) ]' r5 X! V
{
. c4 I) Q1 g# Z: p) h
        TIM2_DeInit();7 D9 Y  {' S% n0 E$ H* t! m3 j
       TIM2_TimeBaseInit(TIM2_PRESCALER_8, 48);% Z8 i6 V+ `6 I2 e& K! b2 M
       TIM2_ClearFlag(TIM2_FLAG_UPDATE);
2 \7 E$ z2 P3 w! n2 n
       TIM2_ITConfig(TIM2_IT_UPDATE, ENABLE);# S  ]1 d0 m; N) m% R
        TIM2_Cmd(ENABLE);1 B5 Y: X& \. b
}/ r3 l* w3 L! H& q5 q- B" f' S% Q
, P2 T- }% I; i. k, }/ i
步骤2RXDTXD初始化,RXD为上拉输入,TXD位推挽输出高电平' e5 x+ `  ~& _! X, }* Z
#define Uart_RXD_Init()                     GPIO_Init(GPIOD,GPIO_PIN_6,GPIO_MODE_IN_PU_NO_IT)
5 m1 a; g% J$ h$ Y
#define Uart_RXD_Status()                 GPIO_ReadInputPin(GPIOD,GPIO_PIN_6)6 w' e1 G: H! Y' y
% h. `- V, r' C) U$ s. Q9 h" ~
#define Uart_TXD_Init()                      GPIO_Init(GPIOD,GPIO_PIN_5,GPIO_MODE_OUT_PP_HIGH_FAST)+ V& C# ^; O6 v# l2 B1 T
#define Uart_TXD_Out_HIGH()            GPIO_WriteHigh(GPIOD,GPIO_PIN_5)
+ D7 p9 m0 x/ c5 I9 i, H- T, x
#define Uart_TXD_Out_LOW()            GPIO_WriteLow(GPIOD,GPIO_PIN_5)2 L( E( e" v+ z! e

2 U, }& N  z2 b; L
步骤3、中断调用函数: k- s# ~6 n$ a( e; l0 c
void Uart_Interrupt(void)
- ^) u# J3 J8 Y/ w' i
{/ m. k! V4 c3 B% n! A9 s9 Z. F( Q
        uint8_t i;% r! J: y4 _8 J* J) Q8 S

( s) Z! v) n/ U! E# L  a! K8 Z
        if(1 == flag_rxd_finish)) J' v  G0 `' V' A* X  h1 t5 {
        {! }7 f# z( l. _& W+ T1 A
               flag_rxd_finish = 0;3 B) L3 s8 j6 V* P' E0 f
               flag_rxd_txd = 0;
- v. z% f/ g- j) [
               for(i = 0;i < TxXKCnt; i++)
- Q6 P  N' a( j+ O, t; n" I
               {
6 E' k/ T3 x+ Y' J- u$ r
                       UartTxBuff= UartRxBuff;
) W1 W5 y7 Y9 k5 o/ T' Q}* f( ~, q+ x" i3 d' }7 R% B
        }

& O' J9 R. a1 x# \1 [1 `
. V% o" V, D7 w8 g) l2 \
        if(1 == flag_rxd_txd)         // 为1,接收) Z; B! J% ]8 x, x, o
        {
. ]1 R0 C5 C$ g* V) _                Uart_Rx_Byte();: Z: d, }4 [; D6 t2 i  c& E1 W
        }; X% H( g8 N2 }/ Y* |  Y
        else                                        // 为0,发送
& R4 j' d: ?9 J& Q6 M" G        {
' H4 P5 B( Z( T% s$ u                Uart_Tx_Byte();
8 x& n6 U: o" ~        }/ V5 [8 z6 c, J: z* G5 r
}. j/ s6 F* M% |  \
% w( @4 g9 `2 f8 `

( Q% Y) k% i% S( @6 P步骤4、接收函数" n' y# u* ?7 q4 N0 v
static void Uart_Rx_Byte(void)" k! h! x) v+ u9 ?2 n
{
5 ~/ z& n+ R: {6 e. L9 ~        static uint8_t RxBitNum;        //接收位计数
3 V1 z0 z* n* T        static uint8_t OverTime;         //接收超时计时器
+ k) J/ C. j  P- Z1 i+ d( i8 H        static uint8_t RxByteBuff;         //一字节数据接收缓存$ b1 @& V  o5 N2 s5 X" V& a" ?

# O$ f. J4 D* i4 A! L. u/ R3 q2 [# o        if(1 == Uart_RXD_Status())9 h% ^! f6 |: O4 `; l: o- D
        {
6 J& a: I( t. A1 m$ A                OverTime++;0 s4 N8 ^) q+ g* l4 ^& Z6 M  }
        }/ k5 h  P) |( j" y  a! Q
        else
9 Z8 \9 g" b/ a* @5 ]9 }7 Q        {
) c4 h, g% g2 ]4 u  ~  [                OverTime = 0;8 ^1 a6 O' ?2 Y6 u: j
        }
4 x+ s) c# _6 Y# K* y( \+ P$ v0 b$ T! D0 c
        if(OverTime > 44)' j+ I8 [& e- n7 _
        {
; o, y6 O& F+ Y1 K0 S                OverTime = 0;
- A4 p8 J; V+ m4 F0 l8 e. a                RxByteIndex = 0;
( J3 s# P' N) U9 [0 h                RxBitNum = 0;
% M" ?5 s/ [8 I# f" H0 e        }
9 H0 L/ f  a& w  D6 w8 y8 x2 O. b+ W" S0 b
        if((1 == Uart_RXD_Status()) && (0 == RxBitNum))$ r! d$ k2 T" n' H  `4 y: A7 Z
        {
1 l9 D/ ~: Y# C                RxSampFreq = 0;1 o  c! Q, I* Z4 \2 @" ]1 u9 C. s
        }4 Y9 |+ p# [" W( S/ Y8 M
        else. j+ z5 C/ i" b
        {3 Q3 o$ [( i: @7 @
                RxSampFreq++;3 _4 E4 V  ?8 m2 P6 E
        }
- ?1 G/ Q4 y0 n7 C
6 u) k$ ?! ]3 h4 D4 m7 d# O        if(1 == RxSampFreq)3 c  }' n. g6 t0 x5 y, ^: K0 h
        {
' f0 a% K" B* l$ O                if(0 == RxBitNum)
  O2 v! Z* `# m& S, J! ~                {" M; T7 V6 t% s
                        if(0 == Uart_RXD_Status())
, d7 v% K$ O) }$ p3 N5 K                        {, U: }- }7 H1 p$ L
                                RxByteBuff = 0;
% Z' B/ K2 i" i! X. I) j                                RxBitNum++;
3 ?7 ~) O& i5 k7 G                        }
+ c; K8 `8 ~# S! @                }
8 l* m6 u, F% T+ T9 u, E                else if((RxBitNum > 0) && (RxBitNum < 9))% s, d- S) I5 X/ f
                {# e$ ?9 N! o, F! l8 K/ j: t. C
                        if(1 == Uart_RXD_Status())8 n& l/ u. ]* c0 R5 Y' l2 X. a
                        {
9 d/ y$ K) e, e% A* B. R                                RxByteBuff = RxByteBuff | (1 << (RxBitNum - 1));& J0 x) x8 G8 F' O- G
                        }
. n$ ^. l; F5 e4 c" K1 e                        RxBitNum++;
3 ~7 K! J6 B/ z/ j& B3 U                }
  [, I! R1 X1 E3 I# T. z                else if(9 == RxBitNum)# r! j" |4 e; w6 a
                {
6 M4 g9 [" g, @! c4 y6 U                        if(1 == Uart_RXD_Status())) U  u8 Z- s- W! V' \$ l
                        {+ x( c$ H$ I) n4 C2 U/ G
                                RxBitNum = 0;3 K  y' Q+ ]4 P. V( X* |
                                if(0x0d != RxByteBuff && 0x0a != RxByteBuff)
# J- ^4 D( H) H+ Q5 }                                {
  ^" _, W- Z7 g6 O( ^                                        UartRxBuff[RxByteIndex] = RxByteBuff;
' V6 O) l# j' B5 f4 X5 [                                        RxByteIndex++;
& ^" p- S, d1 Z0 l6 V                                        if(RxByteIndex > 63)4 F$ l0 w* g6 @0 q& J% W2 X
                                        {" J" z8 n: j7 p! ~% l; l1 x( B
                                                RxByteIndex = 0;/ Q& w  }2 }/ {. v# e" ^
                                        }
( A5 L! @9 e; F" N                                }8 G' u0 v& G" k) b- k- }, l% m
                                else
  E% Q* h) E, O: y+ S/ U4 G                                {7 U. k) B6 B6 h" w3 D, ?
                                        TxXKCnt = RxByteIndex;
4 I6 z6 F; B0 f1 [0 z) p2 b                                        RxByteIndex = 0;
: K- U& W9 o& D* g, h' K7 a                                        flag_rxd_finish = 1;
  ~- R8 V, ]& {                                }% W) q# n3 |$ v8 Z( P0 S9 G9 b6 _
                        }- I3 J, Z' N: j2 i% A
                }* k4 B/ L5 ^: ^. c8 m. A
                else3 B: C: H- K7 W( `, G
                {
) R0 W; H! c/ G3 O0 y                        RxBitNum = 0;: g: X% h- q/ S% v
                }! N9 {8 \# F5 _1 U8 W
        }
) m; H% J" p* c4 H, Y        else if(RxSampFreq > 3)3 y# I5 D- @: q5 m0 ~3 B0 e
        {" A4 C9 I* q$ r7 M) I+ ?
                RxSampFreq = 0;
5 _: d, Q) S! G+ X1 @5 ~% V        }1 M1 M2 [+ x6 F7 V& t' m; J. v
}
: _  R, J" B) a3 K6 w: Z% q7 s+ y- K( @: V% Q& L1 h
贴子超长,接下页。
. ?& o( A9 ?1 Q1 X, \% h' B5 T% h

% u2 b* v; ~  E; C- y) H3 h2 n/ Z; m$ n( D$ t

; a9 V; a, c+ m4 d1 a3 {) ?; e* y5 o* c# ^) T% m- c

3 J  N3 |% r. y  k3 m! ~/ k* }( k
- d" |! t3 F' J) w4 i" g, g4 r
STM8摸拟串口.jpg
收藏 2 评论20 发布时间:2015-1-6 17:04

举报

20个回答
黑溱郎 回答时间:2015-1-6 17:04:54
本帖最后由 黑溱郎 于 2015-1-7 10:55 编辑
. l: t5 M* X5 {; O3 b# N) c9 u; f& z6 a. G4 V; M1 D1 _/ h2 p
接上页。
1 h/ u! i+ K, V: I7 l& H
" ^; y* l  V; R
; z0 n; I2 x/ r2 C; f, A步骤5、发送函数
2 |! k4 b( D& ]. H' Bstatic void Uart_Tx_Byte(void)
8 ^" a* d2 ?0 v) v+ x) x, R- h{6 Z# F1 b( T" v6 P) T
        static bool SendFinish = 1;        //发送完成标志5 J) }# p  N0 V  P
        static u8 TxSampFreq = 0;                //发送计数        采样4次
  T( [2 `8 Y& N% L        static u8 BitNum = 0;                        //位计数
0 F! e' f5 P: G7 i1 W/ a        static u8 ByteLock;                         //发送字节锁定(防止在发送途中 发送数字被改变)
7 t# Q0 Y& ]7 k" n& Q( J        static u8 TxIndex = 0;                        //当前发送索引& R( o6 v! Y" s

9 B3 O* q; ?6 V9 h0 n" u        if(SendFinish)* Q5 q! K" V  Q! h) r4 M' r
    {. X7 ~5 t+ G6 ^. [' v/ h
       SendFinish = 0;7 {) o6 E. d5 I/ u3 q' U; z
       RxSampFreq = 0;7 G. E( w; G+ l. q/ s) N0 F
       BitNum = 0;2 t3 S5 P6 b5 }- B

* o' ^0 \, c: G8 B; m2 [5 ~4 [       if(TxIndex < TxXKCnt)        //控制发送的字节
" @2 v1 e$ `& e* q, |9 W( H       {; F# I: m. q) \: I# z6 [
          ByteLock = UartTxBuff[TxIndex];  I; Y% g2 c# i! h$ g( e8 D6 L
          TxIndex++;
% j/ t/ k4 p, z4 d- k2 ?          RxByteIndex = 0;
( p  f3 x7 m9 J1 H       }
, y- F' t. |; z; n, C7 _       else if(TxIndex == TxXKCnt)9 _1 K1 X4 v; v4 ?* ^
       {) H: y$ T/ y9 F; i7 A  e
          ByteLock = '\n';
' @4 m" {  g/ Q' i4 P          TxIndex++;
- {1 C: M% ]# C: \5 V          RxByteIndex = 0;
1 V4 r7 |! d/ l1 d& N( s9 b) n       }
8 u- K5 k" b( \! u5 o* U       else0 `% G# ~4 }! Q" z* t
       {
+ c; P( t6 g& ]# T; B- _5 U2 B% C          flag_rxd_txd = 1;$ D0 P  T# d" i% o) {7 F& u  d0 n
          SendFinish = 0;3 w: ^' A: y5 D/ y/ R" L8 A
          TxIndex = 0;
+ L0 z# I, e3 K1 j9 i2 O, H2 z       }) t5 y) F& b7 q$ q% M% p
    }
6 ^8 Y1 s5 a9 b- o  Z: ^' j2 G$ k1 M& C0 Z6 }
    if(++TxSampFreq > 3)& d3 E5 u! T  U* J% U$ _
    {
, j1 A) s! M( j# t1 E  U6 [7 Z        if(BitNum == 0)                             //起始位
- J; K/ o6 b9 _! A- |        {% t" P8 O4 G' o5 d$ G
            Uart_TXD_Out_LOW();
/ [: N- H8 |6 I            BitNum++;
2 \0 q. C4 o! @        }- j, p  ^. b) V& |! o& @$ }
        else if((BitNum >0) && (BitNum < 9))        //数据位) l" V  j& n& k3 M" {
        {7 t; _+ T1 n8 w3 u
            if(0x01 & (ByteLock >> (BitNum-1)))     //先发低位
6 j- M( W6 O, y- |  w            {
5 e0 @3 N# y3 x) y4 y                Uart_TXD_Out_HIGH();
5 d; O, }( D* o            }" B8 x1 h. m" Q  j
            else5 ]/ b7 f) q  N3 r1 D% e
            {3 V( a  q7 a3 D8 u# J  t
                Uart_TXD_Out_LOW();7 J* Y: r5 E6 U, X4 ?0 _9 B9 |
            }
- y' v0 V3 T) _1 t            BitNum++;
1 b0 d1 |# V' ]' }        }7 n1 G4 E; p; V4 r! D, I: s
        else if(BitNum == 9)                        //结束码
. R$ C8 T+ {  r& `- b+ s        {% Z# X8 {$ m; j3 N% B& k- I2 s
            Uart_TXD_Out_HIGH();
1 @% Q+ r, |- N            SendFinish = 1;" `( k; m$ _0 r9 ]. _3 n% |* ~  T9 ~3 F
            BitNum = 0;) i2 K9 m% Y+ l; {& A$ o+ j* I
        }+ t3 ?% d4 C9 ]5 o
        TxSampFreq = 0;% [3 k6 O- ]) P) e" C
    }
* U) ?4 T# Z6 Q. B* y$ A}
+ `5 t+ {8 @+ ~
holts1 回答时间:2015-1-9 15:33:46
黑溱郎 发表于 2015-1-9 15:22
4 t! @7 z8 q7 q/ b# p; c能正常运行啊!

2 x8 q" J( t' O当然可以的,我还打了板的
黑溱郎 回答时间:2015-1-9 15:22:31
holts1 发表于 2015-1-9 14:25
: z; W8 L+ c* L能正常运行吗?

2 z) @: z  B2 W, \! X! q能正常运行啊!
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 手机版