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

基于STM8的模拟串口

[复制链接]
黑溱郎 发布时间:2015-1-6 17:04
本帖最后由 黑溱郎 于 2015-1-7 10:54 编辑



下面是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;
        }
}

贴子超长,接下页。







STM8摸拟串口.jpg
收藏 2 评论19 发布时间:2015-1-6 17:04

举报

19个回答
黑溱郎 回答时间:2015-1-6 17:04:54
本帖最后由 黑溱郎 于 2015-1-7 10:55 编辑

接上页。


步骤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;
    }
}
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 15:22:31
holts1 发表于 2015-1-9 14:25
能正常运行吗?

能正常运行啊!
12下一页

所属标签

STM32团队

意法半导体微控制器和微处理器拥有广泛的产品线,包含低成本的8位单片机和基于ARM® Cortex®-M0、M0+、M3、M4、M33、M7及A7内核并具备丰富外设选择的32位微控制器及微处理器


最新内容

相似技术帖

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版