打印

求助:多USART(1~3) RX数据时间同步问题

[复制链接]
3545|13
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
lai832|  楼主 | 2012-3-23 09:25 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 lai832 于 2012-3-23 11:56 编辑

程序还在写中,遇到以下问题还没找到(确定)实质处理方式.

情况:
多USART接收连续数据(9600~1843200可选),数据格式固定,8位*6,并有两位是固定值.

主程序主要流程:

收数据---->数据格式判断和时间同步判断(是否同一时间收到的)---->计算1(数据线性转换,三值运算等)---->计算2(值转DA格式)---->判断与输出(DA.显示.UART----这个UART不考虑同步问题)----->收数据

主要问题:(第二步)
如何判断数据在同一时间收到的(时间相差1~3位也可以).

考虑:
1. 3个RX使用DMA------还在考虑使用多少位问题,如果只使用6位,怕掉数据否,6*N倍,完成一个循环的间隔过长,不过这个可以调试时解决.

2. 将DMA收到的数据转到BUFFER二维数组连接,处理对齐问题(开始位,结束位),并给标识第N次存入BUFFER(次数差不大于1可认为同步: buffer[2][x], buffer[0][x]放各位数据,buffer[1][x]放各位数据对应的N)------buffer[2][x]只是一个通道的,可考虑2*3,或3个buffer

3. 判断各格式,并判断各通道N值的差,将数据放到2维数组,利用行例号同步.(val[m][k],m为通道号,k为同步的数据存放点)

不知方法可行否,或各大虾有没有好的建议

(后加)
注:因为同一时间收到的数据值运算才有意义,所以不会采用并联从机的方式; 因为是连续采样,分步读取从机的方式也不能采用.

如果同示实在困难,也只能放宽少少同步要求:差值可为2,或3.---------差越大,误差越高


DMA是可以同时传输数据的吗?却3个USART.RX 的DMA能同时接收数据吗????
沙发
airwill| | 2012-3-23 09:38 | 只看该作者
用得着这么复杂吗? 一大堆数据计算各种可能性, 不累吗? 不会出错吗?
对于多波特率系统, 应该考虑数据包的同步头字段. 先通知从机波特率.
多 USART 系统,  应该考虑命令ID和数据的识别
另外, 避免过高的总线负荷导致数据混乱.
还需要考虑是主从还是多主机协议, 是否需要仲裁, 避免数据冲突.

使用特权

评论回复
板凳
lai832|  楼主 | 2012-3-23 09:48 | 只看该作者
是的,因为觉得处理起来很累.所以才这样不确定:

首先,从机及其使用情况不允许我:发请求数据指令,得到数据 这样做----这样会丢失太多的采样点
从机工作方式是:采完样,将数据发出-----当然也可以:读一个(发取数据命令),发一个,但采样点降低很多.

不好意思:说明下:一般会考虑各USART设置在同一BAUD下,只是说:可以采用这到多中的一种,没办法这关系的采样速度问题,高要求时设置会高很多)
还有:我的从机没有ID,不能并联使用

使用特权

评论回复
地板
lai832|  楼主 | 2012-3-23 09:52 | 只看该作者
对了:还有个很大的疑问:各DMA能同时工作吗?能同时进数据就行了.

使用特权

评论回复
5
airwill| | 2012-3-23 20:22 | 只看该作者
应该说, 多个 DMA 可以一起设置, 一起工作, 但不能说同时工作. 由于总线某个时间只能传输一个数据.
这只是概念问题. 可以一起工作就是了.

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
lai832 + 1
6
香水城| | 2012-3-24 14:45 | 只看该作者
我有点糊涂,不知道LZ是想讨论DMA还是想讨论收到数据的时间?

使用特权

评论回复
7
lai832|  楼主 | 2012-3-27 10:35 | 只看该作者

其实我两个都想问,DMA是主要问题,

本帖最后由 lai832 于 2012-3-27 10:37 编辑

其实如果能知道收了一次数据后(中断前),能有多少时间给我做别的事,就更好了

不好意思,有两天没上:

主要问题是:3个连接的USART.RX数据输入,3个RX都配为DMA,会不会掉数据??

使用特权

评论回复
8
lai832|  楼主 | 2012-3-27 10:40 | 只看该作者
5# airwill

只能做一件事是知道的,
只是因为USART也不是很快,
就担心是:收完一个(中断后),再收另一个,我就没办法玩了.
只要:收一个通道的一位(两位...),接着收另一通道的.....循环的做,就好了.

使用特权

评论回复
9
香水城| | 2012-3-27 11:33 | 只看该作者
其实如果能知道收了一次数据后(中断前),能有多少时间给我做别的事,就更好了

不好意思,有两天没上:

主要问题是:3个连接的USART.RX数据输入,3个RX都配为DMA,会不会掉数据?? ...
lai832 发表于 2012-3-27 10:35


不会掉数据。

另一个问题:如果能知道收了一次数据后(中断前),能有多少时间给我做别的事。这要看你下一次数据什么时候来,在下一次数据到来之前的时间都可以做任何事情。

使用特权

评论回复
10
香水城| | 2012-3-27 11:37 | 只看该作者
其实LZ这个题目挺有意思,但可惜你没有描述清楚,没办法深入探讨。

如果能画个图说明就好了,尤其是:多UART是什么意思? 接收连续数据是什么意思?判断数据在同一时间收到的(时间相差1~3位也可以)是什么含义?

使用特权

评论回复
11
lai832|  楼主 | 2012-3-27 15:50 | 只看该作者

STM32.多USART.RX设置DMA问题

本帖最后由 lai832 于 2012-3-27 16:05 编辑

10# 香水城
有个项目:

三个RS422数据采集设备(RS422的数据看最后,是没有中断的,一条接一条):
1.因为数据采集是自动连续的---即,每个RS422上的数据都是连续的(完整的一条数据为:0x11,0xXX,0xXX,0xXX,0x22,0xXX,一条一条首尾相接发送到STM32);所以不能采用并联RS422
2.因为不同的的RS422间要进行运算:如:RS_1+RS_2   等等; 所以对数据有时间同步要求,即同一时间进入USART的数据进行计算,如果这个时间相差越大,误差越大.-----这也是不能采用并联RS422的重要原因之一.
---------------------------------------------------------------------------------------------
系统:
数据采集----USART1,2,3的RX
LED显示----第二版考虑LCD显示
DA输出-----暂时使用DA1,2;   可能要考虑外加一个:SPI的DA,共三个,
逻辑开关输出
按键输入
参数保存-----这部分最后才考虑是外EEPROM还是内FLASH
远程---UART4

数据流向:
USART1--->|
USART2--->|-->24Bit转为float--->求和-->显示--->float转为12Bit--->|-->DA1
USART3--->|                                                                             |-->DA2
-----------------------------------------------------------------------------------------------
程序:
LED---略
逻辑开关输出---略
按键输入---略
远程-----略
流程:
USART1_RX----(DMA)-------->|
USART2_RX----(DMA)-------->|--------->|
USART3_RX----(DMA)-------->|               |
                                                             |
求和-->(按键)-->显示-->12Bit-->DA--> 24Bit-->(求和)

DMA与"求和-->...->DA"并行运行,DA完了,检测三个DMA是否中断,如中断,取数据并将24Bit转为float

因为第一次用STM32,所以有疑问:
1.三个DMA能同时输入数据到内存?
---------详细过程不考虑,但是否三个USART.RX的数据,能通过DMA完整传到内存不?
2.三个DMA通道工作,对于下面(指:求和-->....->DA)的程序运行影响有多大?
---------其实我现在是将DMA理解为多线程的实现方式了,但不管是否是多进程,上面的处理过程是否可行?即:等待DMA收数据时,CPU给安排去处理"求和-->....->DA"了.


---------------------------------------------------------------------------------------------
时间差1~3是指:三个USART的.RX不可能同时0x11通过DMA进入内存,所以一定要有个连接BUFFER,
处理起来就可能有个错位,即时间同步可以允许的差最大是多少,最好最多能只差1条数据,最多不超3条,不过这个问题应该不大.

数据采集设备输出:
0x11,0xXX,0xXX,0xXX,0x22,0xXX,0x11,0xXX,0xXX,0xXX,0x22,0xXX,0x11,0xXX,0xXX,0xXX,0x22,0xXX,0x11,0xXX,0xXX,0xXX,0x22,0xXX,0x11,0xXX,0xXX,0xXX,0x22,0xXX,0x11,0xXX,0xXX,0xXX,0x22,0xXX,0x11,0xXX,0xXX,0xXX,0x22,0xXX,.................
0x11为一条数据的开头,(0x22,0xXX)为一条数据结尾,最后一个0xXX为异或码)



三个RS422,分别接到:STM32F103VET的:USART1,2,3

使用特权

评论回复
12
lai832|  楼主 | 2012-3-27 16:12 | 只看该作者
上楼的问题可能与原问题有所不一样了,
但根本问题还是:
三个DMA处理三个USART.RX的数据进入内存,是否能同时进入.并同时中断(在整条6个8位数据上看).
如果可以,这时读到的三条数据为:时间同步的数据.

使用特权

评论回复
13
香水城| | 2012-3-27 18:26 | 只看该作者
首先一点,如果你的三路数据是同步到达的,那么STM32的三路USART就可以正确无误地接收下来,DMA是用来把USART收到的数据传送到内部RAM中。

其次,三路USART是并行地接收三路不同的数据,虽然三路DMA不是并行地执行数据传送,但因为USART的内部缓冲,数据不会丢失。

第三,每个DMA通道传送数据结束,都会产生一个中断,因为三路DMA不是并行地执行数据传送,所以三路DMA的数据传送结束中断不会同时到来,又因为三路DMA的工作顺序不可预测,所以没人知道哪个DMA的中断先来,哪个后来,因此你自己需要通过其他途径判断三路数据全部完成传送后(例如对中断次数计数),再开始进行相应的计算。

至于时间是否来得及,我们可以做一个简单的计算:
假设CPU时钟频率为72MHz,按照你要求的最大USART速率1843200Hz计算,如果每个USART字为10位(1个起始位、8个数据位、1个停止位),则一条数据需要的时间是:
    72,000,000 / 1,843,200 * 10 * 6 ≈ 2343 时钟周期
DMA每传送一个数据字需要8~12个周期,如果按照最慢的12周期计算,每条数据需要:
    12 * 6 = 72 时钟周期
三路USART则需要 72 * 3 = 216 时钟周期
算上其他一些进出中断的开销,你应该还有大约2000时钟周期的时间,进行显示、求和、DA输出等操作。

你自己需要计算那些显示、求和、DA输出等操作需要多少时间,看看能不能在2000时钟周期以内完成。我只能说STM32的USART与DMA配合,可以实现你的要求,剩下的就是你自己其他程序部分的工作量多少的问题。

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
8103abc + 1 学习了
14
lai832|  楼主 | 2012-3-28 08:54 | 只看该作者

(还不会玩评分系统,在弄中)

本帖最后由 lai832 于 2012-3-28 08:59 编辑

谢谢,这是我要的答案,

第一点:
这点就是用DMA的原因
第二点:
是并行就好,我要的就是这个.  在BUFFER的内容倒不担心丢失.主要是担心其它程序时间过长,读BUFFER速度跟不上而已(当然,后面你也给出了计算方法)
第三点:
中断先后没关系(差一两个字,不能相差整条数据),这也是不可能去控制到来的先后的.

关于后面的时间:
这是确认了前面内容后,最需要的了.
按照计算,可能我要将最高的波特率降低才行了,
因为计算量有点大,
甚至连显示的时间都看看能否节约出来了(也可能得考虑用DMA了).

使用特权

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

本版积分规则

19

主题

879

帖子

3

粉丝