首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 嵌入开发 > 驱动开发 >

STM32 通用IO模拟串口

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

求助: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来延时,应该还是比较准确的。
但是收到的数据不对。

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

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

谢谢大家!

[解决办法]
不要使用IO模拟串口,性能很差,没啥可靠性,用专用串口芯片外扩才是正道
[解决办法]
理论上讲, 串口只是识别高低电平 要是你的IO口模拟的电平时间正确的话肯定是没有问题的。

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

还有可能就是中断的问题,在收发的时候可能发生哪些高优先级中断,处理时间...
[解决办法]
如果一定要做....用某种高速输出/输入来做吧

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

用事件捕捉来做UART接收.

不过软件做起来要复杂些.

热点排行