99久久全国免费观看_国产一区二区三区四区五区VM_久久www人成免费看片中文_国产高清在线a视频大全_深夜福利www_日韩一级成人av

STM32接收不定長數(shù)據(jù)

  • 硬件
    • STM32L475
  •  方案
    • 使用通過修改HAL庫,加入IDLE中斷,實現(xiàn)不定長數(shù)據(jù)接收
  • 參考資料
    • LAT0534_UART_IDLE中斷使用_接收不定長串口數(shù)據(jù)_V0.3
  • cubemx配置

  • 實現(xiàn)過程
    • 首先接入接受的數(shù)據(jù)緩沖區(qū),并設(shè)置緩沖區(qū)的大小
      //Store the revceived bytes number
      uint32_t Rev_Size = 0;
      //Receive buffer
      uint8_t UART_RX_Buf[15];?
    • 然后修改HAL庫的usart.c文件
      • 加入extern uint32_t Rev_Size;變量聲明
      • 修改HAL_StatusTypeDef HAL_UART_AbortReceive_IT(UART_HandleTypeDef *huart)該函數(shù)

        #else
        //修改后的代碼
        	CLEAR_BIT(huart->Instance->CR1, (USART_CR1_RXNEIE | USART_CR1_PEIE| USART_CR1_IDLEIE));
        //  CLEAR_BIT(huart->Instance->CR1, (USART_CR1_RXNEIE | USART_CR1_PEIE));//修改前的代碼
          CLEAR_BIT(huart->Instance->CR3, USART_CR3_EIE);
        #endif /* USART_CR1_FIFOEN */
      • 修改HAL_StatusTypeDef HAL_UART_Receive_DMA(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size)該函數(shù),這里需要注意一下加入代碼的位置。
        __HAL_UNLOCK(huart);
        		
        		/* Enable the UART IDLE Interrupt*/   //加入的代碼
        		SET_BIT(huart->Instance->CR1, USART_CR1_IDLEIE);
        		
            /* Enable the UART Parity Error Interrupt */
            SET_BIT(huart->Instance->CR1, USART_CR1_PEIE);
        ?
      • 修改void HAL_UART_IRQHandler(UART_HandleTypeDef *huart)函數(shù),光放文檔里面的是 USART_SR_IDLE需要換成 USART_ISR_IDLE,NDTR換成CNDTR(具體原因看技術(shù)手冊和源碼)
        #if defined(USART_CR1_FIFOEN)
            if (((isrflags & USART_ISR_RXNE_RXFNE) != 0U)
                && (((cr1its & USART_CR1_RXNEIE_RXFNEIE) != 0U)
                    || ((cr3its & USART_CR3_RXFTIE) != 0U)))
        #else
        		//加入的代碼
        		if(((isrflags & USART_ISR_IDLE) != RESET) && ((cr1its & USART_CR1_IDLEIE) != RESET))
         {
        		//Record the received bytes number
        		Rev_Size = huart->RxXferSize - huart->hdmarx->Instance->CNDTR;
        		//clear the IDLE flag
        		__HAL_UART_CLEAR_IDLEFLAG(huart);
        		//Abord the received process
        		HAL_UART_AbortReceive_IT(huart);
        		return;
         }
        
            if (((isrflags & USART_ISR_RXNE) != 0U)
                && ((cr1its & USART_CR1_RXNEIE) != 0U))
        #endif /* USART_CR1_FIFOEN */
            {
              if (huart->RxISR != NULL)
              {
                huart->RxISR(huart);
              }
              return;
            }
          }?
    • 在main.c里面進行函數(shù)修改 
      • 添加中斷,該中斷是在開啟接收后,當(dāng)接收到的數(shù)據(jù)沒有到達最大的接收位的時候,但是總線上停止了數(shù)據(jù)傳輸,總線進入空閑狀態(tài),則產(chǎn)生中止中斷。,并進入該函數(shù)進行數(shù)據(jù)處理。
        void HAL_UART_AbortReceiveCpltCallback (UART_HandleTypeDef *huart)
        {
         //Print received Bytes
        	printf("\n\r[IDLE]Received %d Bytes:",Rev_Size);
        	for(uint16_t i = 0; i < Rev_Size; i++)
        	{
        	printf(" 0x%02X", UART_RX_Buf[i]);
        	}
        	//Re-start receiving
        	HAL_UART_Receive_DMA(&huart1, UART_RX_Buf, 15);
         /* NOTE : This function should not be modified, when the callback is needed,
         the HAL_UART_AbortTransmitCpltCallback can be implemented in the user 
        file.
         */
        }?
      • 該中斷的解釋
        /**
          * @brief  Abort ongoing Receive transfer (Interrupt mode).
          * @param  huart UART handle.
          * @note   This procedure could be used for aborting any ongoing Rx transfer started in Interrupt or DMA mode.
          * @note   This procedure is executed in Interrupt mode, meaning that abort procedure could be
          *         considered as completed only when user abort complete callback is executed (not when exiting function).
          * @retval HAL status
          */?
      • HAL_UART_Receive_DMA(&huart1, UART_RX_Buf, 15);接收中斷的啟動函數(shù),通過啟動接收,并在中止中斷里面再次開啟實現(xiàn)循環(huán)接收。其中15是最大的可接受的數(shù)據(jù)。
      • 具體使用,需要注意的是,printf函數(shù)需要自己加入printf支持。
        int main(void)
        {
          /* USER CODE BEGIN 1 */
        
          /* USER CODE END 1 */
        
          /* MCU Configuration--------------------------------------------------------*/
        
          /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
          HAL_Init();
        
          /* USER CODE BEGIN Init */
        
          /* USER CODE END Init */
        
          /* Configure the system clock */
          SystemClock_Config();
        
          /* USER CODE BEGIN SysInit */
        
          /* USER CODE END SysInit */
        
          /* Initialize all configured peripherals */
          MX_GPIO_Init();
          MX_DMA_Init();
          MX_USART1_UART_Init();
          /* USER CODE BEGIN 2 */
        	printf("123456789\r\n");
        	HAL_UART_Receive_DMA(&huart1, UART_RX_Buf, 15);
          /* USER CODE END 2 */
        
          /* Infinite loop */
          /* USER CODE BEGIN WHILE */
          while (1)
          {
            /* USER CODE END WHILE */
        
            /* USER CODE BEGIN 3 */
          }
          /* USER CODE END 3 */
        }
        ?
      • 結(jié)果

聲明:本內(nèi)容為作者獨立觀點,不代表電子星球立場。未經(jīng)允許不得轉(zhuǎn)載。授權(quán)事宜與稿件投訴,請聯(lián)系:editor@netbroad.com
本篇所含全部資料,點擊此處留下郵箱我會發(fā)給你
資料明細:使用IDLE中斷實現(xiàn)不定長數(shù)據(jù)接收。
覺得內(nèi)容不錯的朋友,別忘了一鍵三連哦!
贊 4
收藏 3
關(guān)注 11
成為作者 賺取收益
全部留言
0/200
  • dy-xGqRDsfq 2024-10-29 21:51
    老師,能不能發(fā)我一下資料,謝謝! 11****@****.com
    回復(fù) 1條回復(fù)
  • zhouspace 2022-03-27 09:07
    老師,能不能發(fā)我一下資料,謝謝! 14****@****.com
    回復(fù) 3條回復(fù)
  • 阿飛的秘術(shù)屋 2021-08-27 18:39
    老師,能不能發(fā)我一下資料,謝謝! 56****@****.com
    回復(fù) 3條回復(fù)
主站蜘蛛池模板: 亚洲三区在线观看无套内射 | 国产精区 | 澳门一级毛片 | 久久国产精品小视频 | 亚洲精品乱码久久久久膏 | 色综合伊人丁香五月桃花婷婷 | AV中文无码乱人伦在线观看 | 在线三级av| 中文字幕无码日本欧美大片 | 久久77 | 日本在线看片免费人成视频 | 国产不卡一二三区 | 51午夜精品视频 | 久久av视频 | 四虎精品免费 | 成人羞羞国产免费 | 67PAO国产成视频永久免费 | 日本亚洲网站 | 老司机福利在线视频 | 一边捏奶头一边高潮视频 | 久久久久久精品一区二区三区日本 | 精品99免费视频 | 性一交一乱一伦一色一情孩交 | 免费人成视频在线观看播放网站 | 久久一级黄色片 | 亚洲精品18 | 亚洲激情免费 | 女主播扒开屁股给粉丝看尿口 | 自拍偷拍另类亚洲 | 久久免费黄色网址 | 国内91视频 | 免费观看一级特黄欧美大片 | 波多野结衣无码免费视频 | 亚洲一区欧美一区 | 青青视频免费观看 | 一区三区在线观看 | 狠狠爱ADY亚洲色 | 斗破苍穹年番观看免费完整观看 | 精品一区二区三区日本视频 | 伊人一区二区三区 | 国产一级大毛片 |