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

基于STM8的模拟串口

[复制链接]
黑溱郎 发布时间:2015-1-6 17:04
本帖最后由 黑溱郎 于 2015-1-7 10:54 编辑
: v. _; K' p" q8 ?* Y: V8 e& V7 I6 Z. @" O) s& ]2 E4 Z' ^5 R# V6 H
3 W) {' c9 y4 x7 \6 x

* a. a* \: y, }
下面是STM8的模拟串口实验例子
实验工具:STM8S103FP6最小系统版, ST-linkV2 PL2303转串口模块
- q% ]7 k. t5 f( S! J
, g% R: i5 y2 x# F0 X+ }
步骤1、算出定时初值, STM8内部晶振为16M 采用8分频后震荡周期 =8/16 =0.5us,所以发送或接受以为数据的采样定时器初值应为48~52. T# k  E! [1 M' ~
下面为定时器初始化代码:4 `' @) _! O# t& ^+ W- {* I& E
void Tim2_Init(void)" h. `! r0 J1 F7 l: B8 f+ K5 M7 J
{5 x% e* p: R7 m. A3 r# a
        TIM2_DeInit();$ m# J" U: l# W) X# c
       TIM2_TimeBaseInit(TIM2_PRESCALER_8, 48);
# r/ }' f# U- N2 y, L% D2 Y+ \
       TIM2_ClearFlag(TIM2_FLAG_UPDATE);
+ O5 \9 v" S" ~2 Y0 M
       TIM2_ITConfig(TIM2_IT_UPDATE, ENABLE);
- Y! e; A6 m1 t
        TIM2_Cmd(ENABLE);  ~9 u4 I' u; ?  q, v
}
- b! ]: g8 n* u0 q: q9 C4 O, ]2 X; n! w, |) c5 C
步骤2RXDTXD初始化,RXD为上拉输入,TXD位推挽输出高电平
# @3 L4 m( B- i6 |" ~% J  G3 f$ }$ W
#define Uart_RXD_Init()                     GPIO_Init(GPIOD,GPIO_PIN_6,GPIO_MODE_IN_PU_NO_IT)9 e! [- ]) h) _  A  ~
#define Uart_RXD_Status()                 GPIO_ReadInputPin(GPIOD,GPIO_PIN_6)* b7 {. Q. c+ ^$ E4 q7 k  h- E) g

& ]% o7 e% y8 h3 N
#define Uart_TXD_Init()                      GPIO_Init(GPIOD,GPIO_PIN_5,GPIO_MODE_OUT_PP_HIGH_FAST)
6 p/ t6 N% }" b& G/ o* n6 q
#define Uart_TXD_Out_HIGH()            GPIO_WriteHigh(GPIOD,GPIO_PIN_5)3 w  L  H9 B" e$ r4 D
#define Uart_TXD_Out_LOW()            GPIO_WriteLow(GPIOD,GPIO_PIN_5). L) C# o9 ^# |* d0 \. t) z) ~
1 D8 A+ X) o) G8 j
步骤3、中断调用函数
0 t) ], a4 \- [
void Uart_Interrupt(void)
/ _# C0 b3 ?$ J) ]% R7 E
{8 ^5 ~: N* o. g# j3 B0 P
        uint8_t i;
' ]- A1 n3 g$ F: I. u1 i- _+ H! G
6 s. C5 L6 r# U- j: t; z
        if(1 == flag_rxd_finish)
/ _9 k. A& ~3 j4 n  B; U) n
        {+ j3 `# |# V- W
               flag_rxd_finish = 0;
3 Z5 c1 f, h  {* E) g
               flag_rxd_txd = 0;8 l% V5 c+ e8 n  a4 u0 |. f
               for(i = 0;i < TxXKCnt; i++)+ h, @9 C- v$ v0 _& c3 P
               {
; b" p# A/ S% w4 o" h
                       UartTxBuff= UartRxBuff;  l. v& |# g; m
}
& X  w; I; K7 p& W, q, {) P3 e        }
, ^. F* W. P5 @  g

3 D# Q2 O/ q  Q+ O1 u0 e( ^
        if(1 == flag_rxd_txd)         // 为1,接收
* O) l4 {8 I6 `5 a5 ]0 h        {
$ ^$ H- W( V$ D* d1 u0 v                Uart_Rx_Byte();
3 w" ?( p% v, d! _" d* J* R3 w        }# p: e8 U: Y$ F) `4 e
        else                                        // 为0,发送
3 H5 `5 X! _( ~        {
+ u2 L3 q0 j7 I' e                Uart_Tx_Byte();
2 o( v9 |6 {0 d5 B6 p: J9 |1 a9 Q) V        }
# N  v% ?4 l% R. \% L5 [7 S}
4 [5 c* H7 v1 }! h$ \# F
5 Z. V$ t. o- @/ |8 X' O0 z  }
: Z, X! K, r6 Y0 c% B( _/ `. I步骤4、接收函数
- C( ^* [9 T, S0 [9 T4 J- b2 Kstatic void Uart_Rx_Byte(void)1 b- [* W1 k3 ^; R
{: X/ u* E% a! S8 [) y
        static uint8_t RxBitNum;        //接收位计数" B# e$ g* E  k. l( h/ \: m
        static uint8_t OverTime;         //接收超时计时器
& v2 _: B! D. d" `& f        static uint8_t RxByteBuff;         //一字节数据接收缓存
. n) h* {/ E' u8 P2 j
2 u) o4 c2 V  f4 ]3 F, F        if(1 == Uart_RXD_Status())3 ?$ V6 y# H: M
        {
- n5 }  E5 ?" |                OverTime++;
2 `9 H: h* J! ~! Y6 t9 K* g        }
/ h) h" I. W+ J% c( b        else3 y$ m9 @) x7 W/ f" [* M
        {8 A, A4 [& Z! E6 N
                OverTime = 0;
. t+ ^+ }7 a' L8 q) C+ S' ]        }
; c0 o# O& ?( E3 U6 W; p6 Q' z$ w5 m' |6 d: V/ `+ y# _' E$ M
        if(OverTime > 44)4 [6 r8 b: n* g! a# e
        {
. b, M& @- Z# D' P                OverTime = 0;2 S% ~) U9 ^0 \4 `: ^
                RxByteIndex = 0;
% e! V# a7 l7 B- @2 A/ k                RxBitNum = 0;# ^" e8 u  M) h, F- C7 L2 H* k
        }
; W" q) H' t3 [9 w$ f
4 g  k. l. v0 E# ~, }        if((1 == Uart_RXD_Status()) && (0 == RxBitNum))) g( T1 o! k$ y: e
        {
. `9 a* T' W- v# S1 X. k; l/ @                RxSampFreq = 0;
; S: C8 K  J. A, g6 Y2 J3 S: R/ j2 |        }! l, L! w! x  e) r
        else% n5 I& i: h" l/ g* u
        {
, f3 _2 o6 G! Z9 ?" A6 w  R                RxSampFreq++;  @' R4 F) W2 q; M
        }
( x. `+ F2 E+ C0 a4 x3 r8 p( V
7 n7 x% @1 q5 t6 y& u& G9 X5 ^        if(1 == RxSampFreq)( {, Z* v* D0 \, m% m! f! H
        {7 A7 z, \* W9 l6 K# @- t
                if(0 == RxBitNum)
6 s0 ]$ e# l+ U. P8 H1 ^& g                {
1 ~; R5 e% S+ ~4 ?; h                        if(0 == Uart_RXD_Status())
+ g1 N1 n, ]% d0 L6 l4 w' s4 o                        {6 W7 P, p: N4 ~2 d2 Z
                                RxByteBuff = 0;
# N& z8 K* D3 m7 v3 a- B                                RxBitNum++;
) g& i, C' Q0 m4 [$ c( Y                        }
2 {: ]- T8 n8 P                }1 H# D5 ]; |8 K
                else if((RxBitNum > 0) && (RxBitNum < 9))
* U( U) _6 S0 d5 r; ?3 \                {
( N$ |: p. ?8 |: F7 B3 v                        if(1 == Uart_RXD_Status())
  C. ?1 e' p! B% y                        {- |/ Q- E& j- P4 T+ i- W1 }
                                RxByteBuff = RxByteBuff | (1 << (RxBitNum - 1));  X! K$ K: g0 \4 W4 ^
                        }
9 O; T) |7 u) e9 c                        RxBitNum++;" X8 Y, b" x9 j9 A6 }3 M( V# B( t5 m
                }3 v1 K+ h/ |1 Q" @6 S/ Q9 h
                else if(9 == RxBitNum); y. D$ {4 B( G
                {
+ {7 d  ]+ _/ B2 _                        if(1 == Uart_RXD_Status())6 C( V2 k9 Z! L7 {7 P. V
                        {$ A8 F  o+ |$ W" C7 h/ V
                                RxBitNum = 0;" I0 W- l8 D8 m& \" g
                                if(0x0d != RxByteBuff && 0x0a != RxByteBuff)
6 F- S8 n( m- q6 |7 K                                {# t4 G; S+ ?3 @+ f. X' K( U& ^
                                        UartRxBuff[RxByteIndex] = RxByteBuff;9 S6 E7 ^2 Q! y0 t# S* k( c
                                        RxByteIndex++;, z8 e$ ?4 g! ^4 {& e% P
                                        if(RxByteIndex > 63)) N, h1 T% i8 U* R2 h
                                        {
. ]5 H& |9 F1 {+ m9 o1 E                                                RxByteIndex = 0;4 W. g) Y; l2 `5 s0 ?* S
                                        }# |& m9 I. |$ W
                                }2 ?% R1 @9 d# O9 e  w! t
                                else
2 x% N$ n6 J% o2 v% E0 B7 u                                {: ^* W6 @& l3 G5 K1 W
                                        TxXKCnt = RxByteIndex;
0 x. {1 C, ?1 ~/ g& Q! {! \$ U                                        RxByteIndex = 0;
7 F+ N) m8 ?6 W8 p- |0 K                                        flag_rxd_finish = 1;
. n  m, j! ^1 O                                }7 e7 Q) F& }" h
                        }% S) d3 A, w: S& c1 j
                }0 D( m5 W& M7 {! k: u8 h7 b
                else
6 r, m- X0 U2 ^# B/ h                {
  G- x( |; @* I1 D* ^- l                        RxBitNum = 0;& e+ Y( H6 G: m) l# y
                }
. V, v( e4 @, l$ M        }
. j: y5 l8 [. c        else if(RxSampFreq > 3), x3 a4 G$ B5 ?
        {
' T* {+ k/ v; m, T                RxSampFreq = 0;9 b1 `: v7 R% q: L, h2 H
        }
$ w0 F9 }9 T) y% k8 a5 {  T}" F% U  k2 b" ]% h! b" y& \" u/ n
2 l, z% L% I  K" |
贴子超长,接下页。) Z* E7 W9 u' L) }1 D- L2 `4 y

8 U$ k; q) Y8 D* h$ N  `& |7 w/ `* e* N) \- {+ `# q" U2 Q
& d* p8 }- b2 D; g# M1 R- e8 P
! w7 i9 c( n; c9 m- ]6 g
- o& b# v- m, _

& e% _" Q& I1 l4 _, a! e$ Z3 o+ |& p1 I7 A8 D* m+ {/ M
STM8摸拟串口.jpg
收藏 2 评论20 发布时间:2015-1-6 17:04

举报

20个回答
黑溱郎 回答时间:2015-1-6 17:04:54
本帖最后由 黑溱郎 于 2015-1-7 10:55 编辑
, c( D" S! D) q% C" K1 K# l! {
2 A' i( t1 e! R2 u! p接上页。
0 g# z: t/ D' H
/ g, f/ f0 ^. e! W% J/ W0 r7 |4 w' f4 u* r6 @( e
步骤5、发送函数  A, G; j* c4 W& J4 A
static void Uart_Tx_Byte(void): z0 y) i$ M0 B0 J3 t5 u1 p' m
{
7 J" F1 S0 P) }        static bool SendFinish = 1;        //发送完成标志! J, i. l- x' O" c* Y
        static u8 TxSampFreq = 0;                //发送计数        采样4次
/ G6 I) B9 L2 e; m" N! p, F        static u8 BitNum = 0;                        //位计数9 e3 q) q- A6 n$ s
        static u8 ByteLock;                         //发送字节锁定(防止在发送途中 发送数字被改变)# S/ I5 x' K! o- |* @
        static u8 TxIndex = 0;                        //当前发送索引2 l# P( l4 ?! q1 Y( @
" ?, e, C/ e- @/ A
        if(SendFinish)
2 {7 A' Z* j  _& w& y# }    {7 w$ C" D7 x6 V/ b5 S
       SendFinish = 0;
! O! e; _- @4 N9 Y       RxSampFreq = 0;1 y0 B  i1 N/ g1 ?" {6 W4 A8 `
       BitNum = 0;  G0 M6 U; y( R% W0 N5 X) N

/ d: l# N; H' r0 u' \, n) B       if(TxIndex < TxXKCnt)        //控制发送的字节
. f8 r' ]5 t# n& t+ \       {
# A8 Y: j7 m0 }          ByteLock = UartTxBuff[TxIndex];
9 K( H( m/ h5 L/ H" d" C          TxIndex++;
/ q& e4 i0 F& `$ v& e3 ^% m          RxByteIndex = 0;
$ Q# F: u$ T, g% F) g" b; ?' h       }) s6 ~. |$ v7 e, ]% l# Y2 j0 I
       else if(TxIndex == TxXKCnt)% [0 j5 Q# t3 ?$ [
       {
3 k) q6 r6 T5 x7 e: E          ByteLock = '\n';
, T1 B( W% O# X5 A! f+ b          TxIndex++;
2 ^5 p9 J, _9 {+ V  Y$ ?' d7 n1 L5 E          RxByteIndex = 0;
! L+ {- c4 l  }  Q       }) _5 Y2 _! w* i, A
       else
7 n. J& g1 p+ R. O9 v( V# g       {
# @$ ?: k: d$ L$ T: p" K: N7 p! @          flag_rxd_txd = 1;# w+ y' s! J7 Z1 M/ {* n  \
          SendFinish = 0;
# ]/ X! }4 g4 b) K2 Z          TxIndex = 0;
8 E- n% ]- @1 Y$ S0 p       }- m: x  P$ I: z# }! ?
    }
( X1 S' F  b) }5 U' w& U4 K
5 F, d6 I/ {, A- l$ I    if(++TxSampFreq > 3)
* w$ g6 u; h9 V7 I$ @7 w: ]    {  x! I+ @% s" m: D/ L: |( y8 V
        if(BitNum == 0)                             //起始位
; y* k8 p. H0 n% y& L        {
' s# b7 P9 \- k6 @' _7 ?0 L            Uart_TXD_Out_LOW();
4 H, x* Z7 ~9 M1 t* J# n6 A. N            BitNum++;
" Z3 u% R9 q0 s9 s& c+ u! g" }        }7 J" R+ |5 p& K3 v+ w
        else if((BitNum >0) && (BitNum < 9))        //数据位
- Z' K. A% J4 G# D        {! U4 r- u8 i6 A3 a& [
            if(0x01 & (ByteLock >> (BitNum-1)))     //先发低位
# W& Z+ o3 ~# ]* a3 T( f" j* L            {
4 l, ?/ w$ X) P2 x9 H  F                Uart_TXD_Out_HIGH();
8 Y0 ?3 m! F& C3 N1 k            }
$ s; q, n% G' w# R            else1 }9 @* Q" D! {7 T! M
            {- d6 H. V+ n7 L3 G/ }1 e
                Uart_TXD_Out_LOW();
0 x( @! P, m- _            }1 A# z8 c: j  K: H# d' {
            BitNum++;- b: T1 K6 H# w" i
        }
, a3 m. u3 Q+ z5 r  E8 \9 W        else if(BitNum == 9)                        //结束码5 c! Y$ [# H& }  H
        {
/ Y6 [$ g( ?2 h) d7 C; T4 Y            Uart_TXD_Out_HIGH();9 Y8 H8 _7 i) |2 u  Y# n& _
            SendFinish = 1;( B$ E1 O! I: [9 G* g
            BitNum = 0;$ q- D- f' L- M+ s% X5 ?6 U0 `
        }
  E0 }" R0 H3 o' q9 S        TxSampFreq = 0;  L2 t8 D, m( O( V4 k3 u
    }
" n" g: Z3 n6 U; i}/ {% e  ^6 ]! v5 `6 V" |* D
holts1 回答时间:2015-1-9 15:33:46
黑溱郎 发表于 2015-1-9 15:22$ A' p, e7 }4 ~/ T. ]
能正常运行啊!

. C. |4 B2 C' z5 x当然可以的,我还打了板的
黑溱郎 回答时间:2015-1-9 15:22:31
holts1 发表于 2015-1-9 14:25
9 ]& `  Z7 h8 x  m" B能正常运行吗?
, v, j0 I6 E$ S; N! D3 f+ B
能正常运行啊!
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管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版