查看: 922|回复: 0

[经验] 基于STM8的模拟串口

[复制链接]
  • TA的每日心情
    开心
    2019-11-4 13:48
  • 签到天数: 14 天

    连续签到: 1 天

    [LV.3]偶尔看看II

    发表于 2020-6-23 09:44:59 | 显示全部楼层 |阅读模式
    分享到:
    下面是STM8的模拟串口实验例子
    实验工具:STM8S103FP6最小系统版, ST-linkV2 PL2303转串口模块

    步骤1、算出定时初值, STM8内部晶振为16M 采用8分频后震荡周期 =8/16 =0.5us,所以发送或接受以为数据的采样定时器初值应为48~52
    下面为定时器初始化代码:
    void Tim2_Init(void)
    {
            TIM2_DeInit();
           TIM2_TimeBaseInit(TIM2_PRESCALER_8, 48);
           TIM2_ClearFlag(TIM2_FLAG_UPDATE);
           TIM2_ITConfig(TIM2_IT_UPDATE, ENABLE);
            TIM2_Cmd(ENABLE);
    }

    步骤2RXDTXD初始化,RXD为上拉输入,TXD位推挽输出高电平
    #define Uart_RXD_Init()                     GPIO_Init(GPIOD,GPIO_PIN_6,GPIO_MODE_IN_PU_NO_IT)
    #define Uart_RXD_Status()                 GPIO_ReadInputPin(GPIOD,GPIO_PIN_6)

    #define Uart_TXD_Init()                      GPIO_Init(GPIOD,GPIO_PIN_5,GPIO_MODE_OUT_PP_HIGH_FAST)
    #define Uart_TXD_Out_HIGH()            GPIO_WriteHigh(GPIOD,GPIO_PIN_5)
    #define Uart_TXD_Out_LOW()            GPIO_WriteLow(GPIOD,GPIO_PIN_5)

    步骤3、中断调用函数
    void Uart_Interrupt(void)
    {
            uint8_t i;

            if(1 == flag_rxd_finish)
            {
                   flag_rxd_finish = 0;
                   flag_rxd_txd = 0;
                   for(i = 0;i < TxXKCnt; i++)
                   {
                           UartTxBuff= UartRxBuff;
    }
            }


            if(1 == flag_rxd_txd)         // 为1,接收
            {
                    Uart_Rx_Byte();
            }
            else                                        // 为0,发送
            {
                    Uart_Tx_Byte();
            }
    }


    步骤4、接收函数
    static void Uart_Rx_Byte(void)
    {
            static uint8_t RxBitNum;        //接收位计数
            static uint8_t OverTime;         //接收超时计时器
            static uint8_t RxByteBuff;         //一字节数据接收缓存

            if(1 == Uart_RXD_Status())
            {
                    OverTime++;
            }
            else
            {
                    OverTime = 0;
            }

            if(OverTime > 44)
            {
                    OverTime = 0;
                    RxByteIndex = 0;
                    RxBitNum = 0;
            }

            if((1 == Uart_RXD_Status()) && (0 == RxBitNum))
            {
                    RxSampFreq = 0;
            }
            else
            {
                    RxSampFreq++;
            }

            if(1 == RxSampFreq)
            {
                    if(0 == RxBitNum)
                    {
                            if(0 == Uart_RXD_Status())
                            {
                                    RxByteBuff = 0;
                                    RxBitNum++;
                            }
                    }
                    else if((RxBitNum > 0) && (RxBitNum < 9))
                    {
                            if(1 == Uart_RXD_Status())
                            {
                                    RxByteBuff = RxByteBuff | (1 << (RxBitNum - 1));
                            }
                            RxBitNum++;
                    }
                    else if(9 == RxBitNum)
                    {
                            if(1 == Uart_RXD_Status())
                            {
                                    RxBitNum = 0;
                                    if(0x0d != RxByteBuff && 0x0a != RxByteBuff)
                                    {
                                            UartRxBuff[RxByteIndex] = RxByteBuff;
                                            RxByteIndex++;
                                            if(RxByteIndex > 63)
                                            {
                                                    RxByteIndex = 0;
                                            }
                                    }
                                    else
                                    {
                                            TxXKCnt = RxByteIndex;
                                            RxByteIndex = 0;
                                            flag_rxd_finish = 1;
                                    }
                            }
                    }
                    else
                    {
                            RxBitNum = 0;
                    }
            }
            else if(RxSampFreq > 3)
            {
                    RxSampFreq = 0;
            }
    }

    贴子超长,接下页。











    接上页。


    步骤5、发送函数
    static void Uart_Tx_Byte(void)
    {
            static bool SendFinish = 1;        //发送完成标志
            static u8 TxSampFreq = 0;                //发送计数        采样4次
            static u8 BitNum = 0;                        //位计数
            static u8 ByteLock;                         //发送字节锁定(防止在发送途中 发送数字被改变)
            static u8 TxIndex = 0;                        //当前发送索引

            if(SendFinish)
        {
           SendFinish = 0;
           RxSampFreq = 0;
           BitNum = 0;

           if(TxIndex < TxXKCnt)        //控制发送的字节
           {
              ByteLock = UartTxBuff[TxIndex];
              TxIndex++;
              RxByteIndex = 0;
           }
           else if(TxIndex == TxXKCnt)
           {
              ByteLock = '\n';
              TxIndex++;
              RxByteIndex = 0;
           }
           else
           {
              flag_rxd_txd = 1;
              SendFinish = 0;
              TxIndex = 0;
           }
        }

        if(++TxSampFreq > 3)
        {
            if(BitNum == 0)                             //起始位
            {
                Uart_TXD_Out_LOW();
                BitNum++;
            }
            else if((BitNum >0) && (BitNum < 9))        //数据位
            {
                if(0x01 & (ByteLock >> (BitNum-1)))     //先发低位
                {
                    Uart_TXD_Out_HIGH();
                }
                else
                {
                    Uart_TXD_Out_LOW();
                }
                BitNum++;
            }
            else if(BitNum == 9)                        //结束码
            {
                Uart_TXD_Out_HIGH();
                SendFinish = 1;
                BitNum = 0;
            }
            TxSampFreq = 0;
        }
    }


    回复

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /3 下一条



    手机版|小黑屋|与非网

    GMT+8, 2025-1-13 10:54 , Processed in 0.114985 second(s), 15 queries , MemCache On.

    ICP经营许可证 苏B2-20140176  苏ICP备14012660号-2   苏州灵动帧格网络科技有限公司 版权所有.

    苏公网安备 32059002001037号

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.