STM32G474xx HAL 用户手册
stm32g4xx_hal_fdcan.c
跳转到该文件的文档。
00001 /**
00002   ******************************************************************************
00003   * @file    stm32g4xx_hal_fdcan.c
00004   * @author  MCD Application Team
00005   * @brief   FDCAN HAL 模块驱动。
00006   *          本文件提供了用于管理灵活数据速率控制器局域网
00007   *          (FDCAN) 外设以下功能的固件函数:
00008   *           + 初始化和反初始化函数
00009   *           + IO操作函数
00010   *           + 外设配置和控制函数
00011   *           + 外设状态和错误函数
00012   ******************************************************************************
00013   * @attention
00014   *
00015   * Copyright (c) 2019 STMicroelectronics.
00016   * All rights reserved.
00017   *
00018   * This software is licensed under terms that can be found in the LICENSE file
00019   * in the root directory of this software component.
00020   * If no LICENSE file comes with this software, it is provided AS-IS.
00021   *
00023   ******************************************************************************
00024   @verbatim
00025   ==============================================================================
00026                         ##### 如何使用此驱动 #####
00027   ==============================================================================
00028     [..]
00029       (#) 使用 HAL_FDCAN_Init 函数初始化 FDCAN 外设。
00030 
00031       (#) 如有需要,使用以下配置函数配置接收滤波器和可选功能:
00032             (++) HAL_FDCAN_ConfigFilter
00033             (++) HAL_FDCAN_ConfigGlobalFilter
00034             (++) HAL_FDCAN_ConfigExtendedIdMask
00035             (++) HAL_FDCAN_ConfigRxFifoOverwrite
00036             (++) HAL_FDCAN_ConfigRamWatchdog
00037             (++) HAL_FDCAN_ConfigTimestampCounter
00038             (++) HAL_FDCAN_EnableTimestampCounter
00039             (++) HAL_FDCAN_DisableTimestampCounter
00040             (++) HAL_FDCAN_ConfigTimeoutCounter
00041             (++) HAL_FDCAN_EnableTimeoutCounter
00042             (++) HAL_FDCAN_DisableTimeoutCounter
00043             (++) HAL_FDCAN_ConfigTxDelayCompensation
00044             (++) HAL_FDCAN_EnableTxDelayCompensation
00045             (++) HAL_FDCAN_DisableTxDelayCompensation
00046             (++) HAL_FDCAN_EnableISOMode
00047             (++) HAL_FDCAN_DisableISOMode
00048             (++) HAL_FDCAN_EnableEdgeFiltering
00049             (++) HAL_FDCAN_DisableEdgeFiltering
00050 
00051       (#) 使用 HAL_FDCAN_Start 函数启动 FDCAN 模块。在此级别,
00052           节点在总线上处于活动状态:它可以发送和接收消息。
00053 
00055       (#) 以下 Tx 控制函数只能在 FDCAN 模块启动后调用:

00056             (++) HAL_FDCAN_AddMessageToTxFifoQ
00057             (++) HAL_FDCAN_AbortTxRequest
00058 
00059       (#) 在 Tx FIFO 或队列中提交 Tx 请求后,可以使用
00060           HAL_FDCAN_GetLatestTxFifoQRequestBuffer API 获取用于放置 Tx 请求的 Tx 缓冲区位置。
00061           之后可以使用 HAL_FDCAN_AbortTxRequest API 中止相应的 Tx 请求。
00063 
00064       (#) 当消息接收到 FDCAN 消息 RAM 时,可以使用 HAL_FDCAN_GetRxMessage 函数检索。
00066 
00067       (#) 调用 HAL_FDCAN_Stop 函数停止 FDCAN 模块,使其进入
00068           初始化模式并重新启用通过上述配置函数访问配置寄存器。
00070 
00072       (#) 初始化阶段后,可以随时调用所有其他控制函数,

00073           无论 FDCAN 模块是已启动还是已停止。
00074 
00075       *** 轮询模式操作 ***
00076       ==============================
00077     [..]
00078         (#) 可以通过以下函数监控接收和传输状态:
00079             函数:
00080               (++) HAL_FDCAN_IsTxBufferMessagePending
00081               (++) HAL_FDCAN_GetRxFifoFillLevel
00082               (++) HAL_FDCAN_GetTxFifoFreeLevel
00083 
00084       *** 中断模式操作 ***
00085       ================================
00086       [..]
00087         (#) 有两条中断线:0 和 1。
00088             默认情况下,所有中断都分配给线 0。可以使用 HAL_FDCAN_ConfigInterruptLines 函数配置中断线。
00089 
00090         (#) 使用 HAL_FDCAN_ActivateNotification 函数激活通知。
00091             然后,可以通过可用的用户回调之一 HAL_FDCAN_xxxCallback 控制处理过程。
00092 
00093   *** 回调注册 ***
00094   =============================================
00095 
00096   当编译定义 USE_HAL_FDCAN_REGISTER_CALLBACKS 设置为 1 时,
00097   允许用户动态配置驱动回调。
00099   使用函数 HAL_FDCAN_RegisterCallback() 或 HAL_FDCAN_RegisterXXXCallback()
00100   注册中断回调。
00101 
00102   函数 HAL_FDCAN_RegisterCallback() 允许注册以下回调:
00103     (+) TxFifoEmptyCallback          : Tx FIFO 空回调。
00104     (+) HighPriorityMessageCallback  : 高优先级消息回调。
00105     (+) TimestampWraparoundCallback  : 时间戳回绕回调。
00106     (+) TimeoutOccurredCallback      : 超时发生回调。
00107     (+) ErrorCallback                : 错误回调。
00108     (+) MspInitCallback              : FDCAN MspInit。
00109     (+) MspDeInitCallback            : FDCAN MspDeInit。
00110   此函数需要 HAL 外设句柄、回调 ID 和用户回调函数指针作为参数。
00111 
00112   对于特定回调 TxEventFifoCallback、RxFifo0Callback、RxFifo1Callback、
00113   TxBufferCompleteCallback、TxBufferAbortCallback 和 ErrorStatusCallback,使用专用的
00114   注册回调:分别为 HAL_FDCAN_RegisterTxEventFifoCallback()、
00115   HAL_FDCAN_RegisterRxFifo0Callback()、HAL_FDCAN_RegisterRxFifo1Callback()、
00116   HAL_FDCAN_RegisterTxBufferCompleteCallback()、HAL_FDCAN_RegisterTxBufferAbortCallback()
00117   和 HAL_FDCAN_RegisterErrorStatusCallback()。
00118 
00119   使用函数 HAL_FDCAN_UnRegisterCallback() 将回调重置为默认的
00120   弱函数。
00121   HAL_FDCAN_UnRegisterCallback 接受 HAL 外设句柄和
00122   回调 ID 作为参数。
00123   此函数允许重置以下回调:
00124     (+) TxFifoEmptyCallback          : Tx FIFO 空回调。
00125     (+) HighPriorityMessageCallback  : 高优先级消息回调。
00126     (+) TimestampWraparoundCallback  : 时间戳回绕回调。
00127     (+) TimeoutOccurredCallback      : 超时发生回调。
00128     (+) ErrorCallback                : 错误回调。
00129     (+) MspInitCallback              : FDCAN MspInit。
00130     (+) MspDeInitCallback            : FDCAN MspDeInit。
00131 
00132   对于特定回调 TxEventFifoCallback、RxFifo0Callback、RxFifo1Callback、
00133   TxBufferCompleteCallback 和 TxBufferAbortCallback,使用专用的
00135   取消注册回调:分别为 HAL_FDCAN_UnRegisterTxEventFifoCallback()、

00136   HAL_FDCAN_UnRegisterRxFifo0Callback()、HAL_FDCAN_UnRegisterRxFifo1Callback()、
00137   HAL_FDCAN_UnRegisterTxBufferCompleteCallback()、HAL_FDCAN_UnRegisterTxBufferAbortCallback()
00138   和 HAL_FDCAN_UnRegisterErrorStatusCallback()。
00139 
00140   默认情况下,在 HAL_FDCAN_Init() 之后且当状态为 HAL_FDCAN_STATE_RESET 时,
00141   所有回调都设置为相应的弱函数:
00142   例如 HAL_FDCAN_ErrorCallback()。
00143   MspInit 和 MspDeInit 函数例外,它们在 HAL_FDCAN_Init()/HAL_FDCAN_DeInit() 中
00144   仅当这些回调为空(之前未注册)时才重置为传统弱函数。
00145   否则,如果 MspInit 或 MspDeInit 不为空,HAL_FDCAN_Init()/HAL_FDCAN_DeInit()
00146   会保留并使用用户的 MspInit/MspDeInit 回调(之前已注册)
00147 
00148   回调只能在 HAL_FDCAN_STATE_READY 状态下注册/取消注册。
00149   MspInit/MspDeInit 例外,它们可以在 HAL_FDCAN_STATE_READY 或 HAL_FDCAN_STATE_RESET 状态下注册/取消注册,
00150   因此注册的(用户)MspInit/DeInit 回调可以在 Init/DeInit 期间使用。
00151   在这种情况下,首先使用 HAL_FDCAN_RegisterCallback() 注册 MspInit/MspDeInit 用户回调,
00153   然后再调用 HAL_FDCAN_DeInit() 或 HAL_FDCAN_Init() 函数。

00154 
00155   当编译定义 USE_HAL_FDCAN_REGISTER_CALLBACKS 设置为 0 或
00156   未定义时,回调注册功能不可用,所有回调
00157   都设置为相应的弱函数。
00158 
00159   @endverbatim
00160   ******************************************************************************
00161   */
00162 
00163 /* Includes ------------------------------------------------------------------*/
00164 #include "stm32g4xx_hal.h"
00165 
00166 #if defined(FDCAN1)
00167 
00168 /** @addtogroup STM32G4xx_HAL_Driver
00169   * @{
00170   */
00171 
00172 /** @defgroup FDCAN FDCAN
00173   * @brief FDCAN HAL 模块驱动
00174   * @{
00175   */
00176 
00177 #ifdef HAL_FDCAN_MODULE_ENABLED
00178 
00179 /* Private typedef -----------------------------------------------------------*/
00180 /* Private define ------------------------------------------------------------*/
00181 /** @addtogroup FDCAN_Private_Constants
00182   * @{
00183   */
00184 00188 #define FDCAN_TIMEOUT_VALUE 10U
00189 
00190 00190 #define FDCAN_TX_EVENT_FIFO_MASK (FDCAN_IR_TEFL | FDCAN_IR_TEFF | FDCAN_IR_TEFN)
00191 00191 #define FDCAN_RX_FIFO0_MASK (FDCAN_IR_RF0L | FDCAN_IR_RF0F | FDCAN_IR_RF0N)
00192 00192 #define FDCAN_RX_FIFO1_MASK (FDCAN_IR_RF1L | FDCAN_IR_RF1F | FDCAN_IR_RF1N)
00193 00193 #define FDCAN_ERROR_MASK (FDCAN_IR_ELO | FDCAN_IR_WDI | FDCAN_IR_PEA | FDCAN_IR_PED | FDCAN_IR_ARA)
00194 00194 #define FDCAN_ERROR_STATUS_MASK (FDCAN_IR_EP | FDCAN_IR_EW | FDCAN_IR_BO)
00195 
00196 00196 #define FDCAN_ELEMENT_MASK_STDID ((uint32_t)0x1FFC0000U) /* 标准标识符         */
00197 00197 #define FDCAN_ELEMENT_MASK_EXTID ((uint32_t)0x1FFFFFFFU) /* 扩展标识符         */
00198 00198 #define FDCAN_ELEMENT_MASK_RTR   ((uint32_t)0x20000000U) /* 远程传输请求 */
00199 00199 #define FDCAN_ELEMENT_MASK_XTD   ((uint32_t)0x40000000U) /* 扩展标识符         */
00200 00200 #define FDCAN_ELEMENT_MASK_ESI   ((uint32_t)0x80000000U) /* 错误状态指示器       */
00201 00201 #define FDCAN_ELEMENT_MASK_TS    ((uint32_t)0x0000FFFFU) /* 时间戳                   */
00202 00202 #define FDCAN_ELEMENT_MASK_DLC   ((uint32_t)0x000F0000U) /* 数据长度码            */
00203 00203 #define FDCAN_ELEMENT_MASK_BRS   ((uint32_t)0x00100000U) /* 比特率切换             */
00204 00204 #define FDCAN_ELEMENT_MASK_FDF   ((uint32_t)0x00200000U) /* FD 格式                   */
00205 00205 #define FDCAN_ELEMENT_MASK_EFC   ((uint32_t)0x00800000U) /* 事件 FIFO 控制          */
00206 00206 #define FDCAN_ELEMENT_MASK_MM    ((uint32_t)0xFF000000U) /* 消息标记              */
00207 00207 #define FDCAN_ELEMENT_MASK_FIDX  ((uint32_t)0x7F000000U) /* 滤波器索引                */
00208 00208 #define FDCAN_ELEMENT_MASK_ANMF  ((uint32_t)0x80000000U) /* 接受的非匹配帧 */
00209