llq_ARM 发表于 2014-6-23 10:53:34

STM32+uCOS +IO模拟10路串口好不好做

因为产品要10路串口通信,STM32最多提供了5路串口,需要另外模拟10路,我的想法是IO+定时器来做
思路:发送的时候简单,波特率是4800,定时中断时间是1/4800 S,在中断服务函数中发送bit ,接收貌似麻烦一些,可以采用外部中断引脚来识别起始位的到来,否则就要一直查询,CPU太累了,{:titter:} 识别了起始位,就可以用定时器的中断服务函数进行接收管脚的采样,大伙看看方便实现吗

nongxiaoming 发表于 2014-6-23 10:57:37

楼主可以看看LPC43xx系列或LPC185x系列的,上面有个SGPIO可以很容易实现串口,而且是不耗多少cpu的,可以扩展出很多串口。SGPIO还可以做其他事情哦,不只是串口。

takashiki 发表于 2014-6-23 10:59:26

波特率都是固定4800用一个定时器自由计数就够了,IO只需要有上升下降中断就行了,是所有位而不仅仅是起始位。不查询,每一次中断的时间和前一次进行比较就知道该电平接受了几位了。

llq_ARM 发表于 2014-6-23 11:00:42

nongxiaoming 发表于 2014-6-23 10:57
楼主可以看看LPC43xx系列或LPC185x系列的,上面有个SGPIO可以很容易实现串口,而且是不耗多少cpu的,可以扩 ...

还有这么高级的东西,能否筹够10路UART吗,和硬件串口实现起来有什么区别

llq_ARM 发表于 2014-6-23 11:03:44

takashiki 发表于 2014-6-23 10:59
波特率都是固定4800用一个定时器自由计数就够了,IO只需要有上升下降中断就行了,是所有位而不仅仅是起始位 ...

如果都靠IO外部中断的话,如果我接收的是0X00或者0XFF,那么一个字节都不会有IO翻转,那么就不存在上升和下降中断,实现不了接收,必须识别起始位,然后定时采样

3DA502 发表于 2014-6-23 11:07:59

用富士通的,大部分自带8路串口,个别型号自带14路

TI的流明也是自带10路,不过TI好像不做这个市场了

takashiki 发表于 2014-6-23 11:15:13

llq_ARM 发表于 2014-6-23 11:03
如果都靠IO外部中断的话,如果我接收的是0X00或者0XFF,那么一个字节都不会有IO翻转,那么就不存在上升和 ...

0X00或者0XFF的位翻转你自己都能模拟串口了这个还会不懂?起始位是0,停止位是1,就决定了一个数据帧必定会进行翻转。
按8N1的方式:
0x00:111111(总线空闲) 0(起始位) 00000000 1(停止位)111111111(总线空闲),看到没有,从前一次下降沿到后一次上升沿一共经历了9个位时间,最好采集了。
0xFF:111111                   0                11111111 1               111111111,只经历了1位的起始位,照样可以采集出来。整个一个字节还需要配合超时。
要是设置了校验位甚至连超时都不需要,全1的那是空闲帧,全0的那是断开帧,都不是有效的数据帧……

HadesHe 发表于 2014-6-23 11:25:44

记住GM8125

llq_ARM 发表于 2014-6-23 11:38:55

takashiki 发表于 2014-6-23 11:15
0X00或者0XFF的位翻转你自己都能模拟串口了这个还会不懂?起始位是0,停止位是1,就决定了一个数据帧必定 ...

感谢这位朋友的耐心解答,我的意思是总线空闲1,起始位0,那么接收0xf0,总线的状态应该是start(0) data(11110000) end(1) IO中断能够识别start(0) ,data(11110000)的采样需要用到定时周期采样,采样的结果是11110000,你的你的意思是不用定时采样也能实现??

llq_ARM 发表于 2014-6-23 11:40:12

3DA502 发表于 2014-6-23 11:07
用富士通的,大部分自带8路串口,个别型号自带14路

TI的流明也是自带10路,不过TI好像不做这个市场了 ...

看看去,有没有具体型号

lyzhangxiang 发表于 2014-6-23 11:40:51

fm3确实基本上都是8路uart也蛮便宜的,推荐使用

jackiezeng 发表于 2014-6-23 11:44:07

我感觉你很难实现,,还不如用FPGA,,

takashiki 发表于 2014-6-23 11:52:02

llq_ARM 发表于 2014-6-23 11:38
感谢这位朋友的耐心解答,我的意思是总线空闲1,起始位0,那么接收0xf0,总线的状态应该是start(0) data(1 ...

是的,可以实现,但是串口接收的协议不好做。
实际上,只通过边沿中断可以采样到起始位0,然后4位1,然后4位0,然后通过超时可以算出停止位。
问题是,你会不会把后来采集到的4个0当做起始位这是你自己需要关注的事情了,我只能保证仅仅通过中断和超时完全可以采集到你所需要的数据。
为什么可以做到,是因为你的波特率固定在4800,时基是确定的。如果波特率可变,就稍微麻烦一些。
要是波形的毛刺多,我这个方法就不合适了,只能老老实实的按规矩定时采样了。

bbs2009 发表于 2014-6-23 11:54:39

xf331785508 发表于 2014-6-23 16:30:45

五路串口,分时复用即可。主从分址,按址取数!

bitter 发表于 2014-6-24 07:49:39

那个叫alphascale的不是带10个uart吗?非广告贴。
楼主坛子里搜一下

ilan2003 发表于 2014-6-24 07:58:28

用两个64脚的stm32来做

zhiwei 发表于 2014-6-24 07:58:55

你另外的任务多吗?接收中断应该至少3x比特率或4x,以提高准确性。4800bps也不算高。中断可以统一读取,比如连续5个中断读取后,任务中循环5次处理就可以了。

iwqt1983 发表于 2014-6-24 07:59:20

Atmel也有多个自定义串口功能的IO,模拟的太消耗资源了.不如直接用FPGA或是CPLD来做串口

iwqt1983 发表于 2014-6-24 07:59:44

用SPI扩展多路串口芯片也可以的

yht0312 发表于 2014-6-24 08:04:35

如果你的STM32是主控端,串口协议采用轮询模式,那就直接用电子开关将某些串口复用就行了,我原来一个设备也是需要很多串口,我的机器是主控,采用轮询机制,用CD4052扩了4个串口。

LingYi 发表于 2014-6-24 08:34:44

为什么不直接用串口IC?或者用CPLD?非要模拟串口,然后用光CPU资源。

Auir 发表于 2014-6-24 09:35:48

ASM9260T 现成的10个独立的串口哟。推荐考虑。代码什么的都是齐全的。感兴趣,可以与我签名中的联系方式联系。

myxiaonia 发表于 2014-6-24 12:48:53

有时候讲一讲背景,上下文,有什么不可以呢,怕泄密吗?一上来就是这种高度提炼过的问题,你是想得到这种问题的标准答案吗

luzq217 发表于 2014-6-30 20:23:51

为什么不用串口扩展芯片TL16C554 ?

悟空间 发表于 2014-6-30 21:28:13

确实不好做的。

cwei 发表于 2014-7-1 13:25:29

同样考虑两个方案 多加一个stm32或者ch438芯片,
页: [1]
查看完整版本: STM32+uCOS +IO模拟10路串口好不好做