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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2866|回復: 1
打印 上一主題 下一主題
收起左側

STM32的RXNE+IDLE接收不定長的數據包源程序

[復制鏈接]
跳轉到指定樓層
樓主
ID:320800 發表于 2018-5-2 21:40 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
最近跟老師一起準備省電子設計競賽了,老師要求先準備好基礎的調試環境,當然選擇usart的調試接收方法啦,由于沒確定這個項目后期會加進來什么功能,不好確定每個包的大小,于是先寫好串口的不定長接收包,想到的方式自然是IDLE+RXNE的查詢


1->
     在IDLE里頭通過systick檢測接收空閑的時間,如果空閑時間>10ms就給標記,停止IDLE中斷而去處理這個數據包
//USART1 IRQ handler
  1. void USART1_IRQHandler(void)
  2. {
  3.     #if defined (USART_RECIEVE_BY_DMA)
  4.     //handle by DMA + IDLE inquiry
  5.     uint16_t dmaCounter = DMA_GetCurrDataCounter(DMA1_Channel5);
  6.     if ( USART_GetITStatus( USART1 , USART_IT_IDLE ) != RESET ) {

  7.         printf("DMA counter:%d\r\n",dmaCounter);
  8.         //has dealt rx buffer
  9. //        if (dmaCounter != USART_BUFF_SIZE) {
  10.             usartRx.isDeal = false;
  11.             DMA_Cmd(DMA1_Channel5,DISABLE);
  12.             DMA_ClearFlag(DMA1_FLAG_GL3);
  13.             usartRx.buffHead = USART_BUFF_SIZE - dmaCounter;
  14.             DMA_SetCurrDataCounter( DMA1_Channel5 , USART_BUFF_SIZE );   
  15.             //reset the counter register
  16. //        }
  17.         USART_ClearITPendingBit(USART1,USART_IT_IDLE);
  18.         
  19.         USART_ITConfig(USART1,USART_IT_IDLE,DISABLE);   
  20.         //close usart IDLE interrupt
  21.     }
  22.     #else
  23.     //IRQ handle by SYSTICK + IDLE inquiry
  24.     static uint32_t thisRcvTime = 0;
  25.    
  26.     if ( USART_GetITStatus( USART1 , USART_IT_RXNE ) != RESET ) {        
  27.         usartRx.endTime = thisRcvTime;
  28.         thisRcvTime = millis();
  29.         //update lastTime recieved a byte
  30.         usartRx.buff[usartRx.buffHead] = USART1->DR;
  31.         
  32.         //interval > 10ms
  33.         if(thisRcvTime - usartRx.endTime > 10){
  34.             usartRx.frameHead = usartRx.buffHead;
  35.         }else{
  36. //            usartRx.isDeal = true;
  37.             usartRx.frameEnd = usartRx.buffHead;
  38.             //if interval < 10ms ,stream belong to same frame
  39.             USART_ITConfig(USART1,USART_IT_IDLE,ENABLE);
  40.             //start idle time detect
  41.         }
  42.         usartRx.buffHead = (usartRx.buffHead + 1)%USART_BUFF_SIZE;
  43.         
  44.         USART_ClearITPendingBit(USART1,USART_IT_RXNE);
  45.     }
  46.     //detect IDLE time
  47.     if ( USART_GetITStatus( USART1 , USART_IT_IDLE ) != RESET ) {
  48.         if(millis() - thisRcvTime > 10 ){
  49.             USART_ITConfig(USART1,USART_IT_IDLE,DISABLE);
  50.             //close idle interrupt for save CPU
  51.             usartRx.isDeal = false;
  52.         }
  53.         USART_ClearITPendingBit(USART1,USART_IT_IDLE);
  54.     }
  55.     #endif
  56. }
復制代碼
2->
      然后再處理函數里頭實現一個簡單的回顯
  1. #if defined(USART_RECIEVE_BY_SYSTICK)
  2. //USART1 recieve frame by systick + RXNE
  3. void usart_recieve_systick_handler(void)
  4. {
  5.         uint16_t i;
  6.         if(usartRx.isDeal == false){
  7.                 USART_ITConfig(USART1,USART_IT_IDLE|USART_IT_RXNE,DISABLE);
  8.                 if(usartRx.frameHead < usartRx.frameEnd){
  9. //                        printf("%d < %d\r\n",usartRx.frameHead,usartRx.frameEnd);
  10.                         for(i=usartRx.frameHead; i<=usartRx.frameEnd; i++){
  11.                                 while((USART1->SR & 0X40)==0);
  12.                                 USART1->DR = usartRx.buff[i];
  13.                         }
  14.                 }else{
  15. //                        printf("%d > %d\r\n",usartRx.frameHead,usartRx.frameEnd);
  16.                         for(i=usartRx.frameHead; i<USART_BUFF_SIZE; i++){
  17.                                 while((USART1->SR & 0X40)==0);
  18.                                 USART1->DR = usartRx.buff[i];
  19.                         }
  20.                         for(i=0; i<usartRx.frameEnd; i++){
  21.                                 while((USART1->SR & 0X40)==0);
  22.                                 USART1->DR = usartRx.buff[i];
  23.                         }
  24.                 }
  25.                 USART_ITConfig(USART1,USART_IT_IDLE|USART_IT_RXNE,ENABLE);
  26.                 usartRx.isDeal = true;
  27.         }
  28. }
  29. #endif
復制代碼

全部資料51hei下載地址:
ST.rar (264.57 KB, 下載次數: 11)


評分

參與人數 1黑幣 +100 收起 理由
admin + 100 共享資料的黑幣獎勵!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:320800 發表于 2018-5-2 21:44 | 只看該作者
我這里還沒用DMA+IDLE查詢來寫數據包的接收,這段代碼能實現的基礎是知道發送端發送數據的最小間隔大于10ms

評分

參與人數 1黑幣 +20 收起 理由
admin + 20 回帖助人的獎勵!

查看全部評分

回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 91av免费观看 | 免费看的毛片 | av大全在线观看 | 国产在线不卡视频 | 日韩一区在线视频 | 日本亚洲精品 | 久久在线免费观看 | 一级片观看 | 深夜福利视频网站 | 免费黄色一级 | 好吊妞这里只有精品 | 深夜福利久久 | 色综合视频在线观看 | 在线视频福利 | 中文在线观看视频 | 亚洲精品一区二区三区精华液 | 亚洲国产第一页 | 一区二区三区免费 | 韩日一区二区 | 久久久久久亚洲 | 三级视频网站 | 国产又粗又猛 | 国产视频一区二区三区四区 | 91欧美日韩 | 亚洲精品一区二三区 | 国产精品国产精品国产专区不卡 | 欧美日韩免费 | 国内精品国产成人国产三级 | 欧美精品久久99 | 99视频在线播放 | 久久精品国产免费 | 国产老头视频 | 国产成人免费在线视频 | 四虎在线播放 | 欧美日韩国产片 | 性免费视频 | 日韩亚洲欧美在线观看 | 欧美综合久久 | 日韩专区中文字幕 | 黄网站免费在线观看 | 久草福利在线 |