大家好,我现在使用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来延时,应该还是比较准确的。
但是收到的数据不对。
感觉自己现在已经是束手无策了!
请各位做过的前辈说说你们在这方面曾经遇到过的问题,能给我点启发就好了!
谢谢大家!
此帖出自
小平头技术问答
我把这样的方法应用在于PC机通信的串口上,去收串口发的数据,可以收到。
但是放到通用IO上就不行了。
在网上也看到过前辈用51单片机模拟串口,似乎效果还可以,但是怎么STM32上就不行了呢?
想不明白。。。
现在MCU通常会提供一些模块,在Timer事件到来时自动在给定管脚给出一定的信号,用这个来模拟UART发送
用事件捕捉来做UART接收.
不过软件做起来要复杂些.
弄这个程序那几天,天天看示波器。感觉用示波器,还是可以解决一些问题的。
电平时间就是那个104us 确实很重要,还有就是有一个停止位要读出来。
嵌入式开发就是很奇怪,有时候完全不行,有时候也没改什么东西,它就莫名其妙的好了。
一周热门 更多>