[STM32F1] 串口数据相互传递的问题

[复制链接]
1208|1
 楼主| chen918912 发表于 2014-8-2 20:39 | 显示全部楼层 |阅读模式
问题描述:
       数据传递方向:PC→STM32 USART1→STM32 USART2→GSM模块→STM32 USART2→STM32 USART1→PC,两串口都采用DMA模式。STM32型号为STM32F103ZET6,GSM模块信号为SIM900A.当PC以120ms的间隔发送AT指令时,返回数据正常如图
120ms.png
                      120ms发送AT指令
当PC以110ms的间隔发送AT指令时,数据不正常,如图:

110ms发送AT指令

110ms发送AT指令

                  110ms发送AT指令
代码如下:
  1. #include "stm32f10x.h"
  2. #include "usart.h"
  3. #include "LCD.h"

  4. u8 DMA1_Channel5_RXBUFF1[Buff_LEN];
  5. u8 DMA1_Channel5_RXBUFF2[Buff_LEN];
  6. u8 DMA1_Channel5_RXBUFF3[Buff_LEN];

  7. u8 DMA1_Channel6_RXBUFF1[Buff_LEN];
  8. u8 DMA1_Channel6_RXBUFF2[Buff_LEN];
  9. u8 DMA1_Channel6_RXBUFF3[Buff_LEN];
  10. u8 DMA1_Channel5_BUFF_FreeStatus=1;
  11. u8 DMA1_Channel6_BUFF_FreeStatus=1;
  12. u8 DMA1_Channel4_TCStatus=1;
  13. u8 DMA1_Channel7_TCStatus=1;
  14. u16 DMA1_Channel5_RX_LEN;
  15. u16 DMA1_Channel6_RX_LEN;

  16. void Periph_RCC_Config(void)
  17. {
  18.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_USART1|RCC_APB2Periph_AFIO, ENABLE);
  19.         RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2,ENABLE);
  20.         RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);
  21. }

  22. void USART_GPIO_Config(void)
  23. {
  24.         GPIO_InitTypeDef USART_GPIO_InitStruct;
  25.         USART_GPIO_InitStruct.GPIO_Pin=GPIO_Pin_2|GPIO_Pin_9;
  26.         USART_GPIO_InitStruct.GPIO_Mode=GPIO_Mode_AF_PP;
  27.         USART_GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;
  28.         GPIO_Init( GPIOA, &USART_GPIO_InitStruct);
  29.         USART_GPIO_InitStruct.GPIO_Pin=GPIO_Pin_3|GPIO_Pin_10;
  30.         USART_GPIO_InitStruct.GPIO_Mode=GPIO_Mode_IN_FLOATING;
  31.         GPIO_Init( GPIOA, &USART_GPIO_InitStruct);       
  32. }


  33. /**************´®¿Ú1ÅäÖú¯Êý****************/

  34. void USART1_Config(void)
  35. {
  36.         USART_InitTypeDef USART1_InitStruct;
  37.         USART_GetFlagStatus(USART1, USART_FLAG_TC);               
  38.         USART1_InitStruct.USART_BaudRate=9600;
  39.         USART1_InitStruct.USART_WordLength=USART_WordLength_8b;
  40.         USART1_InitStruct.USART_StopBits=USART_StopBits_1;
  41.         USART1_InitStruct.USART_Parity=USART_Parity_No;
  42.         USART1_InitStruct.USART_HardwareFlowControl=USART_HardwareFlowControl_None;
  43.         USART1_InitStruct.USART_Mode=USART_Mode_Rx|USART_Mode_Tx;
  44.         USART_Init(USART1, &USART1_InitStruct);
  45.         USART_ITConfig(USART1,USART_IT_IDLE, ENABLE);
  46.         USART_DMACmd(USART1, USART_DMAReq_Rx|USART_DMAReq_Tx, ENABLE);
  47.         USART_Cmd(USART1, ENABLE);
  48. }

  49. /**************´®¿Ú2ÅäÖú¯Êý****************/

  50. void USART2_Config(void)
  51. {
  52.         USART_InitTypeDef USART2_InitStruct;
  53.         USART_GetFlagStatus(USART2, USART_FLAG_TC);       
  54.         USART2_InitStruct.USART_BaudRate=9600;
  55.         USART2_InitStruct.USART_WordLength=USART_WordLength_8b;
  56.         USART2_InitStruct.USART_StopBits=USART_StopBits_1;
  57.         USART2_InitStruct.USART_Parity=USART_Parity_No;
  58.         USART2_InitStruct.USART_HardwareFlowControl=USART_HardwareFlowControl_None;
  59.         USART2_InitStruct.USART_Mode=USART_Mode_Rx|USART_Mode_Tx;
  60.         USART_Init(USART2, &USART2_InitStruct);
  61.         USART_ITConfig(USART2,USART_IT_IDLE, ENABLE);
  62.         USART_Cmd(USART2, ENABLE);
  63.         USART_DMACmd(USART2, USART_DMAReq_Rx|USART_DMAReq_Tx, ENABLE);
  64. }

  65. /*************ÖжÏÅäÖú¯Êý*****************/

  66. void NVIC_Config(void)
  67. {
  68.         NVIC_InitTypeDef NVIC_InitStruct;
  69.         NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
  70.        
  71.         NVIC_InitStruct.NVIC_IRQChannel=USART1_IRQn;
  72.         NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority=0;
  73.         NVIC_InitStruct.NVIC_IRQChannelSubPriority=0;
  74.         NVIC_InitStruct.NVIC_IRQChannelCmd=ENABLE;
  75.         NVIC_Init(&NVIC_InitStruct);
  76.        
  77.         NVIC_InitStruct.NVIC_IRQChannel=USART2_IRQn;
  78.         NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority=0;
  79.         NVIC_InitStruct.NVIC_IRQChannelSubPriority=1;
  80.         NVIC_InitStruct.NVIC_IRQChannelCmd=ENABLE;
  81.         NVIC_Init(&NVIC_InitStruct);
  82.        
  83.         NVIC_InitStruct.NVIC_IRQChannel=DMA1_Channel4_IRQn;
  84.         NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority=1;
  85.         NVIC_InitStruct.NVIC_IRQChannelSubPriority=0;
  86.         NVIC_InitStruct.NVIC_IRQChannelCmd=ENABLE;
  87.         NVIC_Init(&NVIC_InitStruct);
  88.        
  89.         NVIC_InitStruct.NVIC_IRQChannel=DMA1_Channel7_IRQn;
  90.         NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority=1;
  91.         NVIC_InitStruct.NVIC_IRQChannelSubPriority=1;
  92.         NVIC_InitStruct.NVIC_IRQChannelCmd=ENABLE;
  93.         NVIC_Init(&NVIC_InitStruct);
  94. }

  95. void DMA1_Channel4_Config(void)
  96. {
  97.         DMA_InitTypeDef DMA_InitStructure;
  98.         DMA_DeInit(DMA1_Channel4);
  99.         DMA_InitStructure.DMA_PeripheralBaseAddr=(u32)&USART1->DR;
  100.         DMA_InitStructure.DMA_MemoryBaseAddr=(u32)DMA1_Channel6_RXBUFF1;
  101.         DMA_InitStructure.DMA_DIR=DMA_DIR_PeripheralDST;
  102.         DMA_InitStructure.DMA_BufferSize=Buff_LEN;
  103.         DMA_InitStructure.DMA_PeripheralInc=DMA_PeripheralInc_Disable;
  104.         DMA_InitStructure.DMA_MemoryInc=DMA_MemoryInc_Enable;
  105.         DMA_InitStructure.DMA_PeripheralDataSize=DMA_PeripheralDataSize_Byte;
  106.         DMA_InitStructure.DMA_MemoryDataSize=DMA_MemoryDataSize_Byte;
  107.         DMA_InitStructure.DMA_Mode=DMA_Mode_Normal;
  108.         DMA_InitStructure.DMA_Priority=DMA_Priority_High;
  109.         DMA_InitStructure.DMA_M2M=DMA_M2M_Disable;
  110.         DMA_Init(DMA1_Channel4, &DMA_InitStructure);
  111.         DMA_ITConfig(DMA1_Channel4, DMA_IT_TC,ENABLE);
  112.         DMA_Cmd(DMA1_Channel4, DISABLE);
  113.        
  114. }

  115. void DMA1_Channel5_Config(void)
  116. {
  117.         DMA_InitTypeDef DMA_InitStructure;
  118.         DMA_DeInit(DMA1_Channel5);
  119.         DMA_InitStructure.DMA_PeripheralBaseAddr=(u32)&USART1->DR;
  120.         DMA_InitStructure.DMA_MemoryBaseAddr=(u32)DMA1_Channel5_RXBUFF1;
  121.         DMA_InitStructure.DMA_DIR=DMA_DIR_PeripheralSRC;
  122.         DMA_InitStructure.DMA_BufferSize=Buff_LEN;
  123.         DMA_InitStructure.DMA_PeripheralInc=DMA_PeripheralInc_Disable;
  124.         DMA_InitStructure.DMA_MemoryInc=DMA_MemoryInc_Enable;
  125.         DMA_InitStructure.DMA_PeripheralDataSize=DMA_PeripheralDataSize_Byte;
  126.         DMA_InitStructure.DMA_MemoryDataSize=DMA_MemoryDataSize_Byte;
  127.         DMA_InitStructure.DMA_Mode=DMA_Mode_Circular;
  128.         DMA_InitStructure.DMA_Priority=DMA_Priority_VeryHigh;
  129.         DMA_InitStructure.DMA_M2M=DMA_M2M_Disable;
  130.         DMA_Init(DMA1_Channel5, &DMA_InitStructure);
  131.         DMA_ITConfig(DMA1_Channel5, DMA_IT_TC,DISABLE);
  132.         DMA_Cmd(DMA1_Channel5, ENABLE);
  133. }

  134. void DMA1_Channel6_Config(void)
  135. {
  136.         DMA_InitTypeDef DMA_InitStructure;
  137.         DMA_DeInit(DMA1_Channel6);
  138.         DMA_InitStructure.DMA_PeripheralBaseAddr=(u32)&USART2->DR;
  139.         DMA_InitStructure.DMA_MemoryBaseAddr=(u32)DMA1_Channel6_RXBUFF1;
  140.         DMA_InitStructure.DMA_DIR=DMA_DIR_PeripheralSRC;
  141.         DMA_InitStructure.DMA_BufferSize=Buff_LEN;
  142.         DMA_InitStructure.DMA_PeripheralInc=DMA_PeripheralInc_Disable;
  143.         DMA_InitStructure.DMA_MemoryInc=DMA_MemoryInc_Enable;
  144.         DMA_InitStructure.DMA_PeripheralDataSize=DMA_PeripheralDataSize_Byte;
  145.         DMA_InitStructure.DMA_MemoryDataSize=DMA_MemoryDataSize_Byte;
  146.         DMA_InitStructure.DMA_Mode=DMA_Mode_Normal;
  147.         DMA_InitStructure.DMA_Priority=DMA_Priority_VeryHigh;
  148.         DMA_InitStructure.DMA_M2M=DMA_M2M_Disable;
  149.         DMA_Init(DMA1_Channel6, &DMA_InitStructure);
  150.         DMA_ITConfig(DMA1_Channel6, DMA_IT_TC,DISABLE);
  151.         DMA_Cmd(DMA1_Channel6, ENABLE);
  152. }

  153. void DMA1_Channel7_Config(void)
  154. {
  155.         DMA_InitTypeDef DMA_InitStructure;
  156.         DMA_DeInit(DMA1_Channel7);
  157.         DMA_InitStructure.DMA_PeripheralBaseAddr=(u32)&USART2->DR;
  158.         DMA_InitStructure.DMA_MemoryBaseAddr=(u32)DMA1_Channel5_RXBUFF1;
  159.         DMA_InitStructure.DMA_DIR=DMA_DIR_PeripheralDST;
  160.         DMA_InitStructure.DMA_BufferSize=Buff_LEN;
  161.         DMA_InitStructure.DMA_PeripheralInc=DMA_PeripheralInc_Disable;
  162.         DMA_InitStructure.DMA_MemoryInc=DMA_MemoryInc_Enable;
  163.         DMA_InitStructure.DMA_PeripheralDataSize=DMA_PeripheralDataSize_Byte;
  164.         DMA_InitStructure.DMA_MemoryDataSize=DMA_MemoryDataSize_Byte;
  165.         DMA_InitStructure.DMA_Mode=DMA_Mode_Normal;
  166.         DMA_InitStructure.DMA_Priority=DMA_Priority_VeryHigh;
  167.         DMA_InitStructure.DMA_M2M=DMA_M2M_Disable;
  168.         DMA_Init(DMA1_Channel7, &DMA_InitStructure);
  169.         DMA_ITConfig(DMA1_Channel7, DMA_IT_TC,ENABLE);
  170.         DMA_Cmd(DMA1_Channel7, DISABLE);       
  171. }


  172. /**************´®¿Ú1ÖжϷþÎñ³ÌÐò****************/

  173. void USART1_IRQHandler(void)
  174. {
  175.         __IO        u8 clear;
  176.         if(USART_GetITStatus(USART1,USART_IT_IDLE)!=RESET)
  177.         {
  178.                 DMA_Cmd(DMA1_Channel5,DISABLE);
  179.                 clear=USART1->SR;
  180.                 clear=USART1->DR;
  181.                 switch(DMA1_Channel5_BUFF_FreeStatus)
  182.                 {
  183.                         case 1:
  184.                         DMA1_Channel5_BUFF_FreeStatus=2;
  185.                         DMA1_Channel5->CMAR=(u32)DMA1_Channel5_RXBUFF2;
  186.                         DMA1_Channel7->CMAR=(u32)DMA1_Channel5_RXBUFF1;
  187.                         break;
  188.                         case 2:
  189.                         DMA1_Channel5_BUFF_FreeStatus=3;
  190.                         DMA1_Channel5->CMAR=(u32)DMA1_Channel5_RXBUFF3;
  191.                         DMA1_Channel7->CMAR=(u32)DMA1_Channel5_RXBUFF2;
  192.                         break;
  193.                         case 3:
  194.                         DMA1_Channel5_BUFF_FreeStatus=1;
  195.                         DMA1_Channel5->CMAR=(u32)DMA1_Channel5_RXBUFF1;
  196.                         DMA1_Channel7->CMAR=(u32)DMA1_Channel5_RXBUFF3;
  197.                         break;
  198.                 }
  199.                 DMA1_Channel5_RX_LEN=Buff_LEN-DMA1_Channel5->CNDTR;
  200.                 if(DMA1_Channel5_RX_LEN!=0)
  201.                 {
  202.                         //while(DMA1_Channel7_TCStatus==0);
  203.                         DMA1_Channel7_TCStatus=0;
  204.                         DMA_Cmd(DMA1_Channel7,DISABLE);
  205.                         DMA1_Channel7->CNDTR=DMA1_Channel5_RX_LEN;
  206.                         DMA_Cmd(DMA1_Channel7,ENABLE);
  207.                 }
  208.                 DMA1_Channel5->CNDTR=Buff_LEN;
  209.                 DMA_Cmd(DMA1_Channel5,ENABLE);
  210.         }
  211. }

  212. /**************´®¿Ú2ÖжϷþÎñ³ÌÐò****************/

  213. void USART2_IRQHandler(void)
  214. {
  215.         __IO        u8 clear;
  216.         if(USART_GetITStatus(USART2,USART_IT_IDLE)!=RESET)
  217.         {
  218.                 DMA_Cmd(DMA1_Channel6,DISABLE);
  219.                 clear=USART2->SR;
  220.                 clear=USART2->DR;
  221.                 switch(DMA1_Channel6_BUFF_FreeStatus)
  222.                 {
  223.                         case 1:
  224.                         DMA1_Channel6_BUFF_FreeStatus=2;
  225.                         DMA1_Channel6->CMAR=(u32)DMA1_Channel6_RXBUFF2;
  226.                         DMA1_Channel4->CMAR=(u32)DMA1_Channel6_RXBUFF1;
  227.                         break;
  228.                         case 2:
  229.                         DMA1_Channel6_BUFF_FreeStatus=3;
  230.                         DMA1_Channel6->CMAR=(u32)DMA1_Channel6_RXBUFF3;
  231.                         DMA1_Channel4->CMAR=(u32)DMA1_Channel6_RXBUFF2;
  232.                         break;
  233.                         case 3:
  234.                         DMA1_Channel6_BUFF_FreeStatus=1;
  235.                         DMA1_Channel6->CMAR=(u32)DMA1_Channel6_RXBUFF1;
  236.                         DMA1_Channel4->CMAR=(u32)DMA1_Channel6_RXBUFF3;
  237.                         break;
  238.                 }
  239.                 DMA1_Channel6_RX_LEN=Buff_LEN-DMA1_Channel6->CNDTR;
  240.                 if(DMA1_Channel6_RX_LEN!=0)
  241.                 {
  242.                         //while(DMA1_Channel4_TCStatus==0);
  243.                         DMA1_Channel4_TCStatus=0;
  244.                         DMA_Cmd(DMA1_Channel4,DISABLE);
  245.                         DMA1_Channel4->CNDTR=DMA1_Channel6_RX_LEN;
  246.                         DMA_Cmd(DMA1_Channel4,ENABLE);
  247.                 }
  248.                 DMA1_Channel6->CNDTR=Buff_LEN;
  249.                 DMA_Cmd(DMA1_Channel6,ENABLE);
  250.         }
  251. }

  252. void DMA1_Channel4_IRQHandler(void)
  253. {
  254.         if(DMA_GetITStatus(DMA1_IT_TC4)!=RESET)
  255.         {
  256.                 DMA_ClearITPendingBit(DMA1_IT_TC4);
  257.                 DMA_Cmd(DMA1_Channel4,DISABLE);
  258.                 DMA1_Channel4_TCStatus=1;
  259.         }
  260. }


  261. void DMA1_Channel7_IRQHandler(void)
  262. {
  263.         if(DMA_GetITStatus(DMA1_IT_TC7)!=RESET)
  264.         {
  265.                 DMA_ClearITPendingBit(DMA1_IT_TC7);
  266.                 DMA_Cmd(DMA1_Channel7,DISABLE);
  267.                 DMA1_Channel7_TCStatus=1;
  268.         }
  269. }

  270. /**************±ê×¼º¯ÊýÖØ¶¨Ïò****************/

  271. int fputc(int ch,FILE *f)
  272. {
  273.         USART_ClearFlag(USART1,USART_FLAG_TC);
  274.         USART_SendData(USART1, (unsigned char) ch);
  275.         while(USART_GetFlagStatus(USART1, USART_FLAG_TC)!=SET);
  276.         return(ch);
  277. }
请各位大神帮忙看看到底是什么问题,感谢!


airwill 发表于 2014-8-5 12:09 | 显示全部楼层
由于数据传输后, 要经过多级传递, 另外还有 GPS 模块的响应速度, 是不是 110mS 的时候系统响应来不及了呢?
这种问题, 最好找调试器帮助吧.
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

1

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部
0