你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM32485串口只能发送第一个字符问题

[复制链接]
白开水123 提问时间:2017-5-19 09:43 /
悬赏5ST金币已解决
STM32调试时发现当波特率为9600时串口助手收到程序发送出来的字符只有第一个字符,但是当把USART的波特率设置成38400时,串口助手就能收到完整的命令,哪位大神能解释下原因吗??
  1. void USART1_IRQHandler(void)
  2. {
  3.   u8 ucUartTemp;
  4.   if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)
  5.   {
  6.     ucUartTemp = USART_ReceiveData(USART1);
  7.     Usart1.TimeOutCounter = Reset;
  8.     if(Usart1.Usart_RxStatus == RX_IDLE)
  9.     {
  10.       if(ucUartTemp == Usart_StartMark )
  11.       {
  12.         
  13.         Usart1.Usart_RxStatus = RX_HEAD;
  14.         Usart1.Usart_ReceiveCache[CPOS_Start] = ucUartTemp;
  15.         Usart1.Usart_Cache_Where = CPOS_CMD;
  16.       }
  17.     }
  18.     else if(Usart1.Usart_RxStatus == RX_HEAD )
  19.     {
  20.       if(Usart1.Usart_Cache_Where == CPOS_Length-1)
  21.         Usart1.Usart_RxStatus = RX_Length;
  22.       Usart1.Usart_ReceiveCache[Usart1.Usart_Cache_Where] = ucUartTemp;
  23.       Usart1.Usart_Cache_Where ++;
  24.     }
  25.     else if(Usart1.Usart_RxStatus == RX_Length)
  26.     {
  27.       Usart1.Usart_ReceiveCache[Usart1.Usart_Cache_Where] = ucUartTemp;
  28.       Usart1.Usart_Cache_Where++;
  29. //      if((Usart1.Usart_Cache_Where > Usart1_ReceiveLength) ||
  30. //         (Usart1.Usart_Cache_Where > (Usart1.Usart_ReceiveCache[CPOS_Length] -'0')*10 + (Usart1.Usart_ReceiveCache[CPOS_Length+1] -'0')*1))
  31. //      {//接收超过限定长度
  32. //        Usart1.Err_Code = ERR_OutLength;
  33. //        Usart1.Usart_RxStatus = RX_END;
  34. //      }
  35.       if((Usart1.Usart_ReceiveCache[CPOS_Start] == Usart_StartMark ) &&
  36.          Usart1.Usart_Cache_Where == Usart1.Usart_ReceiveCache[CPOS_Length] )
  37.       {//正确接收完成
  38.         Usart1.Usart_RxStatus = RX_END;
  39.       }
  40.     }
  41.   }
  42.     ucUartTemp=USART1->SR;
  43.     //if(ucUartTemp==RESET)ucUartTemp=Reset;
  44.     ucUartTemp=USART1->DR;
  45.     //if(ucUartTemp==RESET)ucUartTemp=Reset;
  46. }

  47. void Usart1Comm_app(void)
  48. {


  49.   if(Usart1.Usart_RxStatus == RX_END)
  50.   {
  51.     u8 i=0;
  52.     //u8* crc;
  53.     //CRC
  54.    
  55.     //for(i=0;i<Usart1.Usart_Cache_Where-4;i++)
  56.      // temp8 ^= Usart1.Usart_ReceiveCache[i];
  57. //    if(temp8 != (u8)AsciiHEXtoInt(Usart1.Usart_ReceiveCache+Usart1.Usart_Cache_Where-2,2))
  58. //    {
  59. //      if(Usart1.Err_Code == Reset)
  60. //        Usart1.Err_Code = ERR_CRC;//CRC校验错误
  61. //    }
  62. //    else
  63.     //CRC正确
  64.       for(i=0;i<Usart1_ReportLength;i++)
  65.         Usart1.Usart_ReportCache[i] = 0;
  66.       for(i=0;i<CPOS_CMD+1;i++)
  67.         Usart1.Usart_ReportCache[i] = Usart1.Usart_ReceiveCache[i];
  68.       DeviceCode = (u8)AsciiHEXtoInt(Usart1.Usart_ReceiveCache+CPOS_Device,2);
  69.       switch (Usart1.Usart_ReceiveCache[CPOS_CMD])
  70.       {
  71.       case CMD_GetVER:
  72.         {     
  73.         /////////////////////////////////////Report////////////////////////////////////////////
  74.         //memcpy(Usart1.Usart_ReportCache+7,Usart1.Usart_ReceiveCache+7,Usart1.Usart_Cache_Where);
  75.         //步骤代码
  76.         Usart1.Usart_ReportCache[2] = 0x07;
  77.         Usart1.Usart_ReportCache[3] = 0x40;
  78.         Usart1.Usart_ReportCache[4] = 0x96;
  79.         Usart1.Usart_RxStatus = RX_IDLE;
  80.         Usart1.Err_Code = Reset;
  81.         break;}
  82.     default:
  83.         Usart1.Err_Code = ERR_NoDefCMD;//未定义命令
  84.         break;
  85.       }
  86.       
  87.       Uart_PutChar(1,Usart1.Usart_ReportCache,7);
  88.       DelayNms(1);
  89.        RS485_DE_L();
  90.       /*     
  91.     //REPROT
  92.     if(Usart1.Err_Code == Reset)
  93.     {
  94.       u16 SendCharLength = 0;
  95.       SendCharLength = strlen((char *)Usart1.Usart_ReportCache);
  96.       if(SendCharLength > Usart1_ReportLength) SendCharLength = Usart1_ReportLength;
  97.       Usart1.Usart_ReportCache[CPOS_Length] = SendCharLength + CrcLength;
  98.       //Usart1.Usart_ReportCache[CPOS_Length+1] = (SendCharLength + CrcLength)  % 10/1+ '0';;
  99.       //CRC
  100.       //temp8 = 0;
  101.       //for(i=0;i<SendCharLength;i++)
  102.           //temp8 ^= Usart1.Usart_ReportCache[i];
  103.       //Usart1.Usart_ReportCache[SendCharLength++] = (((u16)temp8/16)<=9)?((u16)temp8/16+'0'):((u16)temp8/16-9+'@');
  104.       //Usart1.Usart_ReportCache[SendCharLength++] = (((u16)temp8%16)<=9)?((u16)temp8%16+'0'):((u16)temp8%16-9+'@');

  105.       //crc=CRC162(Usart2.Usart_ReportCache,i);//计算CRC校验值
  106.       //Usart2.Usart_ReportCache[i] = *(crc+i);
  107.       //i++;
  108.       //Usart2.Usart_ReportCache[i] = *(crc+i);
  109.       //i++;
  110.       //Usart2.Usart_ReportCache[i] = *(crc+i);
  111.       //i++;
  112.       //Usart2.Usart_ReportCache[i] = *(crc+i);
  113.       //i++;

  114.       Uart_PutChar(1,Usart1.Usart_ReportCache, SendCharLength);
  115.       //for (i=0;i<7;i++)
  116.       //Usart1.Usart_ReceiveCache[i]=0;
  117.       SYS_ReStart = Reset;
  118.     }
  119.     else
  120.    {//
  121.       SYS_ERRStatus = Set;
  122.      Usart1.Usart_RxStatus = RX_IDLE;
  123.    
  124.     }*/
  125.   }
  126. }

  127. void  Usart2Comm_app (void)
  128. {
  129.   if(Usart2_Receiver_Over)
  130.   {
  131.     Usart2_Receiver_Over = 0;
  132.   }
  133. }
  134. void  Usart3Comm_app (void)
  135. {
  136.   if(Usart3_Receiver_Over)
  137.   {
  138.     Usart3_Receiver_Over = 0;
  139.   }
  140. }
  141. void  Usart4Comm_app (void)
  142. {
  143.   if(Usart4_Receiver_Over)
  144.   {
  145.     Usart4_Receiver_Over = 0;
  146.   }
  147. }
  148. void  Usart5Comm_app (void)
  149. {
  150.   if(Usart5_Receiver_Over)
  151.   {
  152.     Usart5_Receiver_Over = 0;
  153.   }
  154. }
  155. /*
  156. void Usart3_init(u32 bdr)
  157. {
  158.   USART_Cmd(USART1, DISABLE);  //
  159.   
  160.   USART_InitTypeDef USART_InitStructure;
  161.   USART_InitStructure.USART_BaudRate = bdr;                   //设定传输速率
  162.   USART_InitStructure.USART_WordLength = USART_WordLength_8b; //设定传输数据位数  偶校验9位
  163.   USART_InitStructure.USART_StopBits = USART_StopBits_1;      //设定停止位个数
  164.   USART_InitStructure.USART_Parity = USART_Parity_No ;       //偶校验位
  165.   USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;  //不用流量控制
  166.   USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;                  //使用接收和发送功能
  167.   
  168.   USART_Init(USART1, &USART_InitStructure);  //初始化串口1
  169.   USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);
  170.   USART_Cmd(USART1, ENABLE);  //使能串口1

  171. }
  172. */
  173. void Five_usart_init(void)
  174. {
  175.   /* Timer Clock configuration ------------------------------------------------*/
  176.     RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1 ,ENABLE);
  177. //  RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA2 ,ENABLE);
  178.     RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);
  179. // RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2,ENABLE);
  180. // RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3,ENABLE);
  181. // RCC_APB1PeriphClockCmd(RCC_APB1Periph_UART4,ENABLE);
  182. //  RCC_APB1PeriphClockCmd(RCC_APB1Periph_UART5,ENABLE);
  183.   

  184.   
  185.   /* Timer Interrupt configuration ---------------------------------------------*/
  186.   NVIC_InitTypeDef NVIC_InitStructure;
  187.   NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//4组抢占 4组从优先
  188.   NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQChannel;
  189.   NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
  190.   NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
  191.   NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  192.   NVIC_Init(&NVIC_InitStructure);
  193.   NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQChannel;
  194.   NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
  195.   NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
  196.   NVIC_Init(&NVIC_InitStructure);
  197.   NVIC_InitStructure.NVIC_IRQChannel = USART3_IRQChannel;
  198.   NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
  199.   NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;
  200.   NVIC_Init(&NVIC_InitStructure);
  201.   NVIC_InitStructure.NVIC_IRQChannel = UART4_IRQChannel;
  202.   NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
  203.   NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;
  204.   NVIC_Init(&NVIC_InitStructure);
  205. //  NVIC_InitStructure.NVIC_IRQChannel = USART5_IRQChannel;
  206. //  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
  207. //  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
  208. //  NVIC_Init(&NVIC_InitStructure);
  209.   
  210.   /* Usart configuration ---------------------------------------------*/
  211.   Usart_init(USART1,Usart1_BandRate,USART_WordLength_8b,USART_StopBits_1,USART_Parity_No,USART_HardwareFlowControl_None);
  212.   USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);
  213.   USART_Cmd(USART1, ENABLE);
  214.   //使能u1-tx DMA发送
  215.   Usart_DMAtx_init(USART1,DMA1_Channel4);
  216.   DMA_Cmd(DMA1_Channel4, ENABLE);
  217.   USART_DMACmd(USART1, USART_DMAReq_Tx, ENABLE);

  218.   Usart_init(USART2,Usart2_BandRate,USART_WordLength_8b,USART_StopBits_1,USART_Parity_No,USART_HardwareFlowControl_None);
  219.   USART_ITConfig(USART2,USART_IT_RXNE,ENABLE);
  220.   //USART_Cmd(USART2, ENABLE);  //使能串口2
  221.   
  222.   Usart_init(USART3,Usart3_BandRate,USART_WordLength_8b,USART_StopBits_1,USART_Parity_No,USART_HardwareFlowControl_None);
  223.   USART_ITConfig(USART3,USART_IT_RXNE,ENABLE);
  224. // USART_Cmd(USART3, ENABLE);  //使能串口3
  225.   
  226.   Usart_init(UART4,Usart4_BandRate,USART_WordLength_8b,USART_StopBits_1,USART_Parity_No,USART_HardwareFlowControl_None);
  227.   USART_ITConfig(UART4,USART_IT_RXNE,ENABLE);
  228.   //USART_Cmd(UART4, ENABLE);  //使能串口4
  229.   
  230.   Usart_init(UART5,Usart5_BandRate,USART_WordLength_8b,USART_StopBits_1,USART_Parity_No,USART_HardwareFlowControl_None);
  231.   USART_ITConfig(UART5,USART_IT_RXNE,ENABLE);
  232.   //USART_Cmd(UART5, ENABLE);  //使能串口5
  233.   DelayNms(50);
  234.   /* Timer GPIO configuration ------------------------------------------------*/
  235.   Set_Port_Status(GPIO_A,GPIO_Pin_9,GPIO_Mode_AF_PP);          //TX1
  236.   Set_Port_Status(GPIO_A,GPIO_Pin_10,GPIO_Mode_IN_FLOATING);   //RX1
  237.   Set_Port_Status(GPIO_A,GPIO_Pin_2,GPIO_Mode_AF_PP);        //TX2
  238.   Set_Port_Status(GPIO_A,GPIO_Pin_3,GPIO_Mode_IN_FLOATING);  //RX2
  239.   Set_Port_Status(GPIO_B,GPIO_Pin_10,GPIO_Mode_AF_PP);       //TX3
  240.   Set_Port_Status(GPIO_B,GPIO_Pin_11,GPIO_Mode_IN_FLOATING); //RX3
  241.   Set_Port_Status(GPIO_C,GPIO_Pin_10,GPIO_Mode_AF_PP);       //TX4
  242.   Set_Port_Status(GPIO_C,GPIO_Pin_11,GPIO_Mode_IN_FLOATING); //RX4
  243.   //Set_Port_Status(GPIO_C,GPIO_Pin_12,GPIO_Mode_AF_PP);       //TX5
  244.   //Set_Port_Status(GPIO_C,GPIO_Pin_13,GPIO_Mode_IN_FLOATING); //RX5
  245. }
  246. /*******************************************************************************
  247. *函数名称:
  248. *******************************************************************************/
  249. void Usart_init(USART_TypeDef* USARTx,u32 Usartx_BandRate,u16 USARTx_WordLength,u16 USARTx_StopBits,u16 USARTx_Parity,u16 USARTx_HardwareFlowControl)
  250. {
  251.   USART_InitTypeDef USART_InitStructure;                          
  252.   USART_InitStructure.USART_BaudRate = Usartx_BandRate;           
  253.   USART_InitStructure.USART_WordLength = USARTx_WordLength;     
  254.   USART_InitStructure.USART_StopBits = USARTx_StopBits;         
  255.   USART_InitStructure.USART_Parity = USARTx_Parity;            
  256.   USART_InitStructure.USART_HardwareFlowControl = USARTx_HardwareFlowControl;
  257.   USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
  258.   USART_Init(USARTx, &USART_InitStructure);
  259. }
  260. /*******************************************************************************
  261. *函数名称:
  262. *******************************************************************************/
  263. void Usart_DMAtx_init(USART_TypeDef* USARTx,DMA_Channel_TypeDef * DMAx_Channelx)
  264. {
  265.   DMA_InitTypeDef DMA_InitStructure;
  266.   DMA_InitStructure.DMA_PeripheralBaseAddr = (u32)(&USARTx->DR);
  267.   DMA_InitStructure.DMA_MemoryBaseAddr = (u32)(&USARTx->DR);
  268.   DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;
  269.   DMA_InitStructure.DMA_BufferSize = 1;
  270.   DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
  271.   DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
  272.   DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;
  273.   DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;
  274.   DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;
  275.   DMA_InitStructure.DMA_Priority = DMA_Priority_Medium;
  276.   DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
  277.   DMA_Init(DMAx_Channelx, &DMA_InitStructure);
  278. }

  279.   //  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;// | GPIO_Pin_2;
  280.   //  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  281.   //  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  282.   //  GPIO_Init(GPIOA, &GPIO_InitStructure);
  283.   //  /*
  284.   //  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
  285.   //  GPIO_Init(GPIOB, &GPIO_InitStructure);
  286.   //  
  287.   //  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10 ;//| GPIO_Pin_12;
  288.   //  GPIO_Init(GPIOC, &GPIO_InitStructure);
  289.   //  */
  290.   //  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;// | GPIO_Pin_3;
  291.   //  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  292.   //  GPIO_Init(GPIOA, &GPIO_InitStructure);
  293.   //  
  294.   //  //GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;
  295.   //  //GPIO_Init(GPIOB, &GPIO_InitStructure);
  296.   //  
  297.   //  //GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;
  298.   //  //GPIO_Init(GPIOC, &GPIO_InitStructure);
  299.   //  
  300.   //  //GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
  301.   //  //GPIO_Init(GPIOD, &GPIO_InitStructure);

  302. //******************************************************************************
  303. // 函数名称    : UART1_PutChar()
  304. // 功能描述    : 串口1发送数据函数.
  305. // 输入        : u8 ch 要发送的数据
  306. // 输出        : None
  307. // 返回        : None
  308. //******************************************************************************

  309. void  Uart_PutChar(u8 CH,u8 *p,u8 NUM)
  310. {
  311.   u16 i=0;
  312.   u8 j=0;
  313.   switch(CH)
  314.   {
  315.   case 1:
  316.    //USART_ITConfig(USART1,USART_IT_RXNE,DISABLE);
  317.     //USART_ClearITPendingBit(USART1,USART_IT_RXNE);
  318.     //USART_ClearITPendingBit(USART1,USART_IT_IDLE);
  319.     //USART_ClearITPendingBit(USART1,USART_IT_ORE);
  320.     //USART_ClearFlag(USART1,USART_FLAG_RXNE);
  321.     //USART_ClearFlag(USART1,USART_FLAG_IDLE);  
  322.     //USART_ClearFlag(USART1,USART_FLAG_ORE);
  323.     //GPIOA->CRH |= 0x00000300; //RX端口设置 设为输出模式 防止进入usart-ORE中断
  324.     //DMA_Send585_END=0;
  325.     //DMA_Send585_END_Timer=0;//用于延迟485使能端
  326.     //GPIO_SetBits(GPIOA, GPIO_Pin_10);
  327.     RS485_DE_H();
  328.     DelayNms(5);
  329.     DMA_Cmd(DMA1_Channel4, DISABLE);
  330.     DMA1_Channel4->CNDTR=NUM;
  331.     DMA1_Channel4->CMAR=(u32)p;
  332.     DMA_Cmd(DMA1_Channel4, ENABLE);

  333.     break;
  334.   case 2:
  335.     for(i=0;i<NUM;i++)
  336.     {
  337.       j = *(p+i);
  338.       USART2->DR = (j & (u16)0x01FF);
  339.       while(!(USART2->SR & USART_FLAG_TXE));
  340.     }
  341.     break;
  342.   case 3:
  343.     for(i=0;i<NUM;i++)
  344.     {
  345.       j = *(p+i);
  346.       USART3->DR = (j & (u16)0x01FF);
  347.       while(!(USART3->SR & USART_FLAG_TXE));
  348.     }
  349.     break;
  350.   case 4:
  351.     for(i=0;i<NUM;i++)
  352.     {
  353.       j = *(p+i);
  354.       UART4->DR = (j & (u16)0x01FF);
  355.       while(!(UART4->SR & USART_FLAG_TXE));
  356.     }
  357.     break;
  358.   case 5:
  359.     for(i=0;i<NUM;i++)
  360.     {
  361.       j = *(p+i);
  362.       UART5->DR = (j & (u16)0x01FF);
  363.       while(!(UART5->SR & USART_FLAG_TXE));
  364.     }
  365.     break;
  366.   }
  367. }
复制代码
下面串口助手接收的信息


这是38400接收的信息

这是38400接收的信息

这是9600接收的信息

这是9600接收的信息

最佳答案

查看完整内容

485芯片是半双工芯片,发送的时候要把芯片置为发送模式,在发送完成后芯片置为接收模式,你的问题是在发送完毕后,程序内部状态是发送完毕,但是实质最后一个字节数据在硬件层没有发送完毕,这时候你将485芯片置为接收状态,最后一个字节会发送失败,在波特率越低状态下越明显,所以你检测到发送完成后。人为延时1ms,问题就会解决了,你可以试一试。 ...
收藏 1 评论9 发布时间:2017-5-19 09:43

举报

9个回答
oujisang 回答时间:2017-5-19 09:43:54
485芯片是半双工芯片,发送的时候要把芯片置为发送模式,在发送完成后芯片置为接收模式,你的问题是在发送完毕后,程序内部状态是发送完毕,但是实质最后一个字节数据在硬件层没有发送完毕,这时候你将485芯片置为接收状态,最后一个字节会发送失败,在波特率越低状态下越明显,所以你检测到发送完成后。人为延时1ms,问题就会解决了,你可以试一试。
废鱼 回答时间:2017-5-19 09:59:57
楼主,从现象来看,是发生了数据丢失,如果不用DMA会不会发生丢失的情况。
白开水123 回答时间:2017-5-19 10:33:45
安 发表于 2017-5-19 09:59
楼主,从现象来看,是发生了数据丢失,如果不用DMA会不会发生丢失的情况。 ...

如果是数据丢失的话也应该是延时的问题感觉,毕竟在38400波特率下数据并没有丢失而只在9600的情况下才丢失了
废鱼 回答时间:2017-5-19 10:53:51
波特率越高,发送时间越短。波特率低的情况下丢失,很多是因为数据传输太快导致。
白开水123 回答时间:2017-5-19 11:16:21
明白,我去试试不用DMA传送数据。
wolfgang 回答时间:2017-5-19 13:18:58
DMA发送后中断标识位未清空
白开水123 回答时间:2017-5-19 13:44:00
wolfgang2015 发表于 2017-5-19 13:18
DMA发送后中断标识位未清空

清空的
  1. void DMA1_Channel4_IRQHandler(void)
  2. {//485发送完成中断
  3.   if(DMA_GetITStatus(DMA1_IT_TC4))
  4.   {
  5.     DMA_ClearITPendingBit(DMA1_FLAG_TC4);
  6.     DMA_Send585_END=1;
  7.     //TIM_Cmd(TIM8, ENABLE);
  8.   }
  9. }
复制代码
stary666 回答时间:2017-5-19 13:49:35
进来看看了,吗,,,,
废鱼 回答时间:2017-5-19 13:55:39
楼主,用DMA传输的时候,能不能一次多传输一些数据,不要一个字节一个字节的传输。如果单字节传输时,考虑判断一下上次数据发送完成,再进行下次发送。

所属标签

相似问题

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版