找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 9896|回复: 1
打印 上一主题 下一主题
收起左侧

基于STM32车载LIN总线源码

[复制链接]
跳转到指定楼层
楼主
ID:410989 发表于 2018-10-17 11:13 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
STM32F0的UART虽然支持LIN模式,但是在HAL库中却缺少LIN总线相关的API函数。
基于对总线协议的研究,将USART HAL库进行改写,实现了LIN通信。
  1. HAL_StatusTypeDef HAL_UART_Receive_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size)
  2. {
  3.   /* Check that a Rx process is not already ongoing */
  4.   if(huart->RxState == HAL_UART_STATE_READY)
  5.   {
  6.     if((pData == NULL ) || (Size == 0U))
  7.     {
  8.       return HAL_ERROR;
  9.     }

  10.     /* In case of 9bits/No Parity transfer, pData buffer provided as input paramter
  11.        should be aligned on a u16 frontier, as data to be received from RDR will be
  12.        handled through a u16 cast. */
  13.     if ((huart->Init.WordLength == UART_WORDLENGTH_9B) && (huart->Init.Parity == UART_PARITY_NONE))
  14.     {
  15.       if((((uint32_t)pData)&1U) != 0U)
  16.       {
  17.         return  HAL_ERROR;
  18.       }
  19.     }

  20.     /* Process Locked */
  21.     __HAL_LOCK(huart);

  22.     huart->pRxBuffPtr = pData;
  23.     huart->RxXferSize = Size;
  24.     huart->RxXferCount = Size;

  25.     /* Computation of UART mask to apply to RDR register */
  26.     UART_MASK_COMPUTATION(huart);

  27.     huart->ErrorCode = HAL_UART_ERROR_NONE;
  28.     huart->RxState = HAL_UART_STATE_BUSY_RX;

  29.     /* Process Unlocked */
  30.     __HAL_UNLOCK(huart);

  31.     /* Enable the UART Error Interrupt: (Frame error, noise error, overrun error) */
  32.     SET_BIT(huart->Instance->CR3, USART_CR3_EIE);

  33.     /* Enable the UART Parity Error and Data Register not empty Interrupts */
  34.     //SET_BIT(huart->Instance->CR1, USART_CR1_PEIE | USART_CR1_RXNEIE);

  35.     return HAL_OK;
  36.   }
  37.   else
  38.   {
  39.     return HAL_BUSY;
  40.   }
  41. }
复制代码
  1. void HAL_UART_IRQHandler(UART_HandleTypeDef *huart)
  2. {
  3.   uint32_t isrflags   = READ_REG(huart->Instance->ISR);
  4.   uint32_t cr1its     = READ_REG(huart->Instance->CR1);
  5.   uint32_t cr3its;
  6.   uint32_t errorflags;
  7.         uint16_t ore_rdr_data;

  8.   /* If no error occurs */
  9.   errorflags = (isrflags & (uint32_t)(USART_ISR_PE | USART_ISR_FE | USART_ISR_ORE | USART_ISR_NE));
  10.   if (errorflags == RESET)
  11.   {
  12.                
  13.                 /* UART in ¿ÕÏÐÖжϣ¬½ÓÊÕÊý¾ÝÍê³É ---------------------------------------------------*/
  14.     if(((isrflags & USART_ISR_IDLE) != RESET) && ((cr1its & USART_CR1_IDLEIE) != RESET))
  15.     {
  16.       
  17.                         __HAL_UART_CLEAR_IT(huart, UART_CLEAR_IDLEF);
  18.                         
  19.                         /* Disable the UART Parity Error Interrupt and RXNE interrupt*/
  20.       CLEAR_BIT(huart->Instance->CR1, (USART_CR1_RXNEIE | USART_CR1_PEIE));

  21.       /* Disable the UART Error Interrupt: (Frame error, noise error, overrun error) */
  22.       CLEAR_BIT(huart->Instance->CR3, USART_CR3_EIE);
  23.       
  24.                         /* ½ûÖ¹IDLEIEÖÐ¶Ï */
  25.       CLEAR_BIT(huart->Instance->CR1, USART_CR1_IDLEIE);                        

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

  28.       HAL_UART_RxCpltCallback(huart);

  29.                         //UART_Receive_IT(huart);
  30.       return;
  31.     }
  32.                
  33.     /* UART in mode Receiver ---------------------------------------------------*/
  34.     if(((isrflags & USART_ISR_RXNE) != RESET) && ((cr1its & USART_CR1_RXNEIE) != RESET))
  35.     {
  36.       UART_Receive_IT(huart);
  37.       return;
  38.     }
  39.   }  

  40.   /* If some errors occur */
  41.   cr3its = READ_REG(huart->Instance->CR3);
  42.   if(   (errorflags != RESET)
  43.      && (   ((cr3its & USART_CR3_EIE) != RESET)
  44.          || ((cr1its & (USART_CR1_RXNEIE | USART_CR1_PEIE)) != RESET)) )
  45.   {
  46.     /* UART parity error interrupt occurred -------------------------------------*/
  47.     if(((isrflags & USART_ISR_PE) != RESET) && ((cr1its & USART_CR1_PEIE) != RESET))
  48.     {
  49.       __HAL_UART_CLEAR_IT(huart, UART_CLEAR_PEF);

  50.       huart->ErrorCode |= HAL_UART_ERROR_PE;
  51.     }

  52.     /* UART frame error interrupt occurred --------------------------------------*/
  53.     if(((isrflags & USART_ISR_FE) != RESET) && ((cr3its & USART_CR3_EIE) != RESET))
  54.     {
  55.       __HAL_UART_CLEAR_IT(huart, UART_CLEAR_FEF);
  56.                         __HAL_UART_CLEAR_IT(huart, UART_CLEAR_IDLEF);  //Çå³ý¿ÕÏбêÖ¾
  57.       huart->RxXferCount = huart->RxXferSize;
  58.                         //HAL_GPIO_TogglePin(LED1_GPIO_Port,LED1_Pin);
  59.                         SET_BIT(huart->Instance->CR1, USART_CR1_PEIE | USART_CR1_RXNEIE);//ʹÄܽÓÊÕÖжÏ
  60.                         SET_BIT(huart->Instance->CR1, USART_CR1_IDLEIE);//ʹÄÜ¿ÕÏÐÖжÏ
  61.       huart->ErrorCode |= HAL_UART_ERROR_FE;
  62.     }

  63.     /* UART noise error interrupt occurred --------------------------------------*/
  64.     if(((isrflags & USART_ISR_NE) != RESET) && ((cr3its & USART_CR3_EIE) != RESET))
  65.     {
  66.       __HAL_UART_CLEAR_IT(huart, UART_CLEAR_NEF);

  67.       huart->ErrorCode |= HAL_UART_ERROR_NE;
  68.     }
  69.    
  70.     /* UART Over-Run interrupt occurred -----------------------------------------*/
  71.     if(((isrflags & USART_ISR_ORE) != RESET) &&
  72.        (((cr1its & USART_CR1_RXNEIE) != RESET) || ((cr3its & USART_CR3_EIE) != RESET)))
  73.     {
  74.       __HAL_UART_CLEAR_IT(huart, UART_CLEAR_OREF);

  75.       huart->ErrorCode |= HAL_UART_ERROR_ORE;
  76.     }

  77.     /* Call UART Error Call back function if need be --------------------------*/
  78.     if(huart->ErrorCode != HAL_UART_ERROR_NONE)
  79.     {
  80.                         ore_rdr_data = (uint16_t) READ_REG(huart->Instance->RDR); //¶ÁÈ¡Êý¾Ý¼Ä´æÆ÷£¬ÇåÁã
  81.       /* UART in mode Receiver ---------------------------------------------------*/
  82.       if(((isrflags & USART_ISR_RXNE) != RESET) && ((cr1its & USART_CR1_RXNEIE) != RESET))
  83.       {
  84.         //UART_Receive_IT(huart);
  85.       }

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

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

  99.           /* Abort the UART DMA Rx channel */
  100.           if(huart->hdmarx != NULL)
  101.           {
  102.             /* Set the UART DMA Abort callback :
  103.                will lead to call HAL_UART_ErrorCallback() at end of DMA abort procedure */
  104.             huart->hdmarx->XferAbortCallback = UART_DMAAbortOnError;

  105.             /* Abort DMA RX */
  106.             if(HAL_DMA_Abort_IT(huart->hdmarx) != HAL_OK)
  107.             {
  108.               /* Call Directly huart->hdmarx->XferAbortCallback function in case of error */
  109.               huart->hdmarx->XferAbortCallback(huart->hdmarx);
  110.             }
  111.           }
  112.           else
  113.           {
  114.             /* Call user error callback */
  115.             HAL_UART_ErrorCallback(huart);
  116.           }
  117.         }
  118.         else
  119.         {
  120.           /* Call user error callback */
  121.           HAL_UART_ErrorCallback(huart);
  122.         }
  123.       }
  124.       else
  125.       {
  126.         /* Non Blocking error : transfer could go on.
  127.            Error is notified to user through user error callback */
  128.         HAL_UART_ErrorCallback(huart);
  129.         huart->ErrorCode = HAL_UART_ERROR_NONE;
  130.       }
  131.     }
  132.     return;

  133.   } /* End if some error occurs */

  134. #if !defined(STM32F030x6) && !defined(STM32F030x8)&& !defined(STM32F070xB)&& !defined(STM32F070x6)&& !defined(STM32F030xC)
  135.   /* UART wakeup from Stop mode interrupt occurred ---------------------------*/
  136.   if(((isrflags & USART_ISR_WUF) != RESET) && ((cr3its & USART_CR3_WUFIE) != RESET))
  137.   {
  138.     __HAL_UART_CLEAR_IT(huart, UART_CLEAR_WUF);
  139.     /* Set the UART state ready to be able to start again the process */
  140.     huart->gState  = HAL_UART_STATE_READY;
  141.     huart->RxState = HAL_UART_STATE_READY;
  142.     HAL_UARTEx_WakeupCallback(huart);
  143.     return;
  144.   }
  145. #endif /* !defined(STM32F030x6) && !defined(STM32F030x8)&& !defined(STM32F070xB)&& !defined(STM32F070x6)&& !defined(STM32F030xC) */

  146.   /* UART in mode Transmitter ------------------------------------------------*/
  147.   if(((isrflags & USART_ISR_TXE) != RESET) && ((cr1its & USART_CR1_TXEIE) != RESET))
  148.   {
  149.     UART_Transmit_IT(huart);
  150.     return;
  151.   }

  152.   /* UART in mode Transmitter (transmission end) -----------------------------*/
  153.   if(((isrflags & USART_ISR_TC) != RESET) && ((cr1its & USART_CR1_TCIE) != RESET))
  154.   {
  155.     UART_EndTransmit_IT(huart);
  156.     return;
  157.   }

  158. }
复制代码




分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏4 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:383373 发表于 2019-11-4 14:14 | 只看该作者
有完整工程么?分享出来看看哦!!!!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表