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

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

QQ登錄

只需一步,快速開始

搜索
查看: 2754|回復(fù): 1
收起左側(cè)

STM32的RXNE+IDLE接收不定長(zhǎng)的數(shù)據(jù)包源程序

[復(fù)制鏈接]
ID:320800 發(fā)表于 2018-5-2 21:40 | 顯示全部樓層 |閱讀模式
最近跟老師一起準(zhǔn)備省電子設(shè)計(jì)競(jìng)賽了,老師要求先準(zhǔn)備好基礎(chǔ)的調(diào)試環(huán)境,當(dāng)然選擇usart的調(diào)試接收方法啦,由于沒(méi)確定這個(gè)項(xiàng)目后期會(huì)加進(jìn)來(lái)什么功能,不好確定每個(gè)包的大小,于是先寫好串口的不定長(zhǎng)接收包,想到的方式自然是IDLE+RXNE的查詢


1->
     在IDLE里頭通過(guò)systick檢測(cè)接收空閑的時(shí)間,如果空閑時(shí)間>10ms就給標(biāo)記,停止IDLE中斷而去處理這個(gè)數(shù)據(jù)包
//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. }
復(fù)制代碼
2->
      然后再處理函數(shù)里頭實(shí)現(xiàn)一個(gè)簡(jiǎn)單的回顯
  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
復(fù)制代碼

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

評(píng)分

參與人數(shù) 1黑幣 +100 收起 理由
admin + 100 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

ID:320800 發(fā)表于 2018-5-2 21:44 | 顯示全部樓層
我這里還沒(méi)用DMA+IDLE查詢來(lái)寫數(shù)據(jù)包的接收,這段代碼能實(shí)現(xiàn)的基礎(chǔ)是知道發(fā)送端發(fā)送數(shù)據(jù)的最小間隔大于10ms

評(píng)分

參與人數(shù) 1黑幣 +20 收起 理由
admin + 20 回帖助人的獎(jiǎng)勵(lì)!

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 婷婷二区 | 国产一区二区在线免费视频 | 久久成人综合 | 欧美一级片在线观看 | 国产精品久久国产精品 | 亚洲最大av网站 | 国产日韩一区二区三区 | 色综合九九 | 日批免费看 | 欧美午夜一区二区三区免费大片 | 伊人成人免费视频 | 欧美亚洲免费 | 日韩在线观看视频一区 | 97精品超碰一区二区三区 | 在线观看国产视频 | 欧产日产国产精品99 | 亚洲精品国产一区 | 99久热在线精品视频观看 | 国产日韩免费观看 | 久久久久国产一区二区三区四区 | 久久久久国产精品免费免费搜索 | 成人a免费 | 亚洲精品在线播放 | 午夜精品久久久久久久久久久久久 | 精品国产一区二区三区在线观看 | 久久日本 | 狠狠干在线| 中文字幕在线观看 | 午夜免费福利片 | 美女视频一区二区 | 国产亚洲精品美女久久久久久久久久 | 蜜桃精品视频在线 | 激情一区二区三区 | 欧美激情在线播放 | 狠狠操电影 | 成人免费av | 国产一区欧美 | 一区二区成人在线 | 91精品国产色综合久久不卡蜜臀 | 国产一区二区三区 | 欧美精品一区二区三区蜜桃视频 |