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

 找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 6674|回復(fù): 2
打印 上一主題 下一主題
收起左側(cè)

關(guān)于STM32串口1IDLE模式兼DMA接收數(shù)據(jù)會(huì)丟失數(shù)據(jù)的問題

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:241423 發(fā)表于 2018-11-24 19:55 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
本人想用STM32的DMA和串口1 的ILDE模式接收不定長(zhǎng)數(shù)據(jù)幀,遇到一個(gè)奇怪的現(xiàn)象,當(dāng)串口助手V2.0(正點(diǎn)原子的)手動(dòng)發(fā)送所需要的數(shù)據(jù)包時(shí),誤包率很高,而改為60ms自動(dòng)發(fā)送就幾乎沒有出現(xiàn)誤包的問題,所謂的誤包問題要不出現(xiàn)功能碼出錯(cuò),要不幀長(zhǎng)度出現(xiàn)錯(cuò)誤了。
  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. }
復(fù)制代碼
  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快速傳輸一幀數(shù)據(jù),單字節(jié)時(shí)不需要 */
  9.         DMA_DeInit(DMA1_Channel5);
  10.         DMA_InitStructure.DMA_PeripheralBaseAddr = (u32) &USART1->DR;
  11.         DMA_InitStructure.DMA_MemoryBaseAddr = (u32) &RecBuffer;//這是初始化時(shí)候配置,可以根據(jù)程序運(yùn)行重新設(shè)置。
  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. }


復(fù)制代碼
  1. void Control_NVIC_USART1(FunctionalState NewStatus)
  2. {
  3.     NVIC_InitTypeDef NVIC_InitStructure;
  4.     // 設(shè)置NVIC中斷分組4:4位搶占優(yōu)先級(jí),0位響應(yīng)優(yōu)先級(jí)
  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. }
復(fù)制代碼
  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);             // 不使能發(fā)送中斷
  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.     // 防止首字節(jié)丟失
  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.         // 關(guān)閉USART1 TX DMA1 所指示的通道
  39.                 DMA_Cmd(DMA1_Channel5, DISABLE);
  40.                 // 讀取數(shù)據(jù) 注意:這句必須要,否則不能夠清除中斷標(biāo)志位。我也不知道為啥!
  41.                 USART_ReceiveData(USART1);
  42.         // 算出接本幀數(shù)據(jù)長(zhǎng)度
  43.                 Usart1_Rec_Cnt = RecLength - DMA_GetCurrDataCounter(DMA1_Channel5);        
  44.         if(Usart1_Rec_Cnt != 8)
  45.             Usart1_Rec_Cnt = 0;
  46.                 /*------------------------串口測(cè)試段--------------------------------*/
  47.         for(i = 0;i < Usart1_Rec_Cnt;i++)
  48.         RecBuffer1[i] = RecBuffer[i];
  49.                 //***********幀數(shù)據(jù)處理函數(shù)************//
  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.                 // 清除中斷標(biāo)志
  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. }
復(fù)制代碼
以上是我的GPIO。DMA、USART和中斷的配置,請(qǐng)遇到過類似問題的大佬能夠伸出援手,在下感激不盡!
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:451691 發(fā)表于 2019-2-15 20:39 來自手機(jī) | 只看該作者
樓主解決了嗎,我也遇到過了這問題
回復(fù)

使用道具 舉報(bào)

板凳
ID:277574 發(fā)表于 2019-12-25 20:42 | 只看該作者
遇到類似問題,用串口助手自動(dòng)發(fā)送,一樣丟包
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 一区二区三区亚洲 | 欧美乱做爰xxxⅹ久久久 | 激情网站在线 | 日韩免费高清视频 | 久久综合一区二区三区 | 一级片在线观看视频 | 亚洲性视频网站 | 国产精品一区一区三区 | jlzzjlzz欧美大全| 99久久成人 | 国产成人精品免高潮在线观看 | av网站免费观看 | 逼逼网| 五十女人一级毛片 | 亚洲有码转帖 | 国产精品视频一区二区三区 | 欧美黄色一区 | 91在线精品一区二区 | 天天操操 | 国内91在线 | 国产精品视频网 | 999精品视频| 久草热视频 | 黄色网址大全在线观看 | 99re视频在线| 婷婷综合久久 | av国产精品| 亚洲不卡在线视频 | 日韩国产精品一区二区三区 | 日韩视频一区二区 | 蜜桃av鲁一鲁一鲁一鲁 | 日本精品一区二区三区四区 | 国产精品久久久久久久模特 | 国产福利在线 | 日日操夜夜摸 | 日本久久综合 | 欧美看片 | www日本在线播放 | 欧美视频在线播放 | 欧美日韩国产中文字幕 | 亚洲天堂免费 |