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

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

QQ登錄

只需一步,快速開始

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

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

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


1->
     在IDLE里頭通過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)分

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

使用道具 舉報(bào)

沙發(fā)
ID:320800 發(fā)表于 2018-5-2 21:44 | 只看該作者
我這里還沒用DMA+IDLE查詢來寫數(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ī)則

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

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

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 亚洲精品国产偷自在线观看 | 在线视频一区二区 | 日本三级在线视频 | 在线视频中文字幕 | 97在线观视频免费观看 | 色资源站 | 亚洲国产成人精品女人久久久野战 | 国产午夜精品一区二区三区在线观看 | 四虎影| 观看av| 涩涩视频网站在线观看 | 国产黑丝av | 毛片在线看片 | 九九热在线视频观看这里只有精品 | 国产精品久久久久久福利一牛影视 | 热久久999 | 日韩精品在线免费观看视频 | 日本精品视频在线 | 亚洲有码转帖 | 日韩一区二区三区av | 中文字幕在线免费观看 | 91精品国产91久久久久久不卞 | 成人一区二区视频 | 美日韩精品 | 日韩无 | 久久久久久久综合 | 国产精品视频在线观看 | 欧美精品一区二区三区视频 | 久久精品小视频 | 在线国产视频 | 91在线视频播放 | 国产午夜精品视频 | 国产精品久久777777 | 亚洲精品一区二区三区在线 | 国产精品美女久久久免费 | 久久成人18免费网站 | 日韩免费激情视频 | 亚洲美女在线一区 | 福利av在线 | 麻豆一区二区三区 | 国产视频久久 |