久久久久久久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://m.zg4o1577.cn/bbs/) Powered by Discuz! X3.1
主站蜘蛛池模板: 中国少妇xxxxhd做受 | 黄色片视频免费 | 操操av| 亚洲国产伦理 | 国产午夜免费视频 | 美女福利网站 | 精品国产一区二区三区四区 | 在线看成人片 | 色婷婷狠狠 | 亚洲不卡视频 | 欧美一区二区在线视频 | 国产精品久久久久久久久久久久久久 | 一区在线视频 | 欧美在线不卡 | 国产视频一二三区 | 在线中文av| 免费观看a级片 | 第一福利丝瓜av导航 | 日韩欧美精品 | 狠狠五月| 五月婷婷亚洲 | 97国产视频 | 国产成人免费观看 | 国产三级在线看 | 欧美一级免费 | 久久精品久久久久 | 欧洲av网站 | 黄色网在线 | 欧美日韩黄| 国产欧美一区二区精品性色超碰 | 免费黄色一级 | 五月婷婷 | 视频一二区| 国产高清自拍视频 | 久久99精品久久久久久 | 久久香蕉精品 | 欧美黄色精品 | 成人手机在线观看 | 成人福利 | 中文一级片 | 欧美在线一区二区 |