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

標題: STM32的RXNE+IDLE接收不定長的數據包源程序 [打印本頁]

作者: 小橡皮    時間: 2018-5-2 21:40
標題: STM32的RXNE+IDLE接收不定長的數據包源程序
最近跟老師一起準備省電子設計競賽了,老師要求先準備好基礎的調試環境,當然選擇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)



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




歡迎光臨 (http://www.zg4o1577.cn/bbs/) Powered by Discuz! X3.1
主站蜘蛛池模板: 久久久久久久久久久国产 | 男人的天堂中文字幕 | 亚洲成人免费视频 | 一区二区三区国产视频 | 国产精品久久久久久久久久 | 午夜免费福利电影 | 日本精品一区二区三区在线观看 | 18性欧美 | 91在线精品播放 | 亚洲 欧美 激情 另类 校园 | 久久中文字幕一区 | 操操操日日日 | 欧美精品一区二区在线观看 | 久久男人天堂 | 91免费高清| 国产h视频 | 国产日产久久高清欧美一区 | 午夜视频一区 | 五月激情婷婷网 | av网站在线播放 | 自拍偷拍亚洲欧美 | 色性av| 91精品国产91久久久久久最新 | 久久久精品一区 | 99精品免费视频 | 久草精品在线 | 久久国产一区二区三区 | 伊人网站| 亚洲欧美日韩在线 | www..com18午夜观看| 亚洲精品视频在线播放 | 日韩中文字幕一区 | 一区二区三区日韩 | 国产精品久久久久久久久久久久 | 日韩久久久久久 | 超碰婷婷| 国产精品美女久久久久 | 国产亚洲高清视频 | 国产亚洲成av人片在线观看桃 | 国产小视频在线 | 成人精品毛片国产亚洲av十九禁 |