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

基于STM8的模拟串口

[复制链接]
黑溱郎 发布时间:2015-1-6 17:04
本帖最后由 黑溱郎 于 2015-1-7 10:54 编辑 ' F2 J  @) V2 v0 H! o# h
9 Q6 i' K/ P8 h$ s$ o6 n6 K/ f
6 Z, v1 c; {7 b& t$ p

5 _" _2 ?) Y' M3 y- {
下面是STM8的模拟串口实验例子
实验工具:STM8S103FP6最小系统版, ST-linkV2 PL2303转串口模块8 r: v2 C% m, m! N4 Q
5 b  f" w. z* w$ p* T% H; F
步骤1、算出定时初值, STM8内部晶振为16M 采用8分频后震荡周期 =8/16 =0.5us,所以发送或接受以为数据的采样定时器初值应为48~528 n  }( @: ?6 x2 `
下面为定时器初始化代码:
9 g0 ?" t; H* `& _
void Tim2_Init(void)
- Y( D1 o0 q, \  t7 W2 B$ o$ R5 i/ e
{
7 _1 N& h* z( s8 f+ J( U
        TIM2_DeInit();
1 m4 ], W5 j  R9 M
       TIM2_TimeBaseInit(TIM2_PRESCALER_8, 48);
: g+ r; y- i  [+ ~
       TIM2_ClearFlag(TIM2_FLAG_UPDATE);
' q# @, d* |% h. [% M
       TIM2_ITConfig(TIM2_IT_UPDATE, ENABLE);7 x+ h$ V- j& a9 S
        TIM2_Cmd(ENABLE);
/ u# t! u' C8 z! b3 I/ Z
}' }! H/ [% o1 X- x8 f

7 l! Z% o2 C# B! _
步骤2RXDTXD初始化,RXD为上拉输入,TXD位推挽输出高电平: M' |; O" a6 Y$ E( R
#define Uart_RXD_Init()                     GPIO_Init(GPIOD,GPIO_PIN_6,GPIO_MODE_IN_PU_NO_IT)4 Q$ [5 @) C7 @' g7 @/ n
#define Uart_RXD_Status()                 GPIO_ReadInputPin(GPIOD,GPIO_PIN_6)
4 h6 u  }' z  H1 ^8 Z) d+ Z! S0 B
: ]. P- A: H) Z$ @
#define Uart_TXD_Init()                      GPIO_Init(GPIOD,GPIO_PIN_5,GPIO_MODE_OUT_PP_HIGH_FAST)2 u+ G/ v7 l2 _4 J2 n
#define Uart_TXD_Out_HIGH()            GPIO_WriteHigh(GPIOD,GPIO_PIN_5)
0 B5 T) b! N  \
#define Uart_TXD_Out_LOW()            GPIO_WriteLow(GPIOD,GPIO_PIN_5): @& ~) r+ l( ~

/ m" B( u5 F3 f' K9 H
步骤3、中断调用函数  o7 o4 [- X/ y% \. h
void Uart_Interrupt(void)
" U" `4 h+ ~9 w7 T5 n
{
; v6 q# V% Z! ]7 F$ K
        uint8_t i;3 G4 i" T  g+ f9 V0 F
1 j( L$ m* i5 z; M; a+ E
        if(1 == flag_rxd_finish)/ ?  h9 ?( G4 m3 z$ j! d/ q* d3 _
        {
" P& w$ C: [+ A2 e! ~' ^
               flag_rxd_finish = 0;
" m1 o+ O/ l$ ]1 \" c9 ]
               flag_rxd_txd = 0;
1 g) s% Q8 o$ b( T9 @
               for(i = 0;i < TxXKCnt; i++)8 \0 q6 P9 G) I' g
               {6 c  N, ]5 \2 K4 d
                       UartTxBuff= UartRxBuff;: u" Y% a! q8 o) n  [
}
7 X; {! f/ q. b# j2 f( Z+ E        }
/ s8 F& R, C. U: J' [. K# e

/ \& |& i6 q; W5 s5 o
        if(1 == flag_rxd_txd)         // 为1,接收
8 B6 Q: _5 a$ W: k- L        {
+ n2 U+ L; m9 m                Uart_Rx_Byte();
1 k; z, ~) K6 V+ J        }
) C9 ^, p9 T3 m        else                                        // 为0,发送
+ F' R7 F8 ^  [0 s. z7 g5 E, J        {% m2 ^4 `" R; y7 ?3 w: `7 Y
                Uart_Tx_Byte();
5 Q. o; i& P% _9 T- s        }4 E4 A0 l3 s& K& y
}
! U$ Y: n/ z6 m( i2 i  H% t
  x: o3 h7 H) S. B. y/ y: l9 {4 c" L5 J. j/ w9 W; i& o$ W8 Z' W
步骤4、接收函数
" j" m, k- M/ h! h: S: w" bstatic void Uart_Rx_Byte(void)- H9 E1 e9 x7 ?/ o
{* a9 A, m6 d4 S4 E/ p1 ?
        static uint8_t RxBitNum;        //接收位计数2 c, `$ m* T) Z2 ^( Q
        static uint8_t OverTime;         //接收超时计时器/ M9 v( g9 N4 d4 I  [
        static uint8_t RxByteBuff;         //一字节数据接收缓存
. F) k: `; a/ K1 E) s0 b$ b/ S% i. f" e/ p3 [7 L5 ?' L6 X
        if(1 == Uart_RXD_Status())
1 \0 S* @) z- T% {        {
8 l" @, X, }, @: w8 ]8 g+ _9 E                OverTime++;& k( L; t' X1 V) q, s, g
        }
1 d: ^% ?- |* B8 ~: n! i" s        else8 u/ m. y& E& E8 S; X
        {/ w: B! h8 s5 Z7 ^
                OverTime = 0;
2 t0 U, V2 n5 W8 H2 [2 z        }
/ W. h5 {7 ?: l9 |9 L% r8 k- g, P0 B, T: K/ |4 x! A, N
        if(OverTime > 44)
' b3 G/ G% q6 @        {, D" v9 W0 G: |
                OverTime = 0;/ M, x! I" w' Q/ O1 I: t$ Z
                RxByteIndex = 0;+ N$ J  P! _1 b/ K# F
                RxBitNum = 0;
2 i3 P: ]% z5 O        }1 E: G" P. P" f5 L+ F7 G+ k" ~

& C, z8 @2 |3 ]+ F  }        if((1 == Uart_RXD_Status()) && (0 == RxBitNum))
8 H$ x/ a: ~- ]7 d$ n6 x        {
& k8 s7 y( H7 x                RxSampFreq = 0;8 [: |+ e8 |. R+ S
        }
6 x" O7 |2 E+ r$ }1 n        else
. o& h4 c/ e; A  }8 ]% {: u; k        {
% K+ c. Y3 s. ~! [! j3 H                RxSampFreq++;+ O# ]2 F* ^/ [' P( ?3 d* a; t6 H
        }
7 {" ]: C" X8 w* I8 [, [/ [" J" t1 D* ~0 C: O$ e8 H- q
        if(1 == RxSampFreq)8 k5 R! k  e9 ?" t: _8 ~$ S
        {) I4 Z' j( y4 {$ ]
                if(0 == RxBitNum)
& @2 Q' p+ c- ?  X9 }                {4 j# @4 Q3 ~. l9 E
                        if(0 == Uart_RXD_Status())6 a0 q4 Q* {7 t! ?' o
                        {
% H& z" a+ y% R: Y- {4 Y1 S                                RxByteBuff = 0;
3 I- S! {) A# A# W                                RxBitNum++;) c0 J. F% @: o# k1 W& c8 e
                        }% ?. |' l) a* w. e4 H* D
                }
* _& y3 |- i  ?" n                else if((RxBitNum > 0) && (RxBitNum < 9))6 X7 X( V  v2 C5 Y- m' H/ c
                {! s( e! \* i4 x% P8 A4 l
                        if(1 == Uart_RXD_Status())
# M& K3 _8 d) _( T0 m7 P$ o* E                        {3 E0 v( y/ x, W6 c" |6 \: H
                                RxByteBuff = RxByteBuff | (1 << (RxBitNum - 1));
6 @0 m5 y- p8 i" B6 M9 v                        }2 ~- e) b& n9 c' \. r/ R) @/ T
                        RxBitNum++;
: |- x5 g! K$ f6 Y. }7 R# G                }# b2 K1 y4 z6 I& P3 a, o" p1 H# O
                else if(9 == RxBitNum)
* W8 J; m- e& ?0 N  G                {+ b" r9 P6 |: z: m
                        if(1 == Uart_RXD_Status())
! l  R& ]1 ]+ f- H. I                        {9 R* Y8 }  m; x; D# l
                                RxBitNum = 0;3 d- y" L  Q8 g. `3 w" u
                                if(0x0d != RxByteBuff && 0x0a != RxByteBuff)+ R( f' a( a) R  n$ [8 O9 N$ H
                                {; R. R3 ?% R9 Z4 |; z
                                        UartRxBuff[RxByteIndex] = RxByteBuff;
1 R5 _2 y, i& X; x, _% W                                        RxByteIndex++;) E( J1 H5 y) A* m1 L; b3 ]
                                        if(RxByteIndex > 63)- L9 y- ]0 g2 R: h
                                        {1 g- ]; \0 H" z& V& H9 P, q; [
                                                RxByteIndex = 0;
, `0 y" j$ p$ F) |                                        }  N1 V7 W7 g* |9 q: T
                                }
0 p2 q/ ?. g% J" S( f1 s! E                                else% f4 h0 c4 c( H3 Y6 L, c% X
                                {2 E( K' h5 f  u
                                        TxXKCnt = RxByteIndex;$ T' M; T5 G6 _' h5 K/ ?
                                        RxByteIndex = 0;3 |2 M  v. A4 N3 A$ z1 `1 [. _/ Q
                                        flag_rxd_finish = 1;
9 l# u, I8 I* g. y7 q, R7 U; s                                }
- e9 \1 m' D; {                        }
- {" f0 _/ t+ J5 l' Q2 v$ y                }0 y4 n( n' y0 Z+ V' A: s) l4 D
                else
/ B/ i- M' G: K* ?                {
9 N( |  u  F. F. p4 o+ ]# R/ \& Y                        RxBitNum = 0;
% B; }( H% y( b& x                }
4 P0 u' F/ H! z7 z% O( d, H        }  ?- w+ a. ?( t: z0 ^
        else if(RxSampFreq > 3)9 e5 X/ ?% D1 J* g0 b0 }
        {
5 P" o2 d% P: k0 t: X) K                RxSampFreq = 0;' Q: Z+ Q+ {8 T$ t; J& ?
        }3 Q9 w& e/ u7 r! x  q( Q
}5 ?+ v6 c' B* E5 D7 H- A  }
+ y+ W# U+ O) m6 @  _
贴子超长,接下页。
$ f7 z; h* j! J/ U* \+ v
* I' D7 d0 C0 p- N, e; b  @/ [6 J& O
2 h! I( ?' \5 R& p; H& t: f" P* _" e& k9 c
8 _+ ~" Y% f. ~7 i5 h5 x0 i

+ H  n3 ]8 c' x: ^
: m& X  W$ F% e/ p5 D9 p1 F2 `5 r  D
STM8摸拟串口.jpg
收藏 2 评论20 发布时间:2015-1-6 17:04

举报

20个回答
黑溱郎 回答时间:2015-1-6 17:04:54
本帖最后由 黑溱郎 于 2015-1-7 10:55 编辑
7 a+ T4 [- v3 G- f9 k  D( M( u' d$ [. O" w7 W
接上页。1 x9 q* u! F! |1 ]: j; m2 P; _

4 m% i" ], h  G5 O( E& t) ~4 m+ T
% E( F( X! s, `步骤5、发送函数
3 |) j9 o  o* c2 `. ^, T' H7 c/ \static void Uart_Tx_Byte(void)4 a- r/ T5 Y  z/ |: }2 `
{
9 y! Z* U, O+ p% L0 b/ p        static bool SendFinish = 1;        //发送完成标志7 p  K( |' Y' v$ k
        static u8 TxSampFreq = 0;                //发送计数        采样4次$ k& i+ b* s7 U1 o4 Z
        static u8 BitNum = 0;                        //位计数- Q; N2 `1 g1 u) U/ |2 g
        static u8 ByteLock;                         //发送字节锁定(防止在发送途中 发送数字被改变)
; W4 y. ^. I( }2 U7 r2 B4 O        static u8 TxIndex = 0;                        //当前发送索引1 N" v# ]* V8 A9 v4 S* [

" B2 G0 Z7 |; _4 z+ f" G9 y8 C4 R        if(SendFinish)
7 c) @! o; N9 q$ E( Z8 b    {
6 ^% n# {) b# q       SendFinish = 0;
; s+ x1 y% N4 j0 y& q       RxSampFreq = 0;
# S, r& R4 m* x, b6 k7 }9 f       BitNum = 0;4 B; C2 \! Z# e$ c/ E

2 L0 v# a/ ~5 f$ L       if(TxIndex < TxXKCnt)        //控制发送的字节! y6 L( [- z( ^! m( B+ P" ]* q% U8 O( |
       {
; }6 u" i: E3 G  a7 n          ByteLock = UartTxBuff[TxIndex];8 _+ J; i" x9 S2 c" Q; v
          TxIndex++;
0 v. V8 Z" t# t. J' }" g          RxByteIndex = 0;5 C* X0 P& e+ m6 G' N. W  }
       }& e. w8 ]; B! H$ u3 n6 [% w
       else if(TxIndex == TxXKCnt)
; L6 V8 r9 M4 ^4 N2 g/ Z  q% W       {
. D" a/ K8 L' p5 v, \% T, C0 L          ByteLock = '\n';
; ?6 b* [8 H; G5 m! A) C4 h2 c          TxIndex++;5 n  O+ I8 p) i3 |" d# Q) j
          RxByteIndex = 0;
1 {8 i) L5 n7 K       }/ q8 S) @6 j; [, o8 M4 V
       else0 d1 |; j) o  q7 X9 U  T' I0 p
       {( A% L) i; _- v- X: J: F  D
          flag_rxd_txd = 1;/ u/ n0 S7 w! y
          SendFinish = 0;% v) E" _2 }" o6 T$ f9 A9 t
          TxIndex = 0;$ ]) g, o' X3 S! f' C# S) p' d
       }' o% z* Q% K$ s" f; @( a2 P, }" Z5 C2 ?
    }% g! b' F# r. \( |& Q/ |% S
9 Y% s/ k+ L3 S! ]6 p" w* O
    if(++TxSampFreq > 3)
% \+ O" k& q8 L    {! V5 w) ]; f0 Z% P& p( z5 k$ b
        if(BitNum == 0)                             //起始位, D/ B) M, O6 J2 p$ H- p
        {
, x* [; t+ W6 Q1 g5 Y6 E2 z: N            Uart_TXD_Out_LOW();; d+ q  H( I, \( D1 U
            BitNum++;& v6 [. M6 l) {9 t3 E$ V3 E
        }
1 p: O% j. H0 R2 u* r        else if((BitNum >0) && (BitNum < 9))        //数据位% _5 X* X* F0 y* E0 z3 Z, j7 j
        {
  \" c; W$ ^3 D1 f/ d. {            if(0x01 & (ByteLock >> (BitNum-1)))     //先发低位
! K7 y! z' V) |) ]# C' E            {8 W- ~2 N+ O1 _. i, [* x
                Uart_TXD_Out_HIGH();
9 w& J1 v* ?% u3 J8 b            }- G: F8 R5 j% f# \
            else3 ^0 `" ?& x! b. J. h+ J( }3 n6 o) O
            {4 ~$ b1 `  W6 T7 r6 V# y$ l
                Uart_TXD_Out_LOW();6 D% C" y8 c( z  B9 W, v
            }  P8 Q1 r- S# ]; t
            BitNum++;
" o: M$ M. a* u/ l0 \2 f( H        }4 l3 n7 p4 v9 x7 u; n! ]
        else if(BitNum == 9)                        //结束码
) f, ~  Q' R4 w7 T        {
2 ], C% U( g0 T; Z, G  m            Uart_TXD_Out_HIGH();$ @3 J9 i& T6 ~' y7 @' f+ X9 S% P6 F
            SendFinish = 1;9 O: f$ k, K, p
            BitNum = 0;4 b( x# _' `. e5 B
        }
; F6 K9 E$ I  ~8 G! n        TxSampFreq = 0;
4 s/ _  j% X8 S% a( s: C- {    }
. @: d2 B+ S2 X}
' [0 {, C9 v7 Y0 N/ l
holts1 回答时间:2015-1-9 15:33:46
黑溱郎 发表于 2015-1-9 15:22$ m, [4 m" i" d' h0 O2 g: G
能正常运行啊!

" E4 Q2 K3 W% V5 N$ u/ I当然可以的,我还打了板的
黑溱郎 回答时间:2015-1-9 15:22:31
holts1 发表于 2015-1-9 14:25. h. c7 j- u1 I2 M3 x
能正常运行吗?

+ o6 T+ A' M  G4 n$ v- \能正常运行啊!
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管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版