打印
[STM32F0]

IO模拟串口

[复制链接]
2600|32
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
七颗咖啡豆|  楼主 | 2016-9-12 14:30 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
避免后来者走弯路。
沙发
七颗咖啡豆|  楼主 | 2016-9-12 14:39 | 只看该作者
项目设计之初千万不要把虚拟串口当作一个可靠地外设接口。
可以用IO模拟串口发送数据。
不要用模拟串口接收数据。
只有在设计之初没有考虑到,没办法临时救急可以用一下模拟的串口。
发送直接写IO电平然后delay就可以。
接收必须要IO中断加定时器,不要IO中断里面delay,项目大了会出现程序跑飞。
/*10us*/
uint8_t uart_tp=0;
void TIM1_BRK_UP_TRG_COM_IRQHandler()
{
    static u16 n=0,i=0;
    static uint8_t Res=0;
    if(TIM_GetITStatus(TIM1, TIM_IT_Update) != RESET)  //检查TIM1更新中断发生与否
    {
        if(uart_tp==1)
        {
            n++;
            if((n== 41+6 +42*i) && i<8)
            {
                Res |= RX_25<<i;
                i++;
            }
            if( n== 41+6 + 42*8 -5 )//停止位
            {
                i = 0;
                n = 0;
                if(!PM25_BUFFER_data_tp)//0
                {
                    infifo(Res);
                }
                Res = 0;
                uart_tp = 0;
                EXTI->IMR |= EXTI_Line_s_urt;//开中断线1
            }   
        }
        TIM_ClearITPendingBit(TIM1, TIM_IT_Update  );
    }
}

//2400 波特率  终端里面用了delay很不好,等有多余的定时器在修改

void EXTI0_1_IRQHandler(void)
{   
if(EXTI_GetITStatus(EXTI_Line_s_urt) != RESET)
  {
        EXTI->IMR &= ~EXTI_Line_s_urt;//屏蔽中断1   
        uart_tp=1;
       EXTI_ClearITPendingBit(EXTI_Line_s_urt);
  }
}

//2400  b/s
void Simurt_SendOneByte(uint8_t Byte)
{
    uint8_t i=8,tmp;
    TX_0;
    delay_us(416);

    for(i=0;i<8;i++)
    {
        tmp    = (Byte >> i) & 0x01;  

        if(tmp == 0)
        {
            TX_0;
            delay_us(416);    //0        
        }
        else
        {
            TX_1;
            delay_us(416);    //1        
        }   
    }
     TX_1;
     delay_us(416);
}
总结:不要用模拟串口做项目。那个只能做下实验玩玩。

使用特权

评论回复
板凳
songbangyan| | 2016-9-12 16:49 | 只看该作者
在通信波特率比较低的情况下,可以做的很稳定。但是高速率,好像就比较困难了。

使用特权

评论回复
地板
xyz549040622| | 2016-9-12 17:03 | 只看该作者
IO模拟本来就是很慢的。

使用特权

评论回复
5
zhuomuniao110| | 2016-9-12 17:05 | 只看该作者
这个要了解一下串口的通信协议就行了,我觉得串口没有SPI接口好模拟,我习惯用SPI接口,几句代码就搞定。

使用特权

评论回复
6
七颗咖啡豆|  楼主 | 2016-9-12 17:10 | 只看该作者
zhuomuniao110 发表于 2016-9-12 17:05
这个要了解一下串口的通信协议就行了,我觉得串口没有SPI接口好模拟,我习惯用SPI接口,几句代码就搞定。 ...

SPI很好,可是很多外设功能模块都提供串口,SPI不一定支持

使用特权

评论回复
7
zhuomuniao110| | 2016-9-12 17:40 | 只看该作者
七颗咖啡豆 发表于 2016-9-12 17:10
SPI很好,可是很多外设功能模块都提供串口,SPI不一定支持

不见得,SPI的模块我看比串口的多,比如MAX的好多外设都是SPI的。

使用特权

评论回复
8
mmuuss586| | 2016-9-12 18:49 | 只看该作者
学习了;

使用特权

评论回复
9
changle11sdo5| | 2016-9-12 20:51 | 只看该作者
外部中断

使用特权

评论回复
10
yklstudent| | 2016-9-12 21:01 | 只看该作者
9600也没什么问题

使用特权

评论回复
11
Xflyan| | 2016-9-12 21:04 | 只看该作者
F030模拟串口到38400可以用,板子要用到两个串口,一个内部使用,一个外部,标准串口留给外部用户了,内部IO模拟,CPU任务比较简单,还是挺稳定的

使用特权

评论回复
12
763375164| | 2016-9-12 21:36 | 只看该作者
学习了……

使用特权

评论回复
13
AKKan| | 2016-9-13 08:24 | 只看该作者
学习了,还没用过IO模拟UART接收,一般都模拟SPI或I2C,看到楼主分享,更加确信,没CLK的尽量不模拟了

使用特权

评论回复
14
yichunshan| | 2016-9-13 09:47 | 只看该作者
zhuomuniao110 发表于 2016-9-12 17:40
不见得,SPI的模块我看比串口的多,比如MAX的好多外设都是SPI的。

同意,同一电路板或同一系统内的外设SPI比串口多
串口跟上位机通讯多

使用特权

评论回复
15
七颗咖啡豆|  楼主 | 2016-9-14 17:07 | 只看该作者
yichunshan 发表于 2016-9-13 09:47
同意,同一电路板或同一系统内的外设SPI比串口多
串口跟上位机通讯多

可能因为行业原因,我们这里智能家居,用别人的模块,如wifi模块,PM25传感器模块等,都是默认串口,其他接口需要定制。

使用特权

评论回复
16
yichunshan| | 2016-9-14 17:25 | 只看该作者
七颗咖啡豆 发表于 2016-9-14 17:07
可能因为行业原因,我们这里智能家居,用别人的模块,如wifi模块,PM25传感器模块等,都是默认串口,其他 ...

就是这样,同一系统,同一块板子都是SPI,涉及与其他外部模块的,一般UART方便,比如蓝牙模块一般都是UART的

使用特权

评论回复
17
豆腐块| | 2016-9-16 21:12 | 只看该作者
模拟过IIC,还没模拟过串口呢,学习一下

使用特权

评论回复
18
Ryze| | 2016-9-16 22:07 | 只看该作者
串口中断怎么办

使用特权

评论回复
19
gszou| | 2016-9-16 22:21 | 只看该作者
嵌入汇编去实现,只要你的IO能达什么速度,就能模拟多高速度的串口。过程中,为了不被干扰,要关中断。

使用特权

评论回复
20
jing43| | 2016-9-17 09:55 | 只看该作者
七颗咖啡豆 发表于 2016-9-14 17:08
做实验仅仅只跑一个串口,更高的波特率都没有问题。

我测试板上跑了两个串口,一个是芯片硬件串口,转换成 485 ,另一个是模拟串口,接USB转串小工具到电脑。第一个测试,电脑 232 转 485 连接到测试板 485,电脑一个串口发,另一个串口收,这样没有出现错误。
另一个测试,测试板 485 接带 485 的设备,用电脑给 485 设备更新程序,这时我的测试板做数据透传,两个串口一个收到,就从另一个发出。这个测试发现通信依然稳定。这个测试的数据量比较大,要求数据全部要正确。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

51

主题

508

帖子

4

粉丝