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

基于STM8的模拟串口

[复制链接]
黑溱郎 发布时间:2015-1-6 17:04
本帖最后由 黑溱郎 于 2015-1-7 10:54 编辑
3 I8 }' G* o8 D# J- ^9 |' P4 E7 ?0 d; R2 X
" X6 n, Y6 T* F. A, ^, W
# u. C& G2 W1 K+ T4 S
下面是STM8的模拟串口实验例子
实验工具:STM8S103FP6最小系统版, ST-linkV2 PL2303转串口模块0 \' Y: K* j. r" R1 \

9 g0 A, ?, H* c6 F! `: C& n
步骤1、算出定时初值, STM8内部晶振为16M 采用8分频后震荡周期 =8/16 =0.5us,所以发送或接受以为数据的采样定时器初值应为48~524 p/ j3 |9 r' a) o1 c5 x
下面为定时器初始化代码:
! f0 A. _, o7 H" u+ G' M
void Tim2_Init(void)7 n- M& B& t6 ]
{/ X) p/ |' S0 Q3 i0 m% t5 X# q6 b7 W
        TIM2_DeInit();& h7 |  Y' r$ p. ?9 z& F3 [; @
       TIM2_TimeBaseInit(TIM2_PRESCALER_8, 48);% w% j6 g: c+ H( Y1 A5 p
       TIM2_ClearFlag(TIM2_FLAG_UPDATE);
$ R8 O0 Z/ c5 S3 c' q% z/ l, k: e
       TIM2_ITConfig(TIM2_IT_UPDATE, ENABLE);
% q4 K9 m! C, ^& W6 Q
        TIM2_Cmd(ENABLE);
. T1 D2 v$ _5 f, x6 h+ ~* S$ U
}& j( v; N$ H1 ^

; D9 a3 [* g% a( M* K
步骤2RXDTXD初始化,RXD为上拉输入,TXD位推挽输出高电平
4 r9 \) h5 P5 [$ n$ m+ [& I3 E
#define Uart_RXD_Init()                     GPIO_Init(GPIOD,GPIO_PIN_6,GPIO_MODE_IN_PU_NO_IT)
+ b; d* }! f/ ~/ a  y' Z
#define Uart_RXD_Status()                 GPIO_ReadInputPin(GPIOD,GPIO_PIN_6)
3 @" H' a' h/ ~- [
# ]4 b  r+ w7 Z- \/ ]1 _! N4 y8 W
#define Uart_TXD_Init()                      GPIO_Init(GPIOD,GPIO_PIN_5,GPIO_MODE_OUT_PP_HIGH_FAST)& S8 ?# M- D$ e
#define Uart_TXD_Out_HIGH()            GPIO_WriteHigh(GPIOD,GPIO_PIN_5)
: g' M3 g: }4 i1 `
#define Uart_TXD_Out_LOW()            GPIO_WriteLow(GPIOD,GPIO_PIN_5)
  J/ u! x* b$ k. s% }- C- d6 f
5 o8 v7 \% B- W9 @; F, L
步骤3、中断调用函数
2 f5 Y% F. M$ G9 ~$ [
void Uart_Interrupt(void)* K1 D# z7 ^% P6 J3 I! w9 f
{/ n& M, l) P! E& E3 u
        uint8_t i;
1 ^- _" R" q6 L1 \  e& V' G" C2 C  z+ `6 k2 i( i% n
        if(1 == flag_rxd_finish)4 C! U3 g& _4 K& ?
        {
2 u  i) O! H4 S( r2 b6 O
               flag_rxd_finish = 0;
4 Y% Z) l$ V! P/ {1 |6 s& N* ~3 t
               flag_rxd_txd = 0;
% J* _4 F* l% k# A+ [2 Q7 L/ C/ y
               for(i = 0;i < TxXKCnt; i++)( Y# i, L! ?4 P' z9 x
               {9 W9 z4 d: r5 L) J$ s9 u
                       UartTxBuff= UartRxBuff;! S- v0 y$ G7 E0 @! \- C9 {. m3 b
}; q" V" ]  s- b; q+ z
        }
0 H$ i4 V  `9 f8 ]" @/ r( _
5 T1 E* E( g" u6 B8 V0 e" Q% ^" ]
        if(1 == flag_rxd_txd)         // 为1,接收# [( P/ z3 Y* ^, w! d7 G: |& D
        {
  _; O8 A' Y* U& e; N. W( `                Uart_Rx_Byte();
- ^( s# D  W' F1 ?+ x- `2 `' T        }  s0 c& T! f: Z' \1 z% F( z4 J/ I2 E* E8 l
        else                                        // 为0,发送
& A9 m# [; V$ \  V+ ~+ W6 o        {& |5 v8 D" g' N+ s3 f1 U, a: D$ S
                Uart_Tx_Byte();2 ]0 W3 _, b; ^4 A. ]- k
        }/ y+ }* N. m$ @/ Z+ d
}1 G5 ~% s3 n# z

6 h) C# c" V9 U' U9 s  L
' f+ D( K  ~9 N" h9 i* z: P步骤4、接收函数
# O4 b! W& ?. g( [static void Uart_Rx_Byte(void)
2 k, q" g8 I& p) [: n  J) P{5 r& V0 I7 v( r; O
        static uint8_t RxBitNum;        //接收位计数0 k: P. s0 I; r6 ?' [! j
        static uint8_t OverTime;         //接收超时计时器
- ~5 S! q: P% L7 w" h; @' H6 Q! y        static uint8_t RxByteBuff;         //一字节数据接收缓存3 `; F1 m% ^9 q

0 s8 W; ?9 w0 ^& V+ d9 Q1 o) P" W        if(1 == Uart_RXD_Status())8 P2 p' e0 r) A; N6 f
        {
- f* i1 R3 I; b: f: o! q4 R$ u- a0 z                OverTime++;8 z/ O! |- L2 M  n2 e0 h$ n% D! `
        }2 z2 z9 W$ r/ F
        else
" l  j! E, |$ ]' l% u        {# Y+ f3 j9 Y  u6 M! p( \2 c
                OverTime = 0;7 S; }6 U% v+ p3 P  a
        }
7 S$ D2 A9 K8 X3 x' j+ e8 Q! b; K8 M! m  x: e
        if(OverTime > 44)
9 w! h1 p# b  ^# l        {
! \) r8 a- i2 Z                OverTime = 0;/ l) ~9 X; D% ]* @
                RxByteIndex = 0;1 K% S1 P: P( B: p
                RxBitNum = 0;
2 j. `; P6 g/ I$ ~8 P        }2 v  f, x+ J7 C" ]3 h+ H  d' Y
8 t1 M% b: B2 @  v
        if((1 == Uart_RXD_Status()) && (0 == RxBitNum))
& Q; s& A" c/ q3 u- h        {
' J' d8 x- S" t                RxSampFreq = 0;
% v* ~' F' e4 K) Y' r% y  t        }
! `0 I) \$ t$ Y; r# n        else
" Q* l- V/ D* k/ ^        {% M9 k; D3 U; J- X! J2 C
                RxSampFreq++;
  a" |' \5 \9 y1 Y' C, P        }/ d+ U: X7 O6 J* Y7 Z

- J# M3 e+ `$ B        if(1 == RxSampFreq)' l) a  M+ C1 g. T+ M6 m# P
        {
8 I) c1 Y8 N$ w- B5 t- p: D9 F                if(0 == RxBitNum)" f. g1 F( q4 r0 x4 m4 `' K0 ~4 l
                {
$ F* N; G+ @* e5 G                        if(0 == Uart_RXD_Status())9 t. Y  S1 k4 z9 G2 `
                        {4 L5 _! J' l4 g6 b
                                RxByteBuff = 0;9 j/ Z) L# `, e, L" R: e7 H
                                RxBitNum++;
( ]: ]0 r0 ?! r$ e% m                        }) K; v3 v" k& {( n9 W9 u
                }
9 _5 T6 {9 B& U- ?2 d                else if((RxBitNum > 0) && (RxBitNum < 9))
' y( X7 _! J$ {8 n0 d                {
& r  d) K9 ?& t' z" H$ m                        if(1 == Uart_RXD_Status())3 o0 x0 F; _$ a$ G: J, Y/ J0 k
                        {
/ m7 ~9 A9 W6 p: E                                RxByteBuff = RxByteBuff | (1 << (RxBitNum - 1));
$ ]5 P3 z, `: l3 P+ J8 \% L& ?8 N                        }: C1 c9 Q" a3 |
                        RxBitNum++;4 K5 l0 \, b- T: i
                }5 x7 b  s, ]; y
                else if(9 == RxBitNum)9 @8 b& e4 E6 O& a' |" B
                {1 J9 k" y; w& t. P" R8 j0 w
                        if(1 == Uart_RXD_Status())6 C4 A/ G) v" |+ x( n
                        {( q& u8 R7 s3 P9 g4 K# \5 K# j8 b2 H0 x2 O
                                RxBitNum = 0;- W- a2 s3 o/ ^! L$ d
                                if(0x0d != RxByteBuff && 0x0a != RxByteBuff)" f& A5 f, h: \1 I2 ~0 s
                                {, H4 k. a2 M+ W& H( i
                                        UartRxBuff[RxByteIndex] = RxByteBuff;/ G8 x1 Y& S$ S' N2 z
                                        RxByteIndex++;
# w* F2 P& F  I7 K3 j7 ^                                        if(RxByteIndex > 63)
% a% h# V1 b0 Q- c0 u8 c  q: m                                        {! _, I7 t) h0 S! g% I  E% [
                                                RxByteIndex = 0;4 U9 b4 \" y+ T" l
                                        }
! p1 u5 V; o) a9 u4 ~0 z                                }/ z4 D5 J+ k& g# T8 B
                                else
' X- ?" h, a: L6 ^                                {
: ^  M5 e% W8 H) Z, W6 x                                        TxXKCnt = RxByteIndex;- p$ Y9 A% [  l* [) `' h
                                        RxByteIndex = 0;' ^: R4 c9 I2 O* ?7 y9 N8 E
                                        flag_rxd_finish = 1;
! }/ L1 b! V+ l9 c$ ?7 Y% ?9 e                                }: F* z8 F3 B3 n; Z/ |' u
                        }
; r' [+ z6 W: M! C' R# Q                }% F( f9 n5 z4 ~( [
                else/ d+ j$ _. ?$ `" {
                {
! I" D+ a9 w% x5 e" Z8 _                        RxBitNum = 0;' }" O5 e9 }1 H* d
                }* T% l3 E9 _, m! Y4 p3 v
        }
3 A6 H8 J( i- W! s/ V  M: m        else if(RxSampFreq > 3)
" ^7 o# d+ _8 d. t5 l; D        {  t( ^+ t7 i: b; s
                RxSampFreq = 0;/ W" N5 j" n1 |" b& g9 O
        }
4 O6 {6 m, F+ v$ M& I" K}2 n/ \4 H/ Z6 S/ a! a) r% }% C
2 t0 K" p3 S* \7 r* R
贴子超长,接下页。
- {6 d2 F/ ]  b! y  _3 L+ |5 i$ e7 \, k8 h, j
% D# p8 f9 w5 f. S' n. y  m: q

5 k, K0 l# b: r- x
. g/ _7 L1 ^- @, s2 u+ @9 M: ]' K% j

# A8 L$ d8 A1 S4 v8 @3 N, c; w; \5 g% \
STM8摸拟串口.jpg
收藏 2 评论20 发布时间:2015-1-6 17:04

举报

20个回答
黑溱郎 回答时间:2015-1-6 17:04:54
本帖最后由 黑溱郎 于 2015-1-7 10:55 编辑 - l, r: F/ x5 T, B' J, m
7 U! K& l' p2 e' p6 h0 @+ ~. @" u+ H
接上页。
; i0 I. u/ }4 {- K' ?8 A# p
. b9 N2 p+ O) J! r7 k8 r' W$ X, e4 d( m1 q- _7 p8 w+ J
步骤5、发送函数
5 t4 {% f  H+ \static void Uart_Tx_Byte(void)% p5 n, Q- K. N( S  Q' }
{2 x0 v7 d* g( {3 W
        static bool SendFinish = 1;        //发送完成标志; X9 ]6 e6 |& d# w9 m
        static u8 TxSampFreq = 0;                //发送计数        采样4次( o4 C) G  [* j* u! V
        static u8 BitNum = 0;                        //位计数
1 e8 V' H8 e1 i/ X5 ^        static u8 ByteLock;                         //发送字节锁定(防止在发送途中 发送数字被改变)
, @1 x! A2 v5 f$ X# f5 Z$ _        static u8 TxIndex = 0;                        //当前发送索引, b: L6 I* h# i! H6 l  [

; f  R- s) o: l        if(SendFinish), W& a! `+ d- j9 M2 _/ J( U
    {4 R9 H% a7 g2 G: N2 G+ W
       SendFinish = 0;2 U8 O: i4 h" `5 `  ?1 R
       RxSampFreq = 0;
/ ?$ K0 b% \" f6 N/ J8 D0 r; a       BitNum = 0;' U; |4 \5 f- ~/ g  Y
2 F3 ]: D& G, B2 Z. \: y, b2 j
       if(TxIndex < TxXKCnt)        //控制发送的字节4 ^& X( N1 Y0 j
       {8 s# U- \- N+ b0 a: I! V
          ByteLock = UartTxBuff[TxIndex];( J& F2 L  l/ E: S- E2 C
          TxIndex++;- n0 j$ j2 Q$ K) a
          RxByteIndex = 0;2 v, e1 k$ ]' _. {" w
       }
/ r! i# G% d! z& j9 y7 D       else if(TxIndex == TxXKCnt)$ j1 |, K0 E. K, D, w" L
       {
7 G7 R/ n/ {- k0 Y2 q) L) d9 E          ByteLock = '\n';; A" |2 c% S7 K- ~
          TxIndex++;, `; q( e# E. s  p1 i; @
          RxByteIndex = 0;
+ e2 e5 K+ F, O& |1 T       }6 f+ U; C- l  l( J( {8 i. ~
       else
' s/ l  v* c- d) e$ Q$ r' N4 l% ~       {
7 B5 l8 S/ ]7 y$ e* r          flag_rxd_txd = 1;- U9 Z( A! e- N/ t. m+ \3 n
          SendFinish = 0;
. K9 c0 m  m) L$ |          TxIndex = 0;
" H1 }9 p' a( f0 T0 K! F# t       }& [4 \, w1 ~5 r1 u1 `1 [" o
    }9 a% ]8 |. ?, `& g2 ~

8 Y3 j2 n  b& L. M* X    if(++TxSampFreq > 3)
) z7 Q. T8 Y2 q, u    {2 i9 U" g9 N3 I) S) F6 j
        if(BitNum == 0)                             //起始位
# }' t; i6 L- v# |        {
% _3 i7 P# O" }) @8 y9 D" X            Uart_TXD_Out_LOW();" O! L; x& ]! a: z  W- L
            BitNum++;; }. l* q3 j" s% B
        }
; V: |8 f1 O8 @) w& u) C: d6 g        else if((BitNum >0) && (BitNum < 9))        //数据位
3 U6 y* L4 w3 C6 ~        {. G/ m0 f3 h; [0 k/ p4 p
            if(0x01 & (ByteLock >> (BitNum-1)))     //先发低位
. ?$ R0 E8 Z: J! ?! i: l; J            {
3 X1 [# E3 V6 M8 H( C                Uart_TXD_Out_HIGH();
% k, C" ~3 v/ c$ P2 n            }# u7 ]  P9 {9 L) |
            else& S5 o) m- F/ P8 @
            {; E6 p& E) Y4 z2 g% ]$ `2 _
                Uart_TXD_Out_LOW();
4 M: t( T$ f: n5 Q            }
6 o6 D$ n$ @; \& S& Z8 u+ T            BitNum++;8 g$ m5 b+ d) |$ P. p6 N+ A
        }
- R& ]& f$ ~0 E$ Z  T5 d        else if(BitNum == 9)                        //结束码
) j. a/ t$ a( I1 N7 p4 O        {: m- N' d4 z  U9 O0 q& k
            Uart_TXD_Out_HIGH();  f" Z6 O/ A/ x* i* u5 R! O# j) h
            SendFinish = 1;
2 z/ @' }8 }" p) _  K; S2 u            BitNum = 0;' ?3 x% g8 `3 h" K! t
        }
: }( V: O) K" y" Z$ w; G        TxSampFreq = 0;
: U7 e6 H' ^1 O4 h5 \' ?) ^    }
% Q' @0 ^( }' l; u$ {% f9 v}8 W+ X  {5 I! |' |; L
holts1 回答时间:2015-1-9 15:33:46
黑溱郎 发表于 2015-1-9 15:22
; W& B8 L, A8 P3 U9 Q3 G能正常运行啊!
% L! l, l/ Z% Q! n" [' K  a. Z
当然可以的,我还打了板的
黑溱郎 回答时间:2015-1-9 15:22:31
holts1 发表于 2015-1-9 14:25
4 n3 c" d% A+ q: w& Z能正常运行吗?

0 y7 i$ l7 G, ?( o能正常运行啊!
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 手机版