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

基于STM8的模拟串口

[复制链接]
黑溱郎 发布时间:2015-1-6 17:04
本帖最后由 黑溱郎 于 2015-1-7 10:54 编辑
. _& z$ o  @, n# l
* o* F, L$ M0 \7 F4 Z; N, v$ }6 A( }" V" p' y7 {9 {; e

0 P3 L0 V6 h& k9 R2 d( s( ^
下面是STM8的模拟串口实验例子
实验工具:STM8S103FP6最小系统版, ST-linkV2, PL2303转串口模块
- [6 }8 S- `1 Z! E- W. m( j$ R
0 T/ {- r7 o0 s" G
步骤1、算出定时初值, STM8内部晶振为16M, 采用8分频后震荡周期 =8/16 =0.5us,所以发送或接受以为数据的采样定时器初值应为48~52;
. m- {* J7 y( i- w8 p
下面为定时器初始化代码:. n& h% `5 F' a8 K! F6 K9 H
void Tim2_Init(void)" X  n2 V: w  L: C5 }3 ]
{; H# h" D; t" K; O' H" f
        TIM2_DeInit();, D. k" I5 x# `* ?# w8 B
       TIM2_TimeBaseInit(TIM2_PRESCALER_8, 48);& T: z1 I6 ]' Y+ F" e
       TIM2_ClearFlag(TIM2_FLAG_UPDATE);
* X* }; g3 v  [; M0 Z6 J- Z
       TIM2_ITConfig(TIM2_IT_UPDATE, ENABLE);
: i# Z  N% e5 R5 T. t0 C
        TIM2_Cmd(ENABLE);
( T# V! M/ Q& p" Z' e$ s% E' z
}# j; g  h7 E# S: D/ x
7 {( @" s! J& T. p# x
步骤2、RXD和TXD初始化,RXD为上拉输入,TXD位推挽输出高电平+ A/ [% ?6 }# l7 V
#define Uart_RXD_Init()                     GPIO_Init(GPIOD,GPIO_PIN_6,GPIO_MODE_IN_PU_NO_IT)
' R' M! S: F: W# k; j
#define Uart_RXD_Status()                 GPIO_ReadInputPin(GPIOD,GPIO_PIN_6); f" q, W" ~7 |9 G
3 M* a% S6 i! Z+ [, S
#define Uart_TXD_Init()                      GPIO_Init(GPIOD,GPIO_PIN_5,GPIO_MODE_OUT_PP_HIGH_FAST)( V+ m# q' y* r# [
#define Uart_TXD_Out_HIGH()            GPIO_WriteHigh(GPIOD,GPIO_PIN_5), k' C9 ~7 ]- c: p
#define Uart_TXD_Out_LOW()            GPIO_WriteLow(GPIOD,GPIO_PIN_5)
6 c! j) U  A* C- ]; o+ O' {7 Z: T0 {) Z5 ]- }
步骤3、中断调用函数; d0 W4 i& w7 \: Q
void Uart_Interrupt(void)
: j2 _; h/ l! k# M: x
{- D/ h- i8 j5 @) q+ R5 h$ I. @
        uint8_t i;% Z( m( ~6 J2 v5 Q8 t$ ^8 T8 C
: m% r1 A, N- E8 Q5 T* c; T
        if(1 == flag_rxd_finish)
1 B% S* H  _6 P' f" l1 X
        {
* E8 o- q& |! n  R) `* V
               flag_rxd_finish = 0;# T- U( _7 U* ]7 |/ R6 \
               flag_rxd_txd = 0;
3 |1 Q+ C) }& d9 a: n# b7 k
               for(i = 0;i < TxXKCnt; i++)
' J! P, }4 Z9 E3 @
               {
' f8 G8 Z. S1 b; r) A/ N
                       UartTxBuff= UartRxBuff;4 t1 \1 @4 z* s
}
6 O. \" p8 E% e. C9 P6 t. V! k        }
, N+ g" p2 v' o
/ n1 J* ~/ m8 A- r
        if(1 == flag_rxd_txd)         // 为1,接收4 C; C' m3 l% ]0 o$ [
        {
& n: I7 S" Q  Q/ Q/ i1 u5 {9 M                Uart_Rx_Byte();$ R2 |1 @" l( L
        }( |4 F! t& N5 V$ U/ k$ z9 w
        else                                        // 为0,发送
9 F8 `9 ^6 x" ?( V# e        {# \9 H1 s3 S8 P1 c
                Uart_Tx_Byte();
$ {9 P$ W; z4 ~4 [; W' v5 c$ i        }
' V& _8 a. p9 h1 ]  z7 d0 X  X}& C* K2 _! f. a! J! N- f+ f
1 T! z/ ], t" w+ V8 l  _

6 X7 u$ [- @+ `# L0 V步骤4、接收函数
( {7 @3 g9 D. z; |4 M8 s* [: Wstatic void Uart_Rx_Byte(void)+ k4 g: `' j" W$ {- G
{2 g7 V/ U; Q: c) f
        static uint8_t RxBitNum;        //接收位计数
6 d7 @* M( {; y. w7 s        static uint8_t OverTime;         //接收超时计时器) Z0 _: O& S% N# z% w" z( \
        static uint8_t RxByteBuff;         //一字节数据接收缓存: e% j$ b/ s* A0 M4 f6 g' L2 o. A; {% {
1 M& E5 r: P  O' o+ Q" _1 X' [
        if(1 == Uart_RXD_Status())0 W3 @3 [  u( u. v
        {
' a7 t; O& |$ e1 y" f                OverTime++;
- {' ^9 X! M6 ]5 w/ y        }
3 o5 K# m5 u1 f6 C. @4 p3 M; Z        else
1 I7 c8 J: |( r$ p' _0 n6 E2 d, Q        {* m  A2 Q) ~3 s1 J( j
                OverTime = 0;
, w# m3 Z' F( [' R8 `7 z, A        }. f) A6 _$ L! O0 P
5 @- T* b* b7 D6 P
        if(OverTime > 44)
. ]: o. w, J) n3 C7 \* r        {, W2 [, E- r0 r$ J( u" M& G
                OverTime = 0;
2 m9 ?2 Q1 W! u. A. k6 J' Y                RxByteIndex = 0;
) c" H# R  Y8 O2 c7 L% ~: D$ N                RxBitNum = 0;
6 L) ]1 }4 v2 U- R6 K0 ]# T        }: J9 S8 n" U/ F6 L) z) N

/ z5 X# b- i7 a! s9 R        if((1 == Uart_RXD_Status()) && (0 == RxBitNum))
: B! c; q9 S6 e4 [$ Q- o        {; [2 W; a% {$ c: z) g' d! ~
                RxSampFreq = 0;( e: @5 I6 }8 k' l- w5 U1 j  `
        }
  s# Q5 y0 [! W        else
3 u5 n( w8 K. q6 i; A        {
3 l- E! u6 W3 v                RxSampFreq++;1 `& ]/ \# X5 P* ?
        }
( R: q3 x4 _9 m
: R0 C/ v& q* S        if(1 == RxSampFreq)8 i) r3 c2 J1 W. _. K
        {
7 u/ H4 [0 i6 ~% j/ O$ L9 d' t                if(0 == RxBitNum)
$ U: c7 ]* o, O5 u( G) ^                {- O+ n$ l! c. ]; |& e% t& i5 T% ~
                        if(0 == Uart_RXD_Status())
9 s7 F  b. z: E2 ~+ X; ~5 P" G                        {
+ L+ d9 s1 p9 X, ?) k( z                                RxByteBuff = 0;; |9 z% Q$ F. s$ G
                                RxBitNum++;. Z9 r9 M6 M# P
                        }
' L# g" k) _* R$ r7 n- r# U                }& _) `. ?0 `% z7 Z
                else if((RxBitNum > 0) && (RxBitNum < 9))
' y3 I& K1 d$ b" `+ x                {
5 b4 |+ L% t4 l  ?3 C2 v- z                        if(1 == Uart_RXD_Status()); O+ ^% t1 {7 t% o, `: _
                        {& f" \8 u5 j2 @7 l
                                RxByteBuff = RxByteBuff | (1 << (RxBitNum - 1));3 Y/ u$ r) s; V4 J' K7 t
                        }
$ U# T; e7 |! m+ e3 o, E$ g                        RxBitNum++;
+ c0 Z5 R3 [3 s5 Q# F                }
& Q( W. b, G( R$ V# l  J                else if(9 == RxBitNum)
+ U4 }% b1 }! }2 d5 U- w                {3 v7 M: Z3 C0 Y" v3 c2 x
                        if(1 == Uart_RXD_Status())0 X) E  r2 t5 a9 t2 z4 D: `& E
                        {
! ~- {) q1 V1 q4 R                                RxBitNum = 0;
- a2 k6 u) N% s                                if(0x0d != RxByteBuff && 0x0a != RxByteBuff)# }% m1 k2 a' r4 Y
                                {$ k- o  p8 O) B. c5 W
                                        UartRxBuff[RxByteIndex] = RxByteBuff;
% B$ R$ e" Z# c$ l( T' b9 K5 i                                        RxByteIndex++;; u& q  y% z; X* v# S9 H' L: `5 M$ X
                                        if(RxByteIndex > 63)
; r5 R, u# S$ i2 c! A                                        {
# j3 u3 j4 I) t' |" z+ k: O                                                RxByteIndex = 0;& w: Z) j' m2 O3 W. O' ?  E
                                        }' r- r' m' a& A8 ?1 B& O# p+ T
                                }% D: b( r3 a6 E4 [7 _# A
                                else
7 R3 ~* ?+ o: N                                {
. s, ]8 l4 ]5 s  [  E6 K' w; `                                        TxXKCnt = RxByteIndex;
7 ~: ]2 ^2 |( |5 g* C& i4 k                                        RxByteIndex = 0;
' [0 E- w. q! I: V1 p. _# |                                        flag_rxd_finish = 1;  ?' f; h% O9 w2 E6 j5 G" M' ^
                                }' p( q/ D/ p" J6 I: |6 b: d- @
                        }8 Y: K! J) r' v# n: b
                }# b6 k8 c8 j, v' Z2 K1 W
                else
2 b* d' p4 n- `                {, Q" ?$ ?/ [) N& L# a* ?* {
                        RxBitNum = 0;
* o3 f& x$ o# G" r                }* F! f% \: V2 A& c  ?+ [5 v% F: u
        }
6 j& I; a. j% \* {& e0 M        else if(RxSampFreq > 3): x% k9 \' ]. }) i
        {* @8 i' Y/ R- g9 C
                RxSampFreq = 0;
# q$ g5 {% Y: M2 h3 O; q. s        }
2 B/ v$ ^' n9 J0 Z8 e}2 _6 A6 Q% S) s: a
0 i3 B) Z# z: Y5 H7 C9 A
贴子超长,接下页。; t  Z5 [4 G5 |% m, H( \
0 f) A+ G4 [9 a1 O5 ]/ ?; {+ ]
. r* O, L8 B# H7 h, e
( t. Y: p& n1 [) L4 [" O% N3 T
5 ^/ R' d, z% W
3 m# L: Z; g" V6 P7 n1 y- W
* L/ n% x. v9 _+ j& c
/ K: g, k: r. Y# E+ a
STM8摸拟串口.jpg
赞 收藏 2 评论20 发布时间:2015-1-6 17:04

举报

20个回答
黑溱郎 回答时间:2015-1-6 17:04:54
本帖最后由 黑溱郎 于 2015-1-7 10:55 编辑
3 j' C7 G3 @6 s  i* u: S7 ^$ \$ ]1 `. Z& p# v$ S  E4 l
接上页。" s1 D/ Y- F5 g5 T/ [1 n- A5 a7 A& i3 f
/ l$ C. Q7 @' _8 s8 [

& H: F0 C1 Y4 g  L0 W2 f/ {步骤5、发送函数+ k/ V. J0 S/ q: B1 H  a1 u, q
static void Uart_Tx_Byte(void)2 ]4 Z! f/ L6 A. b% b. M
{
7 O' a, f+ b4 I+ g3 B! p% k        static bool SendFinish = 1;        //发送完成标志
  r7 X9 x7 ]: ]1 v( T        static u8 TxSampFreq = 0;                //发送计数        采样4次2 q% |& u- M$ `$ I+ b
        static u8 BitNum = 0;                        //位计数
' w1 k( U0 O$ b) D2 C0 g1 t' n1 _' ]        static u8 ByteLock;                         //发送字节锁定(防止在发送途中 发送数字被改变)" Q% a* ?: d6 G
        static u8 TxIndex = 0;                        //当前发送索引
. W, f! |: q4 _0 _- c
+ N; C! \' k; D  \, l: G        if(SendFinish), o3 n! C- H1 E& z5 T
    {
- d+ @: [3 u$ u& T+ c       SendFinish = 0;
! e. @* k) J% J8 O' n& n       RxSampFreq = 0;- `' \  y3 M+ @$ l
       BitNum = 0;8 \& t8 i. t0 {. w! O
9 v# k6 T# I+ U$ R( J
       if(TxIndex < TxXKCnt)        //控制发送的字节
; W; Y7 ~; b# t: e7 K# M# z1 ~       {
" s: g/ [- l- X2 ~2 I, ^+ b          ByteLock = UartTxBuff[TxIndex];8 I4 \$ {3 W0 T. R, K
          TxIndex++;9 W9 s5 _0 Z6 F  f0 H  k& P! r1 R
          RxByteIndex = 0;9 M$ N6 C2 M0 d
       }6 J( Y9 q) O- l/ A
       else if(TxIndex == TxXKCnt)
  M9 ~! o7 b' J. D0 _/ X       {
' g* H5 V! Y3 w; n          ByteLock = '\n';
1 S2 j& n1 `* n! ?- j" L' ^          TxIndex++;7 e/ ?" p: w/ d4 M5 ~! b
          RxByteIndex = 0;. k6 U9 [# V, C8 P% `- j6 D6 \
       }
7 h- g+ }# o: ]4 R       else$ X- W5 F* f' Z" h' p: O, R8 G
       {
& E3 }' L1 C  n: N8 c  e* \          flag_rxd_txd = 1;
3 j2 D; f% i* E          SendFinish = 0;% I9 [- O7 D  W7 t8 _# o- ]: v
          TxIndex = 0;) a1 e/ |7 b) z8 D3 Z8 }* L0 w
       }6 |2 o& Z/ n; r/ |  A
    }
% ~1 p0 n  Q& ~3 }, P
! t3 y, w- x- {    if(++TxSampFreq > 3)1 {, r  z7 |4 o$ H. V8 ^
    {) a% m& \2 }5 V9 F3 z0 F  s
        if(BitNum == 0)                             //起始位
' Y3 h4 s" g$ ]7 X  G! Q' [        {- D( {2 W% |' p, m
            Uart_TXD_Out_LOW();
% I( a+ i& k1 c' j2 z            BitNum++;/ n: }0 ]0 c% ?! s6 b3 M; q, u
        }3 Z: U/ X2 X- t) p  @& q- x
        else if((BitNum >0) && (BitNum < 9))        //数据位
8 V, b; f1 L4 ~# i( P% B2 Q        {
8 x+ ]* F1 V* z4 D( u            if(0x01 & (ByteLock >> (BitNum-1)))     //先发低位
7 }( _7 D0 X( z% M! j1 q' E# s' N            {# c) J2 s; ]7 ]4 G* `4 v: p
                Uart_TXD_Out_HIGH();: E" M6 V6 d. k5 K0 y( c; F4 v
            }8 @" y7 N- W& c& ]- U) }, L8 r1 F
            else
7 T5 l1 E1 h- A6 G            {: D7 t8 C6 v( q/ G6 `
                Uart_TXD_Out_LOW();& W( R' }2 T* {+ Y; @! ]
            }
& i5 i3 B4 [5 Y6 S            BitNum++;
/ N% y/ ~' {4 Z+ U        }
4 r; [5 k0 V2 w1 Z: {        else if(BitNum == 9)                        //结束码( U/ _6 G% F6 G' r
        {+ J+ ^# |, Q# X" ?+ A! M
            Uart_TXD_Out_HIGH();
7 x/ F0 i$ A8 O" d            SendFinish = 1;
, @) Q* {, _4 V+ K4 c            BitNum = 0;# N5 ~/ T$ J3 y% z0 N' M9 Z; o& [
        }; [* V0 Z& c+ x' a8 t/ ?- m, l
        TxSampFreq = 0;  X0 ~( K0 Z- Y9 E/ L
    }
+ I* V1 h* [( n8 j}) `9 I- `! T. C: M3 j+ f2 _- z: S, m3 o
holts1 回答时间:2015-1-9 15:33:46
黑溱郎 发表于 2015-1-9 15:22
* @, Y  m  F9 ^& y$ Y" W能正常运行啊!

: P/ y! q: v: A$ x2 |! @当然可以的,我还打了板的
黑溱郎 回答时间:2015-1-9 15:22:31
holts1 发表于 2015-1-9 14:25% r2 v, R2 \0 I4 c2 S- b
能正常运行吗?
. C, Y; P3 [6 K1 f* H/ j
能正常运行啊!
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 手机版