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

基于STM8的模拟串口

[复制链接]
黑溱郎 发布时间:2015-1-6 17:04
本帖最后由 黑溱郎 于 2015-1-7 10:54 编辑 5 q( z& z# e# n4 D
& ?. i4 h# S( K
2 X; N( q. b5 {8 t2 I6 F5 D

8 G' u, c. s7 b2 Q* b& y2 r+ n
下面是STM8的模拟串口实验例子
实验工具:STM8S103FP6最小系统版, ST-linkV2 PL2303转串口模块7 @9 e: \% e& @$ }* z1 R
  q: m8 S. y& U; L6 B
步骤1、算出定时初值, STM8内部晶振为16M 采用8分频后震荡周期 =8/16 =0.5us,所以发送或接受以为数据的采样定时器初值应为48~52
* q$ I+ z0 Z* m: ]4 l1 [
下面为定时器初始化代码:
/ ~, t" ]9 F3 S, w9 [7 K
void Tim2_Init(void); S2 d0 a' l4 a, I; l* ]8 T
{; [* n4 T8 n4 E, {' U1 o
        TIM2_DeInit();7 i8 t) [0 l" j# w
       TIM2_TimeBaseInit(TIM2_PRESCALER_8, 48);
1 X) D1 N% T' N2 P+ n- o
       TIM2_ClearFlag(TIM2_FLAG_UPDATE);
  a; f  ]2 }- i9 n
       TIM2_ITConfig(TIM2_IT_UPDATE, ENABLE);
1 m- R: s: M  r" |/ n' i4 w
        TIM2_Cmd(ENABLE);
& ]4 i8 D7 j: u5 C" e) J
}
/ h& c# O5 O# T# O, p) m1 w$ P/ x5 v$ Q2 l
步骤2RXDTXD初始化,RXD为上拉输入,TXD位推挽输出高电平
1 c* d7 ^/ C3 ?. M  k; g1 \& V
#define Uart_RXD_Init()                     GPIO_Init(GPIOD,GPIO_PIN_6,GPIO_MODE_IN_PU_NO_IT)% o9 W: a5 Z- O) m, Q1 g
#define Uart_RXD_Status()                 GPIO_ReadInputPin(GPIOD,GPIO_PIN_6)& O2 }& \; y& W! A5 e

, L. L/ G1 z4 ?" {+ q
#define Uart_TXD_Init()                      GPIO_Init(GPIOD,GPIO_PIN_5,GPIO_MODE_OUT_PP_HIGH_FAST)9 V& W( U' Z$ h8 ?$ p
#define Uart_TXD_Out_HIGH()            GPIO_WriteHigh(GPIOD,GPIO_PIN_5)& `+ ], f2 b* S4 n# k
#define Uart_TXD_Out_LOW()            GPIO_WriteLow(GPIOD,GPIO_PIN_5)* c9 {6 g# ^# ?. H7 L

: }4 e7 @& u9 a1 W
步骤3、中断调用函数
( T+ B5 \/ u  V1 v
void Uart_Interrupt(void)% `$ N8 D0 _% j9 F
{
& P  x9 x+ F) y' `) `3 D. i
        uint8_t i;1 X9 C6 C0 {' G1 N
' }: P6 g  w! y; Y2 Q0 V" s
        if(1 == flag_rxd_finish)6 c# E3 T# G! n' T1 t
        {
; K! w0 J5 W$ b4 l& Y
               flag_rxd_finish = 0;9 J7 i0 f- G5 p0 _$ V) g! {6 l
               flag_rxd_txd = 0;
* k7 h  T% K2 b0 l6 {! Y* y
               for(i = 0;i < TxXKCnt; i++)- q2 u5 R% m, e5 u3 `/ {
               {
; k- k, T! v' }* n* e0 `, n0 J
                       UartTxBuff= UartRxBuff;
8 [# ~, S4 u( S2 c0 T; P2 g( }( T# P}
; m+ A: w# E# K* n7 E2 S. q+ N2 |        }
/ l3 g- w$ _# k, D: Z7 k/ |% l& f

. y0 A. j: Z' K* n$ l" w1 |
        if(1 == flag_rxd_txd)         // 为1,接收; O2 m( g1 H" [. N1 f$ }* A! W
        {  Y& ~; H) X2 }( W
                Uart_Rx_Byte();
+ I! e2 l: |* `& ?        }
% n# ^7 s9 m4 B6 s: ^1 |        else                                        // 为0,发送
% [% j2 o0 l$ U& K5 A        {
  R2 z/ v, H7 i' S: b1 r: P                Uart_Tx_Byte();; \% [) v' R2 T. _
        }
+ W. F! V) C+ p8 l2 r, l# V$ _}! T: o/ f8 }+ t5 Y- C7 d3 D. g& i& ~

( C9 k+ A4 R' _. z$ Q
- |  L8 Z2 I  \. ]5 j) g9 I( i% k( ^步骤4、接收函数+ t6 f$ t  G3 V; ^/ |
static void Uart_Rx_Byte(void)  j, z6 N/ E# V# A9 m" C
{- k3 I) E! `) ^: `: a$ ~# A/ ~4 `
        static uint8_t RxBitNum;        //接收位计数7 C2 I! k+ i" S; b" C
        static uint8_t OverTime;         //接收超时计时器. c$ P- t. z& |! [* `( [0 `
        static uint8_t RxByteBuff;         //一字节数据接收缓存
3 e) ~: L; n$ u5 I4 ?( k/ k
5 s. L3 g) u! b& j2 z% K        if(1 == Uart_RXD_Status())+ u5 B& O  h, m, n4 _% y3 B
        {
# f, ~0 Z% L: ^' Z7 k                OverTime++;8 ~# h/ C  ?. u% F* A/ }
        }2 @- D/ |6 n& d! {/ }: O) D; }6 l
        else+ d) Z3 g+ ]' c. {0 L
        {
; H3 ^% w. Y& L6 g6 K' S                OverTime = 0;, d4 m# o2 |) }# a% _8 r- ?
        }
( ~1 y( p' F( Q# o) Q$ D
8 j) w# T0 a) {! e- O1 D- Q: d( {        if(OverTime > 44)3 j0 i4 F4 j! O( e4 e" e
        {
! v3 A& P( q/ V: P3 s0 [                OverTime = 0;
0 Z) t* p6 ^3 d! X                RxByteIndex = 0;% y- Q1 ^/ G; ~
                RxBitNum = 0;- m! Z1 {8 C; A4 {, c% {  \
        }8 n9 n+ E1 M5 C0 }5 O
; |1 }8 U/ T- ~, T+ M; D
        if((1 == Uart_RXD_Status()) && (0 == RxBitNum))
# [# a( _% \' A9 |        {  ]+ p. @& p0 k7 x6 \( F* R( ^9 Z
                RxSampFreq = 0;1 c. ]% C* W* C- x- _
        }
$ j7 J6 M3 g# S6 E2 X4 g        else
: a* I4 B. }( q! D        {, J( o% I1 U/ B
                RxSampFreq++;) L" H7 t# z) W' t# D6 e
        }4 y. x7 U5 [  A' G0 I/ W

$ f1 H0 m1 y& D        if(1 == RxSampFreq)
5 \6 N+ `" j7 N, l1 k% m3 H        {9 ?2 V: A* ~, l8 a
                if(0 == RxBitNum)
9 A4 K& e3 f2 J* x9 `                {
" f0 m! `/ V% O% q+ ]+ d5 x                        if(0 == Uart_RXD_Status())5 E3 c+ X, {  \6 z( D4 C
                        {
- g& }: I% z5 V! L                                RxByteBuff = 0;/ a3 l3 @% {  `
                                RxBitNum++;5 q0 E; Z: {3 |9 v* c( h5 k
                        }
2 g3 B  r+ y0 a                }' W; u2 F. K; H( M) O  Z
                else if((RxBitNum > 0) && (RxBitNum < 9))
9 R, w* e( J- b, r& G                {, ^$ L. V6 m  l" V: ], S
                        if(1 == Uart_RXD_Status())+ R1 N: V8 e3 s6 G
                        {
5 Q$ T# J4 ?. \7 G+ j8 i2 ], `  a                                RxByteBuff = RxByteBuff | (1 << (RxBitNum - 1));2 z+ Z) T! |( h! E$ q& n1 ^# D
                        }
/ {* S& V9 u3 C+ f; i: |4 x                        RxBitNum++;
! q2 [- D: h! ~. t" L# y3 u; x1 }" J                }
- {; p# v2 t, z& D# ?( E7 f! z9 P                else if(9 == RxBitNum)
# E9 l6 ?* T8 x8 Y- x6 o: k: m: z" v                {
/ R5 y* b6 N! |* J                        if(1 == Uart_RXD_Status())
! V/ Q$ E# W! j; Y( z9 z                        {
- p1 {5 e& u# l9 m: J% ?) T0 D8 c                                RxBitNum = 0;
1 c" v: M' t$ Y                                if(0x0d != RxByteBuff && 0x0a != RxByteBuff)
# ?9 i6 I2 Y: ?; d( J+ O. h$ A                                {( H6 a0 i/ v; G; c8 P
                                        UartRxBuff[RxByteIndex] = RxByteBuff;' k" n: i$ e) V) T
                                        RxByteIndex++;4 J, u& x6 V! D& w3 t
                                        if(RxByteIndex > 63)
" i& M" x. K9 _' M3 }" y7 V                                        {
; l7 n( T  b* \, L3 B; ]8 a                                                RxByteIndex = 0;& A, ^5 _/ {+ l4 g3 ^5 P9 d
                                        }) R9 _+ `: f$ |2 y+ k
                                }0 o; H: ~  {+ V7 v6 N# L4 c
                                else. a3 Z  A3 N- |2 V
                                {9 n) G, {9 T6 h6 ]" C
                                        TxXKCnt = RxByteIndex;2 m2 c. x+ L' G# {" f2 W2 n
                                        RxByteIndex = 0;$ F' s" Q+ w7 e8 o7 f/ o
                                        flag_rxd_finish = 1;3 P+ B$ ~8 O& G/ k& {) G2 P
                                }; W  G" V" v7 N: R. d$ }9 \
                        }. e( E1 q; s9 B
                }
6 K8 c, M2 Q- c4 x9 [! T% |                else
& R) v& M1 N6 ?  L  B6 y                {
- ~0 w! j* y0 r  Y0 v7 f                        RxBitNum = 0;
7 O  b5 R: x- x                }
! X/ Y( @, ^4 D8 J+ @2 Z' _+ e# m        }( q) U; b$ L8 g( r4 e
        else if(RxSampFreq > 3)
$ p- e7 J, \; q" X" z( K$ G        {' z( v! {% S, c$ M
                RxSampFreq = 0;6 P1 x- n. t0 R# @  V3 i
        }/ N0 K2 G$ ^8 i
}8 A" w1 F4 }) `' v! k
! _0 }$ R! f8 ^
贴子超长,接下页。
! f' O! A& F, _6 Y8 t( v; Z# ~$ Z1 G
& ^' W' ^3 O- y$ I4 X2 @; u6 I; T5 g% n- w" E6 d7 i3 A; c
0 O9 Z, @9 W6 ]! I+ j
% {% W/ Z7 d, f* e
' N4 T8 ^% S' d
& V, [/ H7 ?3 h8 @2 X5 h* h
) U0 }9 \, _$ W4 R. k: U: ]
STM8摸拟串口.jpg
收藏 2 评论20 发布时间:2015-1-6 17:04

举报

20个回答
黑溱郎 回答时间:2015-1-6 17:04:54
本帖最后由 黑溱郎 于 2015-1-7 10:55 编辑 # N7 P, p4 X# K# b
2 l, v4 X9 C+ e0 d" C
接上页。
: s" e0 |6 d/ E: E0 `- v
9 s  f( b2 V4 X1 p) o, T1 V2 @7 Z
( a* v; Q2 }5 Y4 t9 v& `( `' T步骤5、发送函数
# M; @7 t+ G' Z5 F4 v: }- U( T% Astatic void Uart_Tx_Byte(void)- S# C" [( E& {. u8 L4 [' D) k
{
2 j" p* ~3 f5 q2 o5 V+ @        static bool SendFinish = 1;        //发送完成标志
' U4 i; q- c8 U8 j1 ^, T5 ^        static u8 TxSampFreq = 0;                //发送计数        采样4次& D: v/ L+ U+ X# K; B- z/ u
        static u8 BitNum = 0;                        //位计数
" r( [% N8 Q8 D- M        static u8 ByteLock;                         //发送字节锁定(防止在发送途中 发送数字被改变)* H* c& @, B8 @4 L  }/ P9 r
        static u8 TxIndex = 0;                        //当前发送索引
. c4 |$ N' I6 x2 Y9 v7 E" K. Q$ x- e' L1 j0 O0 j
        if(SendFinish)
. {+ u! v7 `3 k1 z/ o: g; ^    {
6 [- q6 C- V6 a* F7 b% i       SendFinish = 0;6 ~# |! J. a8 z5 e4 v
       RxSampFreq = 0;
* U! o6 g# ?' x3 y! M0 H       BitNum = 0;
5 F+ b2 r; h) [6 z; ]0 A) Q  l
% U' ?: u1 T6 p% w' Y5 d       if(TxIndex < TxXKCnt)        //控制发送的字节
- }" c4 v0 G% j- h) E) O       {
+ A; Q1 Q$ x, \. g" R$ z8 W9 |5 Y: z          ByteLock = UartTxBuff[TxIndex];7 A0 W8 h  U3 }# g
          TxIndex++;1 U% X7 V4 n8 ?# g# \
          RxByteIndex = 0;
# F; V" n; ]1 r4 F# e3 h$ k0 c5 I$ m; o       }
$ f$ B' V) \' J0 q       else if(TxIndex == TxXKCnt). k' D: y+ W' q
       {* H( X8 E! x; d5 g  p3 Y
          ByteLock = '\n';: T; m$ Z# ?4 ~7 m
          TxIndex++;
8 s, `5 L: x: P+ z6 E; s4 y          RxByteIndex = 0;
  G. O! a; h& E' N4 @8 ]3 D9 P& W2 V       }
" {$ S  M' |5 K9 n8 Q       else
1 }+ j, D% g- {' R; r1 C/ b       {
  t# _; V0 t. W& w+ c& z          flag_rxd_txd = 1;/ f% Y) `) |- C' J9 I! ?4 {
          SendFinish = 0;: j0 J% B" ]$ K
          TxIndex = 0;1 O! b+ I0 `' K+ _3 d
       }4 v& y, `1 y3 }8 |2 C
    }
: i4 U) G) H* [" H3 c2 Y6 j3 c: o9 T( ]+ ?  O
    if(++TxSampFreq > 3)
; i0 ~: Y0 _$ e; U    {4 U) Q7 O, P1 E' m2 V6 K9 L
        if(BitNum == 0)                             //起始位
3 O9 m' `& o, |/ s- u        {
5 N* D" X& E' [9 J) ]9 a            Uart_TXD_Out_LOW();
. P" \" s! I! J6 [) m0 Z            BitNum++;
5 ~3 e5 k" o: ~' T. q( {        }
7 e8 K2 J8 o! V3 U/ J- X) X        else if((BitNum >0) && (BitNum < 9))        //数据位
4 L! A7 k7 w$ d+ U        {
2 S* C+ h0 `6 \( {/ b            if(0x01 & (ByteLock >> (BitNum-1)))     //先发低位! Z# n9 r6 t5 K* W
            {4 e9 S; `$ q/ |1 A# j+ P
                Uart_TXD_Out_HIGH();% [1 B2 G4 K) @2 u; ]; i
            }; ?, @% `/ e2 P* l
            else! b; }* M  B* z+ X9 B. c- Z5 V
            {
1 W% R) }' }$ x& U/ ?                Uart_TXD_Out_LOW();2 O: W6 K5 D2 v0 R
            }
/ h; K% G7 x& y  Z            BitNum++;, h0 y$ [4 r2 {# o" k" s
        }" \5 a2 d5 J  m  X, i
        else if(BitNum == 9)                        //结束码
8 v4 h6 I  W9 w6 {6 W, P# g0 c        {- M1 z/ M0 Y- U' E" x6 c, ~
            Uart_TXD_Out_HIGH();
6 i+ v9 }. O, r# I4 F            SendFinish = 1;
9 g2 h* }9 Q8 Z" c. @            BitNum = 0;
. e8 u5 P7 F8 B# Q, D/ Q        }
+ d2 B# K/ g6 f5 ]: p        TxSampFreq = 0;. P* w$ K1 o8 y% ]6 W- u7 V# T6 H
    }
# u3 z/ I2 n& l1 q) @$ E}% S" q' A- E5 s
holts1 回答时间:2015-1-9 15:33:46
黑溱郎 发表于 2015-1-9 15:22( \8 p) {6 d5 ^" D
能正常运行啊!

. M: S; Z, D0 k( `0 J4 T" G! M当然可以的,我还打了板的
黑溱郎 回答时间:2015-1-9 15:22:31
holts1 发表于 2015-1-9 14:255 F7 K6 S0 k% v0 o2 f2 m2 t$ A7 Z
能正常运行吗?
/ W7 g( W! M" I6 q. h
能正常运行啊!
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 手机版