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

基于STM8的模拟串口

[复制链接]
黑溱郎 发布时间:2015-1-6 17:04
本帖最后由 黑溱郎 于 2015-1-7 10:54 编辑
7 g1 M- M0 T& j# b. A
5 \9 U/ t' C' C: b" V- ?8 W) o* X! d1 N/ }" x
  Z' W7 |# M  J" t' d4 Y6 Q
下面是STM8的模拟串口实验例子
实验工具:STM8S103FP6最小系统版, ST-linkV2 PL2303转串口模块0 a2 T# u1 ]4 N9 @% }  s

4 Y3 ~0 o7 W% ~) _
步骤1、算出定时初值, STM8内部晶振为16M 采用8分频后震荡周期 =8/16 =0.5us,所以发送或接受以为数据的采样定时器初值应为48~521 Z) p1 H3 f, ]" p8 b+ P8 F
下面为定时器初始化代码:
& |) Z( N- `7 ]4 i, X
void Tim2_Init(void)( T0 B3 E$ R7 W; x9 \6 x: `
{
& T# V  @2 g- K$ x6 z+ ^6 ~
        TIM2_DeInit();
7 {7 x6 u+ d. A
       TIM2_TimeBaseInit(TIM2_PRESCALER_8, 48);8 S6 P& X& u1 A; s
       TIM2_ClearFlag(TIM2_FLAG_UPDATE);
8 s& Y4 l1 w$ C
       TIM2_ITConfig(TIM2_IT_UPDATE, ENABLE);
! f* @. ~! R" j; I
        TIM2_Cmd(ENABLE);5 {$ A7 p$ g' s& @  L. I
}+ a, ~3 p  `( g* [4 T8 @

8 _4 g# Z. p/ R9 X0 V
步骤2RXDTXD初始化,RXD为上拉输入,TXD位推挽输出高电平* G0 D2 ^! E# v2 l% I
#define Uart_RXD_Init()                     GPIO_Init(GPIOD,GPIO_PIN_6,GPIO_MODE_IN_PU_NO_IT)- X( G( q% N, p* M& X0 s
#define Uart_RXD_Status()                 GPIO_ReadInputPin(GPIOD,GPIO_PIN_6)* f7 i) C! t6 b( T4 u5 |
9 s# `* M6 S0 f/ t* `
#define Uart_TXD_Init()                      GPIO_Init(GPIOD,GPIO_PIN_5,GPIO_MODE_OUT_PP_HIGH_FAST)0 f: J/ V4 B# L2 M
#define Uart_TXD_Out_HIGH()            GPIO_WriteHigh(GPIOD,GPIO_PIN_5)
# {5 B" z0 N5 C5 |: y. ?# B$ v, l4 P+ l
#define Uart_TXD_Out_LOW()            GPIO_WriteLow(GPIOD,GPIO_PIN_5)2 Z+ [: G* Y* z& l: ^' A* i) u
) G7 ^& C8 v$ D
步骤3、中断调用函数
4 ?; P! B3 ~' i; B5 H
void Uart_Interrupt(void)
. ]; O. q) v5 o3 G8 [8 |
{
4 m' E( t# n% U7 J+ c6 L
        uint8_t i;
- g* ]* U: E1 M, O+ f. v. F
3 h" Z, x3 \/ {# B
        if(1 == flag_rxd_finish)) v" e4 u/ D2 ~7 r
        {
& u: ?. E/ U$ O3 m, t
               flag_rxd_finish = 0;' h# j& ~4 k& Y
               flag_rxd_txd = 0;- x( l, U; G$ l/ G: K: b4 p
               for(i = 0;i < TxXKCnt; i++)
% Y/ g  M6 [8 O' e
               {6 U( I: t+ x9 t2 F2 q
                       UartTxBuff= UartRxBuff;# e" {1 L+ e. ?
}3 ^2 Z- q: b; J& e3 o
        }
) ^" N, E$ W4 y- O0 k' w! x  T
% E1 i  U1 ~# M
        if(1 == flag_rxd_txd)         // 为1,接收" ]2 r  Y, D, y+ b
        {
) r0 E4 a9 ^2 S5 X! B                Uart_Rx_Byte();' ^6 p  ], L  [2 `
        }
! g& h8 r, z0 U/ p' r        else                                        // 为0,发送8 G: ^& ]  V- T' K. M
        {
) Y2 ]$ {# O1 A& X% o0 o7 B# p                Uart_Tx_Byte();4 ?+ A' Y( S# r, ~4 X# ^7 Y5 ?- M
        }; C& Q: P! Y4 I) r1 R. |6 U) r
}$ W2 P5 X( r* v* |$ d: Z
. A. `1 u; l  G) J, v8 t5 I0 n4 o

7 n) S* w$ ]9 n步骤4、接收函数
4 ?8 e" j: _3 B; h0 `6 ?static void Uart_Rx_Byte(void)
- W4 V0 c( Q' W' L2 @; `{9 R/ Y( m1 s' K  X0 V' S5 v
        static uint8_t RxBitNum;        //接收位计数7 d4 c% f4 s7 \5 S' y9 w
        static uint8_t OverTime;         //接收超时计时器0 d* n( v$ s- c% o5 y
        static uint8_t RxByteBuff;         //一字节数据接收缓存9 q5 \: A0 n9 q& |

  T0 f( |: j2 H4 P        if(1 == Uart_RXD_Status())
4 X' J) }( i) n+ F% l" h& H        {
! ~4 r( n" A+ P* |) ?                OverTime++;
/ ?& Z/ R9 O  e- j        }
# b: n5 G: Z/ s) e2 D! a        else
; t; a$ X- S" \        {
* W- o% t$ a0 I+ V( u0 S3 g                OverTime = 0;
! F: J5 H- f! f0 Q" h        }
: \" B5 X& H5 f& l4 r% G- E" B5 I' d& ?% u
        if(OverTime > 44)
$ N- ^5 `+ n& h: ^* H% v- d, M# q        {" J2 K6 P  X6 Y! s3 h& X) E6 q* e
                OverTime = 0;
4 N% K3 M$ {+ A1 S                RxByteIndex = 0;% j3 U  w' I/ s: [" t
                RxBitNum = 0;
/ ^- F. @7 n( G3 F4 U7 Y: g        }" p% g: Z) T& b; Z
* L6 d" S+ I5 |, I0 g
        if((1 == Uart_RXD_Status()) && (0 == RxBitNum))5 C. g6 _6 S+ X& q# ?0 g
        {
) r; a/ d8 c3 _' l                RxSampFreq = 0;- m- N; z- I) W+ {
        }
% _5 [) X5 [3 q" q        else
2 r- |' m* d) b# `4 B7 f( d        {  g7 n# `: l: G. v
                RxSampFreq++;
" b9 C% \, }$ n# j. {9 W: {! L        }
* ]6 m8 t& }* j$ [+ H' w
* Z* ?6 q8 {0 Z; f) p        if(1 == RxSampFreq)! v* `* b5 X( ^5 v  r2 G: }, Y
        {0 U! m% Z+ L6 N8 \) h! K( ]! f$ `! _
                if(0 == RxBitNum)
! S! E9 Z6 Q3 P                {
1 U) Y9 ~# T6 g5 h  g$ I% ]# a4 Q                        if(0 == Uart_RXD_Status())
& W6 X5 f3 I, I8 f! \1 y. i                        {
8 \( w# l7 M1 l- j                                RxByteBuff = 0;
0 v9 y! @7 A# u# V5 N7 s                                RxBitNum++;7 J8 \! I0 x1 S* P5 s/ ?$ u! t
                        }
) ?; ?- b' g6 U3 T                }$ e- r6 H( [) _' y' a
                else if((RxBitNum > 0) && (RxBitNum < 9)), R& y1 c. l8 Y3 i: B$ ^6 E3 W
                {
$ ^1 q( N" {3 E; W9 R                        if(1 == Uart_RXD_Status())
3 W+ \8 V  ?# `! A1 |9 l- c                        {6 h8 L/ _. [% }( H7 S* s
                                RxByteBuff = RxByteBuff | (1 << (RxBitNum - 1));7 i+ o1 w* F) W
                        }
. ?' T0 g1 l- h3 Z. q  d                        RxBitNum++;) _  [8 F# z0 y* E/ P
                }& O8 i% b8 I7 B; ^, ?6 N
                else if(9 == RxBitNum)2 M& i7 Q  f1 n& U9 e
                {
# i& d' \- W  e8 \0 I2 p                        if(1 == Uart_RXD_Status())# {. Z+ c7 e6 ]/ W% B
                        {, l  t+ W7 H, }% I" b# u
                                RxBitNum = 0;
; w. t6 [: \7 u0 o                                if(0x0d != RxByteBuff && 0x0a != RxByteBuff). X. G) J1 `0 `- L" S- T- |
                                {
! e8 e- n4 s+ \. v1 P3 K# l                                        UartRxBuff[RxByteIndex] = RxByteBuff;
( j2 p" V# e. A, ~; h. z, X3 @                                        RxByteIndex++;- H7 C7 i% f2 N+ t$ ^
                                        if(RxByteIndex > 63)- z2 w3 @% _$ M
                                        {0 ^! l8 A/ \4 k8 i" |) H; e
                                                RxByteIndex = 0;1 S) S7 Y; [* |/ s4 O
                                        }% R) W' W$ s0 K) f, D+ s2 W& G
                                }
9 s$ `) X; I# l) T" {2 P! n                                else
$ q7 T0 L: s8 `                                {( b' A5 c3 g7 B! ?
                                        TxXKCnt = RxByteIndex;
) i0 ]* ]4 O9 @4 k                                        RxByteIndex = 0;
- H4 z6 Y1 `# e* }7 J( ^' \: C                                        flag_rxd_finish = 1;
' e2 T3 r0 B7 P( Q8 z/ n                                }
2 Z% I/ x; I/ v                        }
# K7 E  t+ V5 n; ]                }1 t2 r+ U) q" D! g  b2 @  P
                else+ s" X  l: R0 h5 f( Y4 V
                {
3 I/ b3 P0 A! m/ K. n0 o) o" _8 m                        RxBitNum = 0;
$ B9 T' O1 W) y" V$ @                }& b: M/ X( o+ q1 A4 ^% ^) t% M
        }
* x0 ^% |  `" g; F5 p( h& l. L9 w        else if(RxSampFreq > 3)
* t5 E+ w/ K. v" `% _+ q        {
4 `2 a: B, C5 O  T! b                RxSampFreq = 0;
* Y( c# U8 s8 ^$ s        }7 l1 }0 F5 Y+ q8 j6 I' U2 r8 S" A: `& o
}' j. G0 ~' ~4 ^. b% R
1 b" f& ]/ |1 N  h
贴子超长,接下页。
. W) P; k3 q" ^1 k  I; i5 {# b9 U, r3 v2 N+ Y
. N" j/ h+ o) |) X8 G1 O

, n% v8 M  q  T  K1 b' z4 |5 @2 k

% B  \0 B% s% v
8 n( o( Z: g, r7 {6 N
5 v% `. S# w. T
STM8摸拟串口.jpg
收藏 2 评论20 发布时间:2015-1-6 17:04

举报

20个回答
黑溱郎 回答时间:2015-1-6 17:04:54
本帖最后由 黑溱郎 于 2015-1-7 10:55 编辑
" A- q! ~  _9 P* ]8 E, R. C* K! B$ r; S, n) O* L' n% ~: P5 M; X; U; p1 `& E5 h
接上页。
( t4 ?# R1 m1 t4 Q2 {- g& S
' M: O! H" l$ a; ~
5 T/ b' G" o' i! J步骤5、发送函数9 N/ A: Z9 f+ I% I* A5 \
static void Uart_Tx_Byte(void)4 J. Z' T' U/ n& k8 L
{2 n3 Q& z! e1 ]4 P: X; i
        static bool SendFinish = 1;        //发送完成标志
- G2 h$ u. [$ {# X; \        static u8 TxSampFreq = 0;                //发送计数        采样4次
6 M6 B# l6 l  A! }/ ~        static u8 BitNum = 0;                        //位计数5 G- B$ k- \5 _0 K/ a
        static u8 ByteLock;                         //发送字节锁定(防止在发送途中 发送数字被改变)7 y* \# H& ?" c0 O1 _9 Y
        static u8 TxIndex = 0;                        //当前发送索引
  T0 f7 s$ h* m; z. `2 }( w( R' {
        if(SendFinish)' V8 C! _, i. f
    {/ I% z% E9 u4 h5 r
       SendFinish = 0;# V% {4 u: O, R9 x) z% {
       RxSampFreq = 0;& z- R9 o9 M! D
       BitNum = 0;
- T2 [/ ~! X# j( i) Y3 H
* e! q) v6 e/ |/ _5 h       if(TxIndex < TxXKCnt)        //控制发送的字节# @9 v4 b( b, T( \7 T3 i, m
       {$ W' n9 X* b0 v, {5 l4 b
          ByteLock = UartTxBuff[TxIndex];
+ ^% W2 n4 ^, B& ?) {3 j          TxIndex++;8 t5 Q, t# ]" q5 {7 g6 O: R
          RxByteIndex = 0;
; R( t1 ?& u; T( C       }6 }( x  X4 p% l1 }
       else if(TxIndex == TxXKCnt)
0 f4 P5 T! Z6 k. {2 @* X       {) ?3 T7 k' b! D* m! D
          ByteLock = '\n';& u" O# y& h1 Q. S( \2 Y9 I
          TxIndex++;+ T$ k% U3 K* P9 S- r, l
          RxByteIndex = 0;
; d: N0 A" [" |1 o) N0 A       }, a* L3 Z8 y( G" b2 M$ Q5 @6 e
       else2 m0 [1 i/ ^6 C4 S/ T5 M; g2 U
       {  z! m) R( z& Q$ Q* a4 n
          flag_rxd_txd = 1;
' y. ~0 v: h% M$ N8 u          SendFinish = 0;9 X+ c+ B+ I3 L2 {, g; w' [) n! y
          TxIndex = 0;
* E9 g" W5 n! X9 n! w       }
/ }  L0 A9 u. Q% [0 j1 D( n    }
6 K5 n( D) X5 O' e1 ]: k3 j! C6 M" @) u+ I" t8 `0 v- {
    if(++TxSampFreq > 3)
* e+ Z4 x/ N9 d    {( X2 m! I& ?3 i% Y9 i( F1 {5 l
        if(BitNum == 0)                             //起始位! |/ ]2 L$ Y! X: f
        {
+ R8 R9 ^$ u- Z0 q% d# N; ~            Uart_TXD_Out_LOW();1 W# D& O  j. N. }- h% z* @
            BitNum++;
+ \- c. L8 G6 o  _+ _        }
- u% b% G: |/ t$ A        else if((BitNum >0) && (BitNum < 9))        //数据位. _1 @4 ^7 u+ u$ X
        {
0 X1 R. e- F0 r6 c: z0 B8 y6 u4 v            if(0x01 & (ByteLock >> (BitNum-1)))     //先发低位! I9 U& F2 w/ q3 d) B% R
            {
8 I$ o4 D- f5 q  t: y; x/ z                Uart_TXD_Out_HIGH();  L9 \8 Q' v1 n' X5 z) D
            }, Q! h1 u1 U1 e+ I3 S
            else
# r' R% Z" H, i1 t( e            {7 e; H% {+ P0 l' H
                Uart_TXD_Out_LOW();) W8 K& b0 |* \7 {
            }7 W0 q2 i( v; Y; h
            BitNum++;
1 S, m! Y& J8 V' Z9 V  K        }
& i( f, Z) m1 I( w, P" _2 @( [9 Q        else if(BitNum == 9)                        //结束码
1 j% k( s8 C! {1 j& ?- Z4 d        {" Q& K6 g) ]* V6 y+ Y1 P
            Uart_TXD_Out_HIGH();9 l5 \* E$ Z7 T& f
            SendFinish = 1;' {$ a5 N; K5 U+ S. J) X& ]2 V
            BitNum = 0;
- `) G! v: C! D        }
6 i! G; d9 W! e2 Q' p5 k        TxSampFreq = 0;" ^7 h+ h" `( B3 l* n
    }
& T0 M3 r4 i$ D" F}
: k; h9 ]" F/ ?1 q( V, b/ Z3 F
holts1 回答时间:2015-1-9 15:33:46
黑溱郎 发表于 2015-1-9 15:22# h; C/ v3 e. T8 y
能正常运行啊!
& Y9 }& u" M% j+ G8 H$ h
当然可以的,我还打了板的
黑溱郎 回答时间:2015-1-9 15:22:31
holts1 发表于 2015-1-9 14:252 |8 W5 ~! c% B9 @* K4 j' ^3 i1 x
能正常运行吗?

+ z* \( _. N  i/ N* 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 手机版