|
STM32G474xx HAL 用户手册
|
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