久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 6809|回復: 2
收起左側

關于STM32串口1IDLE模式兼DMA接收數據會丟失數據的問題

[復制鏈接]
ID:241423 發表于 2018-11-24 19:55 | 顯示全部樓層 |閱讀模式
本人想用STM32的DMA和串口1 的ILDE模式接收不定長數據幀,遇到一個奇怪的現象,當串口助手V2.0(正點原子的)手動發送所需要的數據包時,誤包率很高,而改為60ms自動發送就幾乎沒有出現誤包的問題,所謂的誤包問題要不出現功能碼出錯,要不幀長度出現錯誤了。
  1. void Configuration_GPIO()
  2. {
  3.     GPIO_InitTypeDef  GPIO_InitStructure;
  4. // USART1_TX:PA9
  5.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;        
  6.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  7.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;        
  8.         GPIO_Init(GPIOA, &GPIO_InitStructure);           
  9.         // USART1_RX:PA10
  10.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
  11.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  12.         GPIO_Init(GPIOA, &GPIO_InitStructure);
  13. }
復制代碼
  1. #include "Configuration_DMA.h"

  2. u8 RecBuffer[RecLength]  = {0};
  3. u8 Usart1_Rec_Cnt        = 0;

  4. void Configuration_DMA_USART()
  5. {
  6.         DMA_InitTypeDef DMA_InitStructure;
  7.         
  8.         /* 該DMA用于USART快速傳輸一幀數據,單字節時不需要 */
  9.         DMA_DeInit(DMA1_Channel5);
  10.         DMA_InitStructure.DMA_PeripheralBaseAddr = (u32) &USART1->DR;
  11.         DMA_InitStructure.DMA_MemoryBaseAddr = (u32) &RecBuffer;//這是初始化時候配置,可以根據程序運行重新設置。
  12.         DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;
  13.         DMA_InitStructure.DMA_BufferSize = RecLength;
  14.         DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
  15.         DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
  16.         DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;
  17.         DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;
  18.         DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;
  19.         DMA_InitStructure.DMA_Priority = DMA_Priority_VeryHigh;
  20.         DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
  21.         DMA_Init(DMA1_Channel5, &DMA_InitStructure);
  22.         DMA_Cmd(DMA1_Channel5, ENABLE);
  23. }


復制代碼
  1. void Control_NVIC_USART1(FunctionalState NewStatus)
  2. {
  3.     NVIC_InitTypeDef NVIC_InitStructure;
  4.     // 設置NVIC中斷分組4:4位搶占優先級,0位響應優先級
  5.     NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);        
  6.    
  7.     NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
  8.         NVIC_InitStructure.NVIC_IRQChannelCmd = NewStatus;
  9.         NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
  10.         NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
  11.         NVIC_Init(&NVIC_InitStructure);
  12. }
復制代碼
  1. void Configuration_USART(u32 baudrate)
  2. {
  3.         USART_InitTypeDef USART_InitStructure;

  4.         USART_InitStructure.USART_BaudRate = baudrate;
  5.         USART_InitStructure.USART_WordLength = USART_WordLength_8b;
  6.         USART_InitStructure.USART_StopBits = USART_StopBits_1;
  7.         USART_InitStructure.USART_Parity = USART_Parity_No;
  8.         USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
  9.         USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
  10.         USART_Init(USART1, &USART_InitStructure);               
  11.         USART_ITConfig(USART1, USART_IT_RXNE, DISABLE);           // 不使能接收中斷
  12.     USART_ITConfig(USART1, USART_IT_TC, DISABLE);             // 不使能發送中斷
  13.     USART_ITConfig(USART1, USART_IT_IDLE, ENABLE);            // 使能空閑中斷
  14.     USART_ClearFlag(USART1, USART_FLAG_TC);
  15.     USART_DMACmd(USART1, USART_DMAReq_Rx, ENABLE);
  16.         USART_Cmd(USART1, ENABLE);
  17.     // 防止首字節丟失
  18.     while(USART_GetFlagStatus(USART1,USART_FLAG_TC) == RESET);
  19. }

  20. void USART1_SendByte(uint8_t c)
  21. {
  22.     USART_SendData(USART1, (uint8_t)c);
  23.         while(USART_GetFlagStatus(USART1,USART_FLAG_TC) == RESET);
  24. }

  25. void USART1_SendNByte(u8 *pData,u8 Length)
  26. {
  27.     while(Length--)
  28.     {
  29.         USART1_SendByte(*pData);
  30.         pData++;
  31.     }
  32. }

  33. void USART1_IRQHandler(void)
  34. {        
  35.     u8 i;
  36.         if(USART_GetITStatus(USART1, USART_IT_IDLE) != RESET)  
  37.         {
  38.         // 關閉USART1 TX DMA1 所指示的通道
  39.                 DMA_Cmd(DMA1_Channel5, DISABLE);
  40.                 // 讀取數據 注意:這句必須要,否則不能夠清除中斷標志位。我也不知道為啥!
  41.                 USART_ReceiveData(USART1);
  42.         // 算出接本幀數據長度
  43.                 Usart1_Rec_Cnt = RecLength - DMA_GetCurrDataCounter(DMA1_Channel5);        
  44.         if(Usart1_Rec_Cnt != 8)
  45.             Usart1_Rec_Cnt = 0;
  46.                 /*------------------------串口測試段--------------------------------*/
  47.         for(i = 0;i < Usart1_Rec_Cnt;i++)
  48.         RecBuffer1[i] = RecBuffer[i];
  49.                 //***********幀數據處理函數************//
  50. //                printf ("The lenght:%d\r\n",Usart1_Rec_Cnt);
  51. //                printf ("The data:\r\n");
  52. //                USART1_SendNByte(RecBuffer, Usart1_Rec_Cnt);
  53. //                printf ("\r\nOver! \r\n");
  54.                 //*************************************//
  55.         
  56.                 // 清除中斷標志
  57.                 USART_ClearITPendingBit(USART1, USART_IT_IDLE);         
  58.         // DMA通道的DMA緩存的大小
  59.                 DMA_SetCurrDataCounter(DMA1_Channel5, RecLength);
  60.         // 使能USART1 TX DMA1 所指示的通道
  61.                 DMA_Cmd(DMA1_Channel5, ENABLE);  
  62.      }
  63. }
復制代碼
以上是我的GPIO。DMA、USART和中斷的配置,請遇到過類似問題的大佬能夠伸出援手,在下感激不盡!
回復

使用道具 舉報

ID:451691 發表于 2019-2-15 20:39 來自觸屏版 | 顯示全部樓層
樓主解決了嗎,我也遇到過了這問題
回復

使用道具 舉報

ID:277574 發表于 2019-12-25 20:42 | 顯示全部樓層
遇到類似問題,用串口助手自動發送,一樣丟包
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 中文字幕成人 | 国产午夜精品一区二区三区嫩草 | 亚洲一页| 成人片免费看 | 国产精品久久久久久久久久久久久 | 先锋资源网站 | 2020天天操 | 国产男人的天堂 | 午夜影晥 | 国产在线激情视频 | 美女亚洲一区 | 九九热免费视频在线观看 | 夜久久 | 久草视频网站 | 成人深夜福利 | 日韩欧美福利视频 | 自拍视频国产 | 国产精品久久久久久久久婷婷 | 日韩欧美亚洲一区 | 欧美日韩a | 农村黄性色生活片 | 精品视频一区二区 | 欧美综合一区二区 | 成人欧美一区二区三区1314 | 男女视频免费 | 亚洲高清在线免费观看 | 国产精品中文字幕在线 | 日韩成人av在线 | 性欧美精品一区二区三区在线播放 | 美女一级毛片 | 国产96色在线| 91资源在线观看 | 亚洲一区视频在线 | 91激情视频| a网站在线观看 | 国产成人自拍一区 | 久久精品中文字幕 | 成av人电影在线 | 99精品久久99久久久久 | 久草视频网站 | 色婷婷av777|