打印

建议STM32的芯片加上串口超时功能,很好用的一个功能

[复制链接]
楼主: cecoyzy
手机看帖
扫描二维码
随时随地手机跟帖
21
cecoyzy|  楼主 | 2008-6-10 21:09 | 只看该作者 回帖奖励 |倒序浏览

其实STM32也有其优势

其实STM32也有其优势:
IO脚比流明的要多,引脚排列规则一些;
个人觉得:在不需要UART的地方都用STM32,其他另考虑

使用特权

评论回复
22
香水城| | 2008-6-10 22:45 | 只看该作者

呵呵,好像没有FIFO STM32的UART还不能用了

“其实STM32也有其优势.......在不需要UART的地方都用STM32”,这是不是说没有FIFO的UART很不好用?

试想要传送100个字节,如果通过一个深度为16字节的FIFO,则至少要中断7次才能传送100个字节;如果使用DMA,则只需在传送结束时中断一次。哪个更高效?


对于Modbus RTU这样的协议,使用DMA也不会比使用FIFO效率低:

Modbus的请求数据包都是由下面几部分构成:
一、从机地址;固定为一个字节
二、功能代码;固定为一个字节
三、功能参数;长度依不同功能代码而不同
四、数据域;长度在功能参数中定义
五、校验码;固定为两个字节

下面以功能代码=0x03的数据包交换说明如何使用STM32进行数据传送:
1、主机发送8字节:
  从机地址:  1字节
  功能代码:  1字节 = 0x03
  起始地址:  2字节
  读取数目:  2字节 = N
  CRC校验码: 2字节
2、从机先接收2字节,当得知功能代码为0x03时,再继续接收6个字节
3、从机发送 N*2+4字节 = (1字节功能码+1字节数据长度+N*2字节数据+2字节校验码)
4、主机接收从机发出的(N*2+4)字节数据。因为主机知道N的数值,所以主机知道从机响应的数据包的长度

这里可以看到,如果没有FIFO,需要在上述第2阶段从机接收主机请求时分为两个步骤进行;而在其他的阶段使用DMA的效率不比使用FIFO差,而且在第4阶段,如果数据包长度大于FIFO深度时,使用DMA的效率更高!

使用特权

评论回复
23
席君秋| | 2008-6-10 22:53 | 只看该作者

16楼的说法,只用一路串口当然没啥啦

你试试把STM32的5路UART串口同时用上吧。
38400的波特率。

另,赞同23楼 徐兄的说法。
×××××××××××××××××××××××××××××××××
 netjob 发表于 2008-6-10 18:12 ST MCU ←返回版面    

21楼: 没有 FIFO 问题是不是很严重? 

我得ARM7系统,不管是ATMEL还是NXP的都只使用了FIFO 一个字节中断。也没问题。

如果用【9600】 BPS. 则大若是  【1】毫秒 中断一次!
中断程序耗时大概是 【0.5】 微妙吧!

如果是16字节的FIFO. 最多是 【16】毫秒中断一次! 
××××××××××××××××××××××××××××××××× 

使用特权

评论回复
24
香水城| | 2008-6-10 23:04 | 只看该作者

俺对Modbus不熟悉,请问Modbus最高波特率是多少?

Modbus的最高波特率能达到38400?难道你真有必要多路UART在同一时刻同时多路传输不定长数据包?

凭空理论上讨论没有意义,能否给个具体实例,我帮你分析如何实现,我可不想过多的进行这种纸上谈兵。

使用特权

评论回复
25
tdh03z| | 2008-6-10 23:13 | 只看该作者

你们用过luminary的串口FIFO吗??

最近在用LM3S8962,上个星期写串口程序

呵呵,有周立功的例子及LM的库文件确实方便,可利用串口中断实现发送和接收时,发现FIFO不好用哦,程序发和收数据都用了FIFO方式

发送数据时,主程序中启动发送并填充发送FIFO,后续数据由发送中断完成填充,利用一个全局变量记录发送中断此数,看看发送一帧数据到底发生了几次发送中断,可惜每次读出的值不太一致,不过总的来说发送FIFO还是起作用了。

接收数据时,利用接收中断读取接收FIFO,在接收中断中开启了超时中断,利用两个全局变量分别记录接收中断和超时中断次数,结果是两个中断次数加起来等于我接收到的数据个数,也就是说接收FIFO根本没起到作用啊,设置了不同的接收FIFO深度,都一样,只是超时中断及接收中断次数变化了,但两个之后还是没变,真是晕,利用的是例子程序哦。

不知是咋回事,难道那个地方没注意。

使用特权

评论回复
26
makesoft| | 2008-6-11 13:00 | 只看该作者

28楼:关键是你没有延时无法判断什么时候是一个帧的开始和

使用特权

评论回复
27
ijk| | 2008-6-11 13:56 | 只看该作者

STM32的5路UART串口 & 38400的波特率

  同时用上STM32的5路UART串口,即使都使用38400的波特率,会消耗多少STM32的CPU资源?
  即使在最耗CPU的接收阶段,我看也耗不了多少资源:总共约等效于200k的波特率,消耗STM32的CPU资源 < 5%(或许 < 2%),有必要那么担心吗?

使用特权

评论回复
28
栏杆| | 2008-6-12 16:08 | 只看该作者

没有硬超时算是遗憾,谈谈我以前玩串口的感受

两个独立的设备用串口通信进行互联,可能发生一切状况,唯一的两边都可以独自判断的物理条件,就是时间了。
----用老铁路的话来说:耗子把线咬来吃了,小偷把线偷去卖了咋办。

我对高可靠性串口通信的一个基本总结就是:各自安装自己的“超时闸门”,过时不候,判故障。串口在一个系统里可以多到多少?----MOXA有256口的串口卡!

对以实现一个健壮的、可自我恢复的、故障隔离的集散式串口通信网络来说,这个是非常重要、必须的。如果有硬件超时,当然可以从中受益匪浅,以前用51和PC上basic搞的系统,还不是只有软件来实现“时间闸门”。

使用特权

评论回复
29
cecoyzy|  楼主 | 2008-6-12 18:15 | 只看该作者

回楼主:

如果主机需要接收10字节,而实际上由于不可预测原因,只受到9字节,程序是傻等待呢?
以前用51做东西的时候最头疼的就是这点,我的做法就是每隔一段时间就检查接收计数器的数量,如果前后相等则认为是超时了,然后开始下一帧数据的接收。在用了ARM7的超时功能以后才发现有如此简洁的办法,更主要是通讯的交换速率提高了。
凭心而论STM32是个好芯片,特别是开漏可以输出5V,LM的只能到4V。
如果STM32的DMA和串口接收超时能同时具有那就太好了,不知道是设计的时候考虑步周呢还是成本的问题。

使用特权

评论回复
30
cecoyzy|  楼主 | 2008-6-12 18:26 | 只看该作者

错了,应该是回版主

使用特权

评论回复
31
香水城| | 2008-6-12 19:04 | 只看该作者

回楼上:STM32的UART具有错误检测功能

“如果主机需要接收10字节,而实际上由于不可预测原因,只受到9字节,程序是傻等待呢?”

只要从机发出了这10个字节,通常不会完全收不到,但有可能某个字节被干扰破坏;STM32的UART具有错误检测功能,可以检测各种错误,包括奇偶校验错、帧错误、噪声错误等,当使用DMA传输时,任一种错误都会产生中断。

对于从机中途出故障的情况更容易处理,只需通过一个定时器在第一个字节到达后开始计时,或按照我在下面帖子中6楼所描述的方法解决:请教Modbus高手makesoft:实现Modbus协议一定需要超时检测吗?
 

当然,有硬件的超时功能当然好,但没有硬件的功能时,多数情况下也可以通过一些软件的方法解决。

使用特权

评论回复
32
栏杆| | 2008-6-12 19:11 | 只看该作者

偶现在用的LPC2194

定时器干PWM去了,哇!只好把PWM的中断来生成系统滴答了! 好悲痛哦,盼STM32好啊,最后还是计划用这个的,LPC来得快------抄代码容易些,先把项目进度顶上再说了。

使用特权

评论回复
33
栏杆| | 2008-6-12 19:15 | 只看该作者

回香版:

通信协议一般不要使用奇偶校验----------------------------如果你在某些情况下需要使用商用调制解调器就知道, 都不支持11位的。

“帧错误”是什么意思?硬件检错?

使用特权

评论回复
34
cecoyzy|  楼主 | 2008-6-12 19:44 | 只看该作者

回版主:

用STM32的DMA串口接收数据时,如果没有达到设定的接收数量时,能读出已经接收的数据数量吗?
其实我很想应用STM32!!!

使用特权

评论回复
35
香水城| | 2008-6-12 20:33 | 只看该作者

STM32的DMA寄存器中有一个计数器,数据传输时随时变化

读取这个寄存器的值即可知道还有多少数据未传输完。

这个寄存器的名字是:DMA_CNDTR,详见STM32技术参考手册。

使用特权

评论回复
36
cecoyzy|  楼主 | 2008-6-12 22:09 | 只看该作者

回版主:

能读出数量,那就间隔读取并判别长度变化
试验中...

使用特权

评论回复
37
香水城| | 2008-6-13 09:41 | 只看该作者

没有QQ,也不做单独辅导,有问题在论坛讨论吧

这样既可以留个记录,也可以让更多人受益。

使用特权

评论回复
38
zhiwei| | 2008-6-13 21:13 | 只看该作者

间隔时间判断超时是可行的

没mS读取一下FIFO深度,如果连续4~5mS该值没有变换,可以认为是MODBUS帧结束。然后就停止接收,开始解析数据帧。
有硬件结束判断的好处就在于,连续多长字符时间内无新数据接收,UART即可中断,省掉了主程序轮询是否无新数据接收。

使用特权

评论回复
39
cecoyzy|  楼主 | 2008-6-13 21:21 | 只看该作者

我现在就是在UCOS2下的:

我现在就是在UCOS2下的:
每隔2MS检测一下DMA接收计数器的数量,如果相等则认为是一帧数据
另外香主说的IDIE的检测没有试验成功,期待香主示意 ...

使用特权

评论回复
40
香水城| | 2008-6-13 21:33 | 只看该作者

“IDLE的检测没有试验成功”是什么意思?

是没有收到IDLE中断还是收到了中断但数据帧还没有结束?

使用特权

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

本版积分规则