国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

STM32 HAL庫的串口中斷服務(wù)函數(shù)詳解

這篇具有很好參考價(jià)值的文章主要介紹了STM32 HAL庫的串口中斷服務(wù)函數(shù)詳解。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

前言

最近在實(shí)現(xiàn)利用上位機(jī)通過串口發(fā)送指令給下位機(jī)執(zhí)行操作的實(shí)驗(yàn),在之前學(xué)習(xí)串口的過程中我就一直有一個(gè)疑惑,那就是為什么在串口中斷回調(diào)函數(shù)內(nèi)除了要加上自己的操作以外還要在末尾再執(zhí)行一次接收中斷,在查閱了一些資料后我才發(fā)現(xiàn)原來和中斷服務(wù)函數(shù)有關(guān)

中斷服務(wù)流程

我們可以從這張圖看出串口收發(fā)數(shù)據(jù)的大致流程:

hdmarx errorcode 0x08000307,stm32,單片機(jī),arm

?串口收發(fā)的寄存器原理

我所使用的F1的串口收發(fā)是通過數(shù)據(jù)寄存器USART_DR來實(shí)現(xiàn)的,其內(nèi)部分為TDR(發(fā)送)RDR(接收),當(dāng)向寄存器寫入數(shù)據(jù)時(shí)串口會(huì)自動(dòng)發(fā)送,當(dāng)收到數(shù)據(jù)時(shí)會(huì)將數(shù)據(jù)存入該寄存器,對(duì)應(yīng)到HAL庫的API如下

HAL_StatusTypeDef HAL_UART_Receive(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout)
HAL_StatusTypeDef HAL_UART_Transmit(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout)

當(dāng)我們調(diào)用了中斷服務(wù)入口函數(shù)時(shí),向函數(shù)傳遞一個(gè)句柄,然后我們就會(huì)跳轉(zhuǎn)到真正的中斷服務(wù)函數(shù),在這里它會(huì)判斷需要進(jìn)入的是哪種類型的中斷(接收&傳輸),具體源代碼如下

void HAL_UART_IRQHandler(UART_HandleTypeDef *huart)
{
  uint32_t isrflags   = READ_REG(huart->Instance->SR);
  uint32_t cr1its     = READ_REG(huart->Instance->CR1);
  uint32_t cr3its     = READ_REG(huart->Instance->CR3);
  uint32_t errorflags = 0x00U;
  uint32_t dmarequest = 0x00U;

  /* If no error occurs */
  errorflags = (isrflags & (uint32_t)(USART_SR_PE | USART_SR_FE | USART_SR_ORE | USART_SR_NE));
  if (errorflags == RESET)
  {
    /* UART in mode Receiver -------------------------------------------------*/
    if (((isrflags & USART_SR_RXNE) != RESET) && ((cr1its & USART_CR1_RXNEIE) != RESET))
    {
      UART_Receive_IT(huart);
      return;
    }
  }

  /* If some errors occur */
  if ((errorflags != RESET) && (((cr3its & USART_CR3_EIE) != RESET) || ((cr1its & (USART_CR1_RXNEIE | USART_CR1_PEIE)) != RESET)))
  {
    /* UART parity error interrupt occurred ----------------------------------*/
    if (((isrflags & USART_SR_PE) != RESET) && ((cr1its & USART_CR1_PEIE) != RESET))
    {
      huart->ErrorCode |= HAL_UART_ERROR_PE;
    }

    /* UART noise error interrupt occurred -----------------------------------*/
    if (((isrflags & USART_SR_NE) != RESET) && ((cr3its & USART_CR3_EIE) != RESET))
    {
      huart->ErrorCode |= HAL_UART_ERROR_NE;
    }

    /* UART frame error interrupt occurred -----------------------------------*/
    if (((isrflags & USART_SR_FE) != RESET) && ((cr3its & USART_CR3_EIE) != RESET))
    {
      huart->ErrorCode |= HAL_UART_ERROR_FE;
    }

    /* UART Over-Run interrupt occurred --------------------------------------*/
    if (((isrflags & USART_SR_ORE) != RESET) && (((cr1its & USART_CR1_RXNEIE) != RESET) || ((cr3its & USART_CR3_EIE) != RESET)))
    {
      huart->ErrorCode |= HAL_UART_ERROR_ORE;
    }

    /* Call UART Error Call back function if need be --------------------------*/
    if (huart->ErrorCode != HAL_UART_ERROR_NONE)
    {
      /* UART in mode Receiver -----------------------------------------------*/
      if (((isrflags & USART_SR_RXNE) != RESET) && ((cr1its & USART_CR1_RXNEIE) != RESET))
      {
        UART_Receive_IT(huart);
      }

      /* If Overrun error occurs, or if any error occurs in DMA mode reception,
         consider error as blocking */
      dmarequest = HAL_IS_BIT_SET(huart->Instance->CR3, USART_CR3_DMAR);
      if (((huart->ErrorCode & HAL_UART_ERROR_ORE) != RESET) || dmarequest)
      {
        /* Blocking error : transfer is aborted
           Set the UART state ready to be able to start again the process,
           Disable Rx Interrupts, and disable Rx DMA request, if ongoing */
        UART_EndRxTransfer(huart);

        /* Disable the UART DMA Rx request if enabled */
        if (HAL_IS_BIT_SET(huart->Instance->CR3, USART_CR3_DMAR))
        {
          CLEAR_BIT(huart->Instance->CR3, USART_CR3_DMAR);

          /* Abort the UART DMA Rx channel */
          if (huart->hdmarx != NULL)
          {
            /* Set the UART DMA Abort callback :
               will lead to call HAL_UART_ErrorCallback() at end of DMA abort procedure */
            huart->hdmarx->XferAbortCallback = UART_DMAAbortOnError;
            if (HAL_DMA_Abort_IT(huart->hdmarx) != HAL_OK)
            {
              /* Call Directly XferAbortCallback function in case of error */
              huart->hdmarx->XferAbortCallback(huart->hdmarx);
            }
          }
          else
          {
            /* Call user error callback */
#if (USE_HAL_UART_REGISTER_CALLBACKS == 1)
            /*Call registered error callback*/
            huart->ErrorCallback(huart);
#else
            /*Call legacy weak error callback*/
            HAL_UART_ErrorCallback(huart);
#endif /* USE_HAL_UART_REGISTER_CALLBACKS */
          }
        }
        else
        {
          /* Call user error callback */
#if (USE_HAL_UART_REGISTER_CALLBACKS == 1)
          /*Call registered error callback*/
          huart->ErrorCallback(huart);
#else
          /*Call legacy weak error callback*/
          HAL_UART_ErrorCallback(huart);
#endif /* USE_HAL_UART_REGISTER_CALLBACKS */
        }
      }
      else
      {
        /* Non Blocking error : transfer could go on.
           Error is notified to user through user error callback */
#if (USE_HAL_UART_REGISTER_CALLBACKS == 1)
        /*Call registered error callback*/
        huart->ErrorCallback(huart);
#else
        /*Call legacy weak error callback*/
        HAL_UART_ErrorCallback(huart);
#endif /* USE_HAL_UART_REGISTER_CALLBACKS */

        huart->ErrorCode = HAL_UART_ERROR_NONE;
      }
    }
    return;
  } /* End if some error occurs */

  /* Check current reception Mode :
     If Reception till IDLE event has been selected : */
  if (  (huart->ReceptionType == HAL_UART_RECEPTION_TOIDLE)
      &&((isrflags & USART_SR_IDLE) != 0U)
      &&((cr1its & USART_SR_IDLE) != 0U))
  {
    __HAL_UART_CLEAR_IDLEFLAG(huart);

    /* Check if DMA mode is enabled in UART */
    if (HAL_IS_BIT_SET(huart->Instance->CR3, USART_CR3_DMAR))
    {
      /* DMA mode enabled */
      /* Check received length : If all expected data are received, do nothing,
         (DMA cplt callback will be called).
         Otherwise, if at least one data has already been received, IDLE event is to be notified to user */
      uint16_t nb_remaining_rx_data = (uint16_t) __HAL_DMA_GET_COUNTER(huart->hdmarx);
      if (  (nb_remaining_rx_data > 0U)
          &&(nb_remaining_rx_data < huart->RxXferSize))
      {
        /* Reception is not complete */
        huart->RxXferCount = nb_remaining_rx_data;

        /* In Normal mode, end DMA xfer and HAL UART Rx process*/
        if (huart->hdmarx->Init.Mode != DMA_CIRCULAR)
        {
          /* Disable PE and ERR (Frame error, noise error, overrun error) interrupts */
          CLEAR_BIT(huart->Instance->CR1, USART_CR1_PEIE);
          CLEAR_BIT(huart->Instance->CR3, USART_CR3_EIE);

          /* Disable the DMA transfer for the receiver request by resetting the DMAR bit
             in the UART CR3 register */
          CLEAR_BIT(huart->Instance->CR3, USART_CR3_DMAR);

          /* At end of Rx process, restore huart->RxState to Ready */
          huart->RxState = HAL_UART_STATE_READY;
          huart->ReceptionType = HAL_UART_RECEPTION_STANDARD;

          CLEAR_BIT(huart->Instance->CR1, USART_CR1_IDLEIE);

          /* Last bytes received, so no need as the abort is immediate */
          (void)HAL_DMA_Abort(huart->hdmarx);
        }
#if (USE_HAL_UART_REGISTER_CALLBACKS == 1)
        /*Call registered Rx Event callback*/
        huart->RxEventCallback(huart, (huart->RxXferSize - huart->RxXferCount));
#else
        /*Call legacy weak Rx Event callback*/
        HAL_UARTEx_RxEventCallback(huart, (huart->RxXferSize - huart->RxXferCount));
#endif
      }
      return;
    }
    else
    {
      /* DMA mode not enabled */
      /* Check received length : If all expected data are received, do nothing.
         Otherwise, if at least one data has already been received, IDLE event is to be notified to user */
      uint16_t nb_rx_data = huart->RxXferSize - huart->RxXferCount;
      if (  (huart->RxXferCount > 0U)
          &&(nb_rx_data > 0U) )
      {
        /* Disable the UART Parity Error Interrupt and RXNE interrupts */
        CLEAR_BIT(huart->Instance->CR1, (USART_CR1_RXNEIE | USART_CR1_PEIE));

        /* Disable the UART Error Interrupt: (Frame error, noise error, overrun error) */
        CLEAR_BIT(huart->Instance->CR3, USART_CR3_EIE);

        /* Rx process is completed, restore huart->RxState to Ready */
        huart->RxState = HAL_UART_STATE_READY;
        huart->ReceptionType = HAL_UART_RECEPTION_STANDARD;

        CLEAR_BIT(huart->Instance->CR1, USART_CR1_IDLEIE);
#if (USE_HAL_UART_REGISTER_CALLBACKS == 1)
        /*Call registered Rx complete callback*/
        huart->RxEventCallback(huart, nb_rx_data);
#else
        /*Call legacy weak Rx Event callback*/
        HAL_UARTEx_RxEventCallback(huart, nb_rx_data);
#endif
      }
      return;
    }
  }

  /* UART in mode Transmitter ------------------------------------------------*/
  if (((isrflags & USART_SR_TXE) != RESET) && ((cr1its & USART_CR1_TXEIE) != RESET))
  {
    UART_Transmit_IT(huart);
    return;
  }

  /* UART in mode Transmitter end --------------------------------------------*/
  if (((isrflags & USART_SR_TC) != RESET) && ((cr1its & USART_CR1_TCIE) != RESET))
  {
    UART_EndTransmit_IT(huart);
    return;
  }
}

我們只需要挑關(guān)鍵的地方來看:在代碼的最開頭定義了幾個(gè)標(biāo)志位,用于判斷是否為接收類型的中斷,如果是的話則調(diào)用接收中斷函數(shù),代碼如下

static HAL_StatusTypeDef UART_Receive_IT(UART_HandleTypeDef *huart)
{
  uint8_t  *pdata8bits;
  uint16_t *pdata16bits;

  /* Check that a Rx process is ongoing */
  if (huart->RxState == HAL_UART_STATE_BUSY_RX)
  {
    if ((huart->Init.WordLength == UART_WORDLENGTH_9B) && (huart->Init.Parity == UART_PARITY_NONE))
    {
      pdata8bits  = NULL;
      pdata16bits = (uint16_t *) huart->pRxBuffPtr;
      *pdata16bits = (uint16_t)(huart->Instance->DR & (uint16_t)0x01FF);
      huart->pRxBuffPtr += 2U;
    }
    else
    {
      pdata8bits = (uint8_t *) huart->pRxBuffPtr;
      pdata16bits  = NULL;

      if ((huart->Init.WordLength == UART_WORDLENGTH_9B) || ((huart->Init.WordLength == UART_WORDLENGTH_8B) && (huart->Init.Parity == UART_PARITY_NONE)))
      {
        *pdata8bits = (uint8_t)(huart->Instance->DR & (uint8_t)0x00FF);
      }
      else
      {
        *pdata8bits = (uint8_t)(huart->Instance->DR & (uint8_t)0x007F);
      }
      huart->pRxBuffPtr += 1U;
    }

    if (--huart->RxXferCount == 0U)
    {
      /* Disable the UART Data Register not empty Interrupt */
      __HAL_UART_DISABLE_IT(huart, UART_IT_RXNE);

      /* Disable the UART Parity Error Interrupt */
      __HAL_UART_DISABLE_IT(huart, UART_IT_PE);

      /* Disable the UART Error Interrupt: (Frame error, noise error, overrun error) */
      __HAL_UART_DISABLE_IT(huart, UART_IT_ERR);

      /* Rx process is completed, restore huart->RxState to Ready */
      huart->RxState = HAL_UART_STATE_READY;

      /* Check current reception Mode :
         If Reception till IDLE event has been selected : */
      if (huart->ReceptionType == HAL_UART_RECEPTION_TOIDLE)
      {
        /* Set reception type to Standard */
        huart->ReceptionType = HAL_UART_RECEPTION_STANDARD;

        /* Disable IDLE interrupt */
        CLEAR_BIT(huart->Instance->CR1, USART_CR1_IDLEIE);

        /* Check if IDLE flag is set */
        if (__HAL_UART_GET_FLAG(huart, UART_FLAG_IDLE))
        {
          /* Clear IDLE flag in ISR */
          __HAL_UART_CLEAR_IDLEFLAG(huart);
        }

#if (USE_HAL_UART_REGISTER_CALLBACKS == 1)
        /*Call registered Rx Event callback*/
        huart->RxEventCallback(huart, huart->RxXferSize);
#else
        /*Call legacy weak Rx Event callback*/
        HAL_UARTEx_RxEventCallback(huart, huart->RxXferSize);
#endif
      }
      else
      {
       /* Standard reception API called */
#if (USE_HAL_UART_REGISTER_CALLBACKS == 1)		  
       /*Call registered Rx complete callback*/
       huart->RxCpltCallback(huart);
#else
       /*Call legacy weak Rx complete callback*/
       HAL_UART_RxCpltCallback(huart);
#endif /* USE_HAL_UART_REGISTER_CALLBACKS */
      }

      return HAL_OK;
    }
    return HAL_OK;
  }
  else
  {
    return HAL_BUSY;
  }
}

可以看到這個(gè)函數(shù)的作用是將每次中斷接收到的字符保存在串口的緩存指針中,同時(shí)計(jì)數(shù)器變量自減1,當(dāng)計(jì)數(shù)器為0時(shí)調(diào)用回調(diào)函數(shù)實(shí)現(xiàn)用戶處理邏輯

串口句柄具體定義如下

typedef struct __UART_HandleTypeDef
{
  USART_TypeDef                 *Instance;        /*!< UART registers base address        */

  UART_InitTypeDef              Init;             /*!< UART communication parameters      */

  uint8_t                       *pTxBuffPtr;      /*!< Pointer to UART Tx transfer Buffer */

  uint16_t                      TxXferSize;       /*!< UART Tx Transfer size              */

  __IO uint16_t                 TxXferCount;      /*!< UART Tx Transfer Counter           */

  uint8_t                       *pRxBuffPtr;      /*!< Pointer to UART Rx transfer Buffer */

  uint16_t                      RxXferSize;       /*!< UART Rx Transfer size              */

  __IO uint16_t                 RxXferCount;      /*!< UART Rx Transfer Counter           */

  __IO HAL_UART_RxTypeTypeDef ReceptionType;      /*!< Type of ongoing reception          */

  DMA_HandleTypeDef             *hdmatx;          /*!< UART Tx DMA Handle parameters      */

  DMA_HandleTypeDef             *hdmarx;          /*!< UART Rx DMA Handle parameters      */

  HAL_LockTypeDef               Lock;             /*!< Locking object                     */

  __IO HAL_UART_StateTypeDef    gState;           /*!< UART state information related to global Handle management
                                                       and also related to Tx operations.
                                                       This parameter can be a value of @ref HAL_UART_StateTypeDef */

  __IO HAL_UART_StateTypeDef    RxState;          /*!< UART state information related to Rx operations.
                                                       This parameter can be a value of @ref HAL_UART_StateTypeDef */

  __IO uint32_t                 ErrorCode;        /*!< UART Error code                    */

#if (USE_HAL_UART_REGISTER_CALLBACKS == 1)
  void (* TxHalfCpltCallback)(struct __UART_HandleTypeDef *huart);        /*!< UART Tx Half Complete Callback        */
  void (* TxCpltCallback)(struct __UART_HandleTypeDef *huart);            /*!< UART Tx Complete Callback             */
  void (* RxHalfCpltCallback)(struct __UART_HandleTypeDef *huart);        /*!< UART Rx Half Complete Callback        */
  void (* RxCpltCallback)(struct __UART_HandleTypeDef *huart);            /*!< UART Rx Complete Callback             */
  void (* ErrorCallback)(struct __UART_HandleTypeDef *huart);             /*!< UART Error Callback                   */
  void (* AbortCpltCallback)(struct __UART_HandleTypeDef *huart);         /*!< UART Abort Complete Callback          */
  void (* AbortTransmitCpltCallback)(struct __UART_HandleTypeDef *huart); /*!< UART Abort Transmit Complete Callback */
  void (* AbortReceiveCpltCallback)(struct __UART_HandleTypeDef *huart);  /*!< UART Abort Receive Complete Callback  */
  void (* WakeupCallback)(struct __UART_HandleTypeDef *huart);            /*!< UART Wakeup Callback                  */
  void (* RxEventCallback)(struct __UART_HandleTypeDef *huart, uint16_t Pos); /*!< UART Reception Event Callback     */

  void (* MspInitCallback)(struct __UART_HandleTypeDef *huart);           /*!< UART Msp Init callback                */
  void (* MspDeInitCallback)(struct __UART_HandleTypeDef *huart);         /*!< UART Msp DeInit callback              */
#endif  /* USE_HAL_UART_REGISTER_CALLBACKS */

} UART_HandleTypeDef;

因此現(xiàn)在我們可以大致明白為何在回調(diào)函數(shù)內(nèi)還需要再進(jìn)一次中斷了:當(dāng)我們?cè)诨卣{(diào)函數(shù)中調(diào)用

HAL_UART_Receive_IT

其會(huì)跳轉(zhuǎn)到

UART_Start_Receive_IT

更新串口句柄中的具體內(nèi)容,我們緩沖區(qū)的數(shù)據(jù)量也是在這個(gè)時(shí)候被傳入的

而當(dāng)有數(shù)據(jù)傳輸來的時(shí)候,在函數(shù)內(nèi)部就會(huì)對(duì)SR寄存器的位進(jìn)行賦值

hdmarx errorcode 0x08000307,stm32,單片機(jī),arm

?此時(shí)會(huì)產(chǎn)生硬件中斷,進(jìn)入中斷服務(wù)函數(shù),在服務(wù)函數(shù)內(nèi)部其會(huì)通過前面已經(jīng)寫下的標(biāo)志位判斷到底是要接收還是發(fā)送,而只有當(dāng)真正有數(shù)據(jù)接收到時(shí)接收數(shù)據(jù)標(biāo)志位才會(huì)被賦值,因此在沒有接收到數(shù)據(jù)時(shí)是不會(huì)進(jìn)入中斷的,直到接收到數(shù)據(jù),然而如果我們不寫這一條語句的話,那么即使我們向串口發(fā)送數(shù)據(jù),中斷服務(wù)函數(shù)也不會(huì)啟動(dòng),因?yàn)榇藭r(shí)只有接收數(shù)據(jù)位被賦值。

補(bǔ)充

這里我再補(bǔ)充一下,當(dāng)我們調(diào)用串口接收中斷函數(shù)時(shí),有可能會(huì)產(chǎn)生發(fā)送數(shù)據(jù)過長(zhǎng)導(dǎo)致終端阻塞的問題,因此我們需要設(shè)置一個(gè)標(biāo)志位重新進(jìn)入中斷

hdmarx errorcode 0x08000307,stm32,單片機(jī),arm

?當(dāng)中斷阻塞時(shí),timeout就會(huì)被置為1,此時(shí)循環(huán)中的判斷就會(huì)重新再進(jìn)入一次中斷并清除標(biāo)志位直至數(shù)據(jù)全部收完

hdmarx errorcode 0x08000307,stm32,單片機(jī),arm

?文章來源地址http://www.zghlxwxcb.cn/news/detail-693636.html

到了這里,關(guān)于STM32 HAL庫的串口中斷服務(wù)函數(shù)詳解的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 【STM32】基于HAL庫的中斷詳細(xì)學(xué)習(xí)

    【STM32】基于HAL庫的中斷詳細(xì)學(xué)習(xí)

    1.中斷概述 1.1中斷相關(guān)概念 1.2 STM32中斷系統(tǒng) 2 .HAL庫的中斷處理 2.1 HAL 庫的中斷封裝 2.2 外部中斷處理流程 3.外部中斷的HAL庫定義 3.1. 外部中斷的數(shù)據(jù)類型 3.2. 外部中斷的接口函數(shù) 在計(jì)算機(jī)系統(tǒng)中,處理器常常需要與外部設(shè)備進(jìn)行數(shù)據(jù)傳輸。常見的數(shù)據(jù)傳輸方式有以下四種:

    2024年02月02日
    瀏覽(34)
  • 【STM32】CUBEMX之串口:串口三種模式(輪詢模式、中斷模式、DMA模式)的配置與使用示例 + 串口重定向 + 使用HAL擴(kuò)展函數(shù)實(shí)現(xiàn)不定長(zhǎng)數(shù)據(jù)接收

    【STM32】CUBEMX之串口:串口三種模式(輪詢模式、中斷模式、DMA模式)的配置與使用示例 + 串口重定向 + 使用HAL擴(kuò)展函數(shù)實(shí)現(xiàn)不定長(zhǎng)數(shù)據(jù)接收

    目錄 ? 總覽 使用CUBEMX創(chuàng)建工程的基本配置 CUBEMX中的配置 Keil中的配置 實(shí)物連接 串口輪詢模式 輪詢模式HAL庫函數(shù) 特點(diǎn) 實(shí)驗(yàn)一:發(fā)送數(shù)據(jù)給單片機(jī)并讓其返回相同值 串口重定向 串口中斷模式 在CUBEMX中打開串口中斷 中斷模式HAL庫函數(shù) 特點(diǎn) 實(shí)驗(yàn)二:使用中斷回調(diào)完成實(shí)驗(yàn)一

    2024年04月10日
    瀏覽(44)
  • STM32(HAL)串口中斷接收

    STM32(HAL)串口中斷接收

    目錄 1、簡(jiǎn)介 2?基礎(chǔ)配置 2.1.1 SYS配置 ?2.1.2 RCC配置 2.2?串口外設(shè)配置 ?2.3 項(xiàng)目生成 ?3、KEIL端程序整合 本文對(duì)HAL串口中斷函數(shù)進(jìn)行介紹。 2.1.1 SYS配置 ?2.1.2 RCC配置 首先在main.c文件中進(jìn)行接受變量聲明。 ?接著在主函數(shù)的while循環(huán)中進(jìn)行接收中斷,如下所示: ?最后在主函數(shù)

    2024年02月14日
    瀏覽(38)
  • STM32:基于HAL 庫的外部中斷按鍵以及消抖

    STM32:基于HAL 庫的外部中斷按鍵以及消抖

    第一次寫博客,有錯(cuò)誤與問題歡迎指正。 這部分直接上代碼,假設(shè)PB5為輸入端且上拉,PB11為輸出。 在CubeMx中配置完引腳(下降沿觸發(fā))并在NVIC中開啟外部中斷后,我們注意到,上一個(gè)程序有5個(gè)要素(我寫了注釋的5個(gè)): 中斷回調(diào)函數(shù)HAL_GPIO_EXTI_Callback是一個(gè)虛函數(shù),我們

    2024年04月10日
    瀏覽(42)
  • STM32 HAL庫 串口中斷接收數(shù)據(jù)包

    STM32 HAL庫 串口中斷接收數(shù)據(jù)包

    目錄 一、CUBEmx配置 1.設(shè)置系統(tǒng)時(shí)鐘,配置SYS,配置時(shí)鐘樹 ??編輯 ?2.配置串口USART1 3.配置NVIC,開啟串口中斷 ?編輯4.點(diǎn)擊GENERATE CODE輸出文件即可 二、代碼部分 0.串口重定向——printf 1.關(guān)于舵機(jī) 2.開啟串口中斷函數(shù) 3.編寫串口回調(diào)函數(shù) 4.主函數(shù)部分 三、實(shí)驗(yàn)現(xiàn)象: 四、總

    2024年02月04日
    瀏覽(23)
  • 【STM32】HAL庫 串口中斷發(fā)送與接收

    【STM32】HAL庫 串口中斷發(fā)送與接收

    【STM32】HAL庫 新建MDK工程 【STM32】HAL庫 串口輪詢發(fā)送 使用stm32串口中斷發(fā)送和中斷接收 在主函數(shù)前開啟中斷,接受字節(jié)數(shù)為5 接受5個(gè)字節(jié)后,進(jìn)入中斷接收完成回調(diào)函數(shù),重新再開啟中斷,并把接收到的數(shù)據(jù)返回 修改接收數(shù)組長(zhǎng)度,改為開啟串口空閑中斷 接收事件回調(diào)函數(shù)

    2024年02月08日
    瀏覽(31)
  • 【STM32】HAL庫——串口中斷只接收到兩個(gè)字符

    環(huán)境:STM32CubeMX(6.7.0)+MDK-ARM(V5.36.0.0)+STM32F103C8T6 使用XCOM發(fā)送字符串(總共8個(gè)字符),單片機(jī)進(jìn)行解析為ModBus協(xié)議失敗,只接收到前兩個(gè)字節(jié)的數(shù)據(jù)。 原串口中斷回調(diào)函數(shù): 去掉串口中斷回調(diào)函數(shù)的printf函數(shù)即可 在嵌入式系統(tǒng)中,將printf函數(shù)直接放在串口中斷服務(wù)程序(ISR)中

    2024年01月22日
    瀏覽(23)
  • STM32—HAL庫中斷/DMA控制和完成串口通信

    STM32—HAL庫中斷/DMA控制和完成串口通信

    目錄 一、解決的問題 二、串口通訊協(xié)議和RS-232的介紹以及USB/TTL轉(zhuǎn)232模塊的工作原理? ?1、?串口協(xié)議和RS-232標(biāo)準(zhǔn): ?(1)串口協(xié)議: (2)RS-232 標(biāo)準(zhǔn):? ?2、RS232電平與TTL電平的區(qū)別? ?3、USB/TTL轉(zhuǎn)232“模塊(CH340芯片為例)? (1)基本原理:? (2)CH340模塊介紹: ?三、搭

    2024年02月02日
    瀏覽(30)
  • stm32標(biāo)準(zhǔn)庫和HAL庫的對(duì)比學(xué)習(xí)3.《學(xué)習(xí)外部中斷EXIT和應(yīng)用》

    stm32標(biāo)準(zhǔn)庫和HAL庫的對(duì)比學(xué)習(xí)3.《學(xué)習(xí)外部中斷EXIT和應(yīng)用》

    ? ? ? ? 本人是大一的學(xué)生,學(xué)習(xí)了一段時(shí)間的stm32,此系列博客為個(gè)人的學(xué)習(xí)筆記,方便個(gè)人復(fù)習(xí),如有錯(cuò)誤或問題,非常非常歡迎大家來大力指正。 簡(jiǎn)單用文字說一下原理。 如果先要清楚了解建議去b站看一下keysking大佬的教程,很有趣易懂( 本視頻的部分圖也來自keys

    2024年01月19日
    瀏覽(28)
  • stm32使用HAL庫配置串口中斷收發(fā)數(shù)據(jù)(保姆級(jí)教程)

    stm32使用HAL庫配置串口中斷收發(fā)數(shù)據(jù)(保姆級(jí)教程)

    最近在學(xué)習(xí)使用hal庫,之前都是用標(biāo)準(zhǔn)庫來寫32代碼,所以發(fā)個(gè)帖子記錄一下學(xué)習(xí)過程,同時(shí)也希望能幫助到一些也在學(xué)習(xí)HAL庫的同學(xué)。 接下來進(jìn)入正題 串口中斷是指當(dāng)單片機(jī)收到一個(gè)串口數(shù)據(jù)時(shí),單片機(jī)會(huì)產(chǎn)生一個(gè)中斷信號(hào),通知處理器中斷服務(wù)程序去處理這個(gè)接收到的數(shù)

    2024年02月07日
    瀏覽(23)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包