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

基于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 评论20 发布时间:2015-1-6 17:04

举报

20个回答
黑溱郎 回答时间: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;
    }
}
holts1 回答时间:2015-1-9 15:33:46

当然可以的,我还打了板的
黑溱郎 回答时间:2015-1-9 15:22:31
holts1 发表于 2015-1-9 14:25
能正常运行吗?

能正常运行啊!
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 手机版