7116|7

80

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

求助:STM32 通用IO模拟串口 [复制链接]

大家好,我现在使用STM32开发板,遇到一个问题,就是必须用一个通用IO来模拟串口。

我将通用IO配置如下:

  /* Configure USART4 Tx (Pc.09) as alternate function push-pull */
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_Init(GPIOC, &GPIO_InitStructure);
      
  /* Configure USART4 Rx (Pc.8) as input floating */
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;// GPIO_Mode_IPU;
  GPIO_Init(GPIOC, &GPIO_InitStructure);

收数据程序如下:

u8 ReadByte(void)
{
    u8 Output=0;
    u8 i=8;
    u8 temp=RDDYN;
        int iTemp = 0;

    //发送8位数据位                   
        while(1)
        {
                iTemp = (GPIOC->IDR & 0x0100);
               
                if(iTemp == 0)        //低电平,表示收到起始位
                {
                    while(i--)
                        {
                                        Delay(100); //100 96
                                Output >>=1;
                       
                                if(GPIOC->IDR & 0x0100)Output|=0x80;           

                                //位间间隔104us
                         }
                     break;
                }
               
        }
   
        return Output;
}  

但是收到的数据就是不对,我使用的是波特率9600,位间间隔是104us。
函数Delay是微妙级别的延时,使用STM32的systick来延时,应该还是比较准确的。
但是收到的数据不对。

感觉自己现在已经是束手无策了!

请各位做过的前辈说说你们在这方面曾经遇到过的问题,能给我点启发就好了!

谢谢大家!
此帖出自stm32/stm8论坛

最新回复

回复5楼,你说的不太懂是什么意思。 或许了解的知识太有限了吧! 这个软件模拟基本上是成功了。 读起来还比较稳定,如果有后来者进入这里寻找答案的话,给几点建议: 1.先把这种方法在已经能够正常接收串口消息的硬件串口处做通。 2.确保你所用的IO没有被上拉什么的。 3.一定要用示波器,好好看那些高低的波形。你读出来的能够跟那些01组合对得上,那么你就OK了。如果不一样,要分析数据,到底是丢失了哪一些?丢失了第一个位,还是中间有位丢失了?如果丢了第一个位,证明读的太慢了,以至于丢掉了。看看在读第一个位之前是否有Delay()函数。 如果你看到这里,如果你以后也遇到了问题,请在最后给出你的解决方法和心得,以供后来者参考!   详情 回复 发表于 2009-7-31 17:10
点赞 关注
 

回复
举报

63

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
不要使用IO模拟串口,性能很差,没啥可靠性,用专用串口芯片外扩才是正道
此帖出自stm32/stm8论坛
 
 

回复

84

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
首先谢谢ly_liuyang,没办法,现在上头要在不改硬件的情况做,就必须这样了。

我把这样的方法应用在于PC机通信的串口上,去收串口发的数据,可以收到。

但是放到通用IO上就不行了。

在网上也看到过前辈用51单片机模拟串口,似乎效果还可以,但是怎么STM32上就不行了呢?

想不明白。。。
此帖出自stm32/stm8论坛
 
 

回复

86

帖子

0

TA的资源

一粒金砂(初级)

4
 
自己顶!
此帖出自stm32/stm8论坛
 
 
 

回复

75

帖子

0

TA的资源

一粒金砂(初级)

5
 
理论上讲,  串口只是识别高低电平   要是你的IO口模拟的电平时间正确的话肯定是没有问题的。

看IO口收发数据的波形,  上升下降沿是否OK  
用IO口接收数据的时候,MCU应该在每一bit电平的中间位置读比较好,
可以调试一下,看MCU都是在那个时间点去读的,用示波器看

还有可能就是中断的问题,在收发的时候可能发生哪些高优先级中断,处理时间...
此帖出自stm32/stm8论坛
 
 
 

回复

80

帖子

0

TA的资源

一粒金砂(初级)

6
 
如果一定要做....用某种高速输出/输入来做吧

现在MCU通常会提供一些模块,在Timer事件到来时自动在给定管脚给出一定的信号,用这个来模拟UART发送

用事件捕捉来做UART接收.

不过软件做起来要复杂些.
此帖出自stm32/stm8论坛
 
 
 

回复

61

帖子

0

TA的资源

一粒金砂(初级)

7
 
回复4楼,你说的很有道理!

弄这个程序那几天,天天看示波器。感觉用示波器,还是可以解决一些问题的。

电平时间就是那个104us 确实很重要,还有就是有一个停止位要读出来。

嵌入式开发就是很奇怪,有时候完全不行,有时候也没改什么东西,它就莫名其妙的好了。
此帖出自stm32/stm8论坛
 
 
 

回复

72

帖子

0

TA的资源

一粒金砂(初级)

8
 
回复5楼,你说的不太懂是什么意思。

或许了解的知识太有限了吧!


这个软件模拟基本上是成功了。

读起来还比较稳定,如果有后来者进入这里寻找答案的话,给几点建议:

1.先把这种方法在已经能够正常接收串口消息的硬件串口处做通。

2.确保你所用的IO没有被上拉什么的。

3.一定要用示波器,好好看那些高低的波形。你读出来的能够跟那些01组合对得上,那么你就OK了。如果不一样,要分析数据,到底是丢失了哪一些?丢失了第一个位,还是中间有位丢失了?如果丢了第一个位,证明读的太慢了,以至于丢掉了。看看在读第一个位之前是否有Delay()函数。

如果你看到这里,如果你以后也遇到了问题,请在最后给出你的解决方法和心得,以供后来者参考!

此帖出自stm32/stm8论坛
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表