16868|19

59

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

配置DMA中断接收串口数据,出现最后一个字节数据问题 [复制链接]

                                 我在主板用DMA循环模式配置DMA中断接收USART的数据.databuffersize 配置为15个字节.采集模块接收到主板发送的命令后以固定的数据桢15个字节上传数据,在DEBUG中调试发现有时出现数据最后一个字节或2个字节乱码,造成数据错误,如果不用DMA方式而用USART串口中断接收数据则正确,这样说明下位机上传数据程序正确,但用DMA模式则会出现最后字节乱码问题,不知道什么原因.现在我用了一个被动解决方法就是DMA配置17个字节,下位机上传数据也用17个字节,然后在主程序中舍弃最后2个字节.只是利用了有效的15个字节.奇怪为什么会出现最后1或2字节数据错误的问题呢?
此帖出自stm32/stm8论坛

最新回复

                                     详情 回复 发表于 2009-2-20 10:08
点赞 关注
 

回复
举报

85

帖子

0

TA的资源

一粒金砂(初级)

沙发
 

是否你在上一次最后一个字节还没有送出前,就更换了缓冲

                                 看看错误是否有规律
此帖出自stm32/stm8论坛
 
 

回复

70

帖子

0

TA的资源

一粒金砂(初级)

板凳
 

有时是正确的,用15个字节的话我的后两个字节是校验,数据会

我是DMA中断程序中把缓冲区的内容读给另外开辟的一段数据空间,DMA中断程序
void DMA1_Channel6_IRQHandler(void)
{   u8 i;
   if(DMA_GetITStatus(DMA1_IT_TC6))
   { DMA_ClearITPendingBit(DMA1_IT_GL6);
     UartHaveData2=1;
     USART_ClearITPendingBit(USART2,USART_IT_RXNE);
     for(i=0;i<=12;i++)
     RxBuffer2=Receive_data;
   // ceshi++;
   }  
}
此帖出自stm32/stm8论坛
 
 

回复

67

帖子

0

TA的资源

一粒金砂(初级)

4
 

DMA中断程序

void DMA1_Channel6_IRQHandler(void)
{   u8 i;
   if(DMA_GetITStatus(DMA1_IT_TC6))
   { DMA_ClearITPendingBit(DMA1_IT_GL6);
     UartHaveData2=1;
     USART_ClearITPendingBit(USART2,USART_IT_RXNE);
     for(i=0;i<=14;i++)
     RxBuffer2=Receive_data;
   // ceshi++;
   }  
}
DMA配置程序
void DMA_Configuration(void)
{
  DMA_InitTypeDef DMA_InitStructure;
  /* DMA Channel6 (triggered by USART2 Rx event) Config */
  DMA_DeInit(DMA1_Channel6); 
  DMA_InitStructure.DMA_PeripheralBaseAddr = USART2_DR_Base;
  DMA_InitStructure.DMA_MemoryBaseAddr = (u32)Receive_data;
  DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;
  DMA_InitStructure.DMA_BufferSize =15;
  DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
  DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
  DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;
  DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;
  DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;
 // DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;
  DMA_InitStructure.DMA_Priority = DMA_Priority_VeryHigh;
  DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
  DMA_Init(DMA1_Channel6, &DMA_InitStructure);

 DMA_ITConfig(DMA1_Channel6,DMA_IT_TC,ENABLE);
}
此帖出自stm32/stm8论坛
 
 
 

回复

89

帖子

0

TA的资源

一粒金砂(初级)

5
 

请斑竹分析下可能的原因

                                 下位机上传数据给主机是在主机DMA中断程序中接收完数据后才允许下面发数据
此帖出自stm32/stm8论坛
 
 
 

回复

71

帖子

0

TA的资源

一粒金砂(初级)

6
 

请具体说明你的操作步骤,按照1、2、3

                                 各个步骤之间的时间关系如何?
此帖出自stm32/stm8论坛
 
 
 

回复

60

帖子

0

TA的资源

一粒金砂(初级)

7
 

步骤

1:用定时器定时10ms发数据桢给下为机,通讯速率57600通过串口2。发送使用查询模式发送。
2:发送完毕后,主机转为接收数据,接收完毕后置接收数据成功标志1,然后进行数据处理。如果数据有错误丢弃数据。
3:在数据发送模块中只要有数据成功接收标志,然后定时时间到就发送数据给下位机。整个网络是485,大概有14个下位机模块。
4:主机接收用DMA循环模式
此帖出自stm32/stm8论坛
 
 
 

回复

62

帖子

0

TA的资源

一粒金砂(初级)

8
 

确认一下,你的所谓主机是否就是STM32?看起来是这样

根据你的描述,似乎不应该使用DMA循环模式。请看STM32技术参考手册中9.3.3节有关循环模式的说明:“当启动了循环模式,数据传输的数目变为0时,将会自动地被恢复成配置通道时设置的初值,DMA操作将会继续进行。”

现在的问题是,当接收数据传输的数目变为0时,而下位机又没有上传数据时,你是如果处理接收通道的?——关闭?保持开启?遇到干扰信号怎么办?


另外,如果使用DMA循环模式,当数据传输出现错误时,比如丢失一个字节,你的所有下位机上传数据将会错位(即收到数据包的最后一个字节始终是下个数据包的第一个字节)。

此帖出自stm32/stm8论坛
 
 
 

回复

67

帖子

0

TA的资源

一粒金砂(初级)

9
 

主机是STM32

主机是STM32103vbt6,从机是101的,我描述的是功能的一部分,斑竹所言极是。我是第一次使用STM32,很多是在调试过程。从项目目前感觉STM32功能的确不错。还有我问的定时中断可以放多少全局变量问题,可能担心溢出。我又会到原来使用FREESCALE 和8位单片机的思维吧。
现在系统主从通讯可以自由通讯,主机还要使用MODBUS协议和上位机通讯利用串口1,通讯很好断线可以自动恢复,但主从模式所用的串口2原来利用中断USART2接收程序也无问题,只是现在系统功能块所添加的越来越多,怕频繁中断耽误系统进程,所以我就用 DMA中断接收,从实验室多日测试看用循环模式无问题,当接收数据传输的数目变为0时,而下位机又没有上传数据时,你是如果处理接收通道的?我处理是这样当DMA中断 后数据传输给另外数据缓存,然后就继续开启DMA中断,当然遇到干扰信号,舍弃校验码不对的数据。
下位机上传数据长度是固定的。
如果使用DMA循环模式,当数据传输出现错误时,比如丢失一个字节,你的所有下位机上传数据将会错位(即收到数据包的最后一个字节始终是下个数据包的第一个字节)。所言极是,这个问题真没仔细考虑,原来是利用类MODBUS判断数据祯的结束。但定时器我用的差不多了,需要模拟许多PWM信号,还有电机信号的转速测试。
斑竹有何更好的方案,难道我要利用一个定时器判断是否数据祯超时?
此帖出自stm32/stm8论坛
 
 
 

回复

72

帖子

0

TA的资源

一粒金砂(初级)

10
 

从通讯的健壮性和出现故障可以自由恢复,斑竹有无更好提

                                 STM32以后是我设计产品的主打产品,第一次使用实话一个字赞从性价比来说,我原来论坛问的一个问题说是NRST脚电压是2.0v,而VDD是正常,故障原因在万利帮助下已经找到,是外围的一个74LV07损坏,导致5V的电压可能加到STM32的IO导致内部电压紊乱了吧,奇怪的是STM32的模拟和数字电压都是正常只是复位电压不正常。
此帖出自stm32/stm8论坛
 
 
 

回复

78

帖子

0

TA的资源

一粒金砂(初级)

11
 

我所做的项目是个出口机器产品使用

                                 一个机器上面使用STM32大概17片,原来设计选型芯片的时候舍弃自己一惯使用的16位单片机,听了广州研讨会才了解这个芯片,调试进入尾声。现在是修补阶段,所以有些调试的时候问题也困惑着我,多些斑竹的回答,斑竹是我感觉21IC上支持很好的,不过感觉贵公司的各地办事处还有代理商支持力度要加大,很多生意都是从小到大的,目的只有双赢
此帖出自stm32/stm8论坛
 
 
 

回复

73

帖子

0

TA的资源

一粒金砂(初级)

12
 

斑竹回应下,谢谢了

                                  
此帖出自stm32/stm8论坛
 
 
 

回复

92

帖子

0

TA的资源

一粒金砂(初级)

13
 

建议不要循环模式

                                  
此帖出自stm32/stm8论坛
 
 
 

回复

70

帖子

0

TA的资源

一粒金砂(初级)

14
 

或者一个字节就DMA中断一起。

                                  
此帖出自stm32/stm8论坛
 
 
 

回复

80

帖子

0

TA的资源

一粒金砂(初级)

15
 

一个字节就中断一次影响了MCU的效率

                                 如果一个字节就中断一次,那用DMA的优势就发挥不了,和别的单片机串口中断就无区别。
此帖出自stm32/stm8论坛
 
 
 

回复

68

帖子

0

TA的资源

一粒金砂(初级)

16
 

15个中断一次没问题。

DMA中断,并停止DMA工作。这时如果有数据发送到串口呢?会不会?

建议不要用循环模式,循环什么环啊,如果循环,数据已经是无效了啦。
还有啥意思?

串口、DMA没啥好说的了。楼主慢慢玩!


此帖出自stm32/stm8论坛
 
 
 

回复

62

帖子

0

TA的资源

一粒金砂(初级)

17
 

DMA中断中不会有串口接受数据

                                 DMA中断中接收完一祯数据然后置发送数据允许,只有定时时间到和发送允许数据允许后,向下位机发送数据然后主机才DMA接收数据
此帖出自stm32/stm8论坛
 
 
 

回复

73

帖子

0

TA的资源

一粒金砂(初级)

18
 

“向下位机发送数据然后主机才DMA接收数据”,这是如何控

也就是说你是如何控制让主机在向下位机发送数据时不执行DMA接收数据
此帖出自stm32/stm8论坛
 
 
 

回复

64

帖子

0

TA的资源

一粒金砂(初级)

19
 

当下位机在接收完主机的数据祯后才向上发数据

                                 下位机判断数据正确后才向上发数据
此帖出自stm32/stm8论坛
 
 
 

回复

63

帖子

0

TA的资源

一粒金砂(初级)

20
 

我问的是主机如何控制

                                  
此帖出自stm32/stm8论坛
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表