1  /**
2    ******************************************************************************
3    * @file    stm32f4xx_hal_can_legacy.h
4    * @author  MCD Application Team
5    * @brief   Header file of CAN HAL module.
6    ******************************************************************************
7    * @attention
8    *
9    * <h2><center>&copy; COPYRIGHT(c) 2017 STMicroelectronics</center></h2>
10    *
11    * Redistribution and use in source and binary forms, with or without modification,
12    * are permitted provided that the following conditions are met:
13    *   1. Redistributions of source code must retain the above copyright notice,
14    *      this list of conditions and the following disclaimer.
15    *   2. Redistributions in binary form must reproduce the above copyright notice,
16    *      this list of conditions and the following disclaimer in the documentation
17    *      and/or other materials provided with the distribution.
18    *   3. Neither the name of STMicroelectronics nor the names of its contributors
19    *      may be used to endorse or promote products derived from this software
20    *      without specific prior written permission.
21    *
22    * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
23    * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
24    * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
25    * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
26    * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
27    * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
28    * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
29    * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
30    * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
31    * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
32    *
33    ******************************************************************************
34    */
35  
36  /* Define to prevent recursive inclusion -------------------------------------*/
37  #ifndef __STM32F4xx_HAL_CAN_LEGACY_H
38  #define __STM32F4xx_HAL_CAN_LEGACY_H
39  
40  #ifdef __cplusplus
41   extern "C" {
42  #endif
43  
44  #if defined(STM32F405xx) || defined(STM32F415xx) || defined(STM32F407xx) || defined(STM32F417xx) ||\
45      defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) ||\
46      defined(STM32F446xx) || defined(STM32F469xx) || defined(STM32F479xx) || defined(STM32F412Zx) ||\
47      defined(STM32F412Vx) || defined(STM32F412Rx) || defined(STM32F412Cx) || defined(STM32F413xx) ||\
48      defined(STM32F423xx)
49  /* Includes ------------------------------------------------------------------*/
50  #include "stm32f4xx_hal_def.h"
51  
52  /** @addtogroup STM32F4xx_HAL_Driver
53    * @{
54    */
55  
56  /** @addtogroup CAN
57    * @{
58    */
59  
60  /* Exported types ------------------------------------------------------------*/
61  /** @defgroup CAN_Exported_Types CAN Exported Types
62    * @{
63    */
64  
65  /**
66    * @brief  HAL State structures definition
67    */
68  typedef enum
69  {
70    HAL_CAN_STATE_RESET             = 0x00U,  /*!< CAN not yet initialized or disabled */
71    HAL_CAN_STATE_READY             = 0x01U,  /*!< CAN initialized and ready for use   */
72    HAL_CAN_STATE_BUSY              = 0x02U,  /*!< CAN process is ongoing              */
73    HAL_CAN_STATE_BUSY_TX           = 0x12U,  /*!< CAN process is ongoing              */
74    HAL_CAN_STATE_BUSY_RX0          = 0x22U,  /*!< CAN process is ongoing              */
75    HAL_CAN_STATE_BUSY_RX1          = 0x32U,  /*!< CAN process is ongoing              */
76    HAL_CAN_STATE_BUSY_TX_RX0       = 0x42U,  /*!< CAN process is ongoing              */
77    HAL_CAN_STATE_BUSY_TX_RX1       = 0x52U,  /*!< CAN process is ongoing              */
78    HAL_CAN_STATE_BUSY_RX0_RX1      = 0x62U,  /*!< CAN process is ongoing              */
79    HAL_CAN_STATE_BUSY_TX_RX0_RX1   = 0x72U,  /*!< CAN process is ongoing              */
80    HAL_CAN_STATE_TIMEOUT           = 0x03U,  /*!< CAN in Timeout state                */
81    HAL_CAN_STATE_ERROR             = 0x04U   /*!< CAN error state                     */
82  
83  }HAL_CAN_StateTypeDef;
84  
85  /**
86    * @brief  CAN init structure definition
87    */
88  typedef struct
89  {
90    uint32_t Prescaler;  /*!< Specifies the length of a time quantum.
91                              This parameter must be a number between Min_Data = 1 and Max_Data = 1024 */
92  
93    uint32_t Mode;       /*!< Specifies the CAN operating mode.
94                              This parameter can be a value of @ref CAN_operating_mode */
95  
96    uint32_t SJW;        /*!< Specifies the maximum number of time quanta
97                              the CAN hardware is allowed to lengthen or
98                              shorten a bit to perform resynchronization.
99                              This parameter can be a value of @ref CAN_synchronisation_jump_width */
100  
101    uint32_t BS1;        /*!< Specifies the number of time quanta in Bit Segment 1.
102                              This parameter can be a value of @ref CAN_time_quantum_in_bit_segment_1 */
103  
104    uint32_t BS2;        /*!< Specifies the number of time quanta in Bit Segment 2.
105                              This parameter can be a value of @ref CAN_time_quantum_in_bit_segment_2 */
106  
107    uint32_t TTCM;       /*!< Enable or disable the time triggered communication mode.
108                              This parameter can be set to ENABLE or DISABLE. */
109  
110    uint32_t ABOM;       /*!< Enable or disable the automatic bus-off management.
111                              This parameter can be set to ENABLE or DISABLE */
112  
113    uint32_t AWUM;       /*!< Enable or disable the automatic wake-up mode.
114                              This parameter can be set to ENABLE or DISABLE */
115  
116    uint32_t NART;       /*!< Enable or disable the non-automatic retransmission mode.
117                              This parameter can be set to ENABLE or DISABLE */
118  
119    uint32_t RFLM;       /*!< Enable or disable the receive FIFO Locked mode.
120                              This parameter can be set to ENABLE or DISABLE */
121  
122    uint32_t TXFP;       /*!< Enable or disable the transmit FIFO priority.
123                              This parameter can be set to ENABLE or DISABLE */
124  }CAN_InitTypeDef;
125  
126  /**
127    * @brief  CAN filter configuration structure definition
128    */
129  typedef struct
130  {
131    uint32_t FilterIdHigh;          /*!< Specifies the filter identification number (MSBs for a 32-bit
132                                         configuration, first one for a 16-bit configuration).
133                                         This parameter must be a number between Min_Data = 0x0000 and Max_Data = 0xFFFF */
134  
135    uint32_t FilterIdLow;           /*!< Specifies the filter identification number (LSBs for a 32-bit
136                                         configuration, second one for a 16-bit configuration).
137                                         This parameter must be a number between Min_Data = 0x0000 and Max_Data = 0xFFFF */
138  
139    uint32_t FilterMaskIdHigh;      /*!< Specifies the filter mask number or identification number,
140                                         according to the mode (MSBs for a 32-bit configuration,
141                                         first one for a 16-bit configuration).
142                                         This parameter must be a number between Min_Data = 0x0000 and Max_Data = 0xFFFF */
143  
144    uint32_t FilterMaskIdLow;       /*!< Specifies the filter mask number or identification number,
145                                         according to the mode (LSBs for a 32-bit configuration,
146                                         second one for a 16-bit configuration).
147                                         This parameter must be a number between Min_Data = 0x0000 and Max_Data = 0xFFFF */
148  
149    uint32_t FilterFIFOAssignment;  /*!< Specifies the FIFO (0 or 1) which will be assigned to the filter.
150                                         This parameter can be a value of @ref CAN_filter_FIFO */
151  
152    uint32_t FilterNumber;          /*!< Specifies the filter which will be initialized.
153                                         This parameter must be a number between Min_Data = 0 and Max_Data = 27 */
154  
155    uint32_t FilterMode;            /*!< Specifies the filter mode to be initialized.
156                                         This parameter can be a value of @ref CAN_filter_mode */
157  
158    uint32_t FilterScale;           /*!< Specifies the filter scale.
159                                         This parameter can be a value of @ref CAN_filter_scale */
160  
161    uint32_t FilterActivation;      /*!< Enable or disable the filter.
162                                         This parameter can be set to ENABLE or DISABLE. */
163  
164    uint32_t BankNumber;            /*!< Select the start slave bank filter.
165                                         This parameter must be a number between Min_Data = 0 and Max_Data = 28 */
166  
167  }CAN_FilterConfTypeDef;
168  
169  /**
170    * @brief  CAN Tx message structure definition
171    */
172  typedef struct
173  {
174    uint32_t StdId;    /*!< Specifies the standard identifier.
175                            This parameter must be a number between Min_Data = 0 and Max_Data = 0x7FF */
176  
177    uint32_t ExtId;    /*!< Specifies the extended identifier.
178                            This parameter must be a number between Min_Data = 0 and Max_Data = 0x1FFFFFFF */
179  
180    uint32_t IDE;      /*!< Specifies the type of identifier for the message that will be transmitted.
181                            This parameter can be a value of @ref CAN_Identifier_Type */
182  
183    uint32_t RTR;      /*!< Specifies the type of frame for the message that will be transmitted.
184                            This parameter can be a value of @ref CAN_remote_transmission_request */
185  
186    uint32_t DLC;      /*!< Specifies the length of the frame that will be transmitted.
187                            This parameter must be a number between Min_Data = 0 and Max_Data = 8 */
188  
189    uint8_t Data[8];   /*!< Contains the data to be transmitted.
190                            This parameter must be a number between Min_Data = 0 and Max_Data = 0xFF */
191  
192  }CanTxMsgTypeDef;
193  
194  /**
195    * @brief  CAN Rx message structure definition
196    */
197  typedef struct
198  {
199    uint32_t StdId;       /*!< Specifies the standard identifier.
200                               This parameter must be a number between Min_Data = 0 and Max_Data = 0x7FF */
201  
202    uint32_t ExtId;       /*!< Specifies the extended identifier.
203                               This parameter must be a number between Min_Data = 0 and Max_Data = 0x1FFFFFFF */
204  
205    uint32_t IDE;         /*!< Specifies the type of identifier for the message that will be received.
206                               This parameter can be a value of @ref CAN_Identifier_Type */
207  
208    uint32_t RTR;         /*!< Specifies the type of frame for the received message.
209                               This parameter can be a value of @ref CAN_remote_transmission_request */
210  
211    uint32_t DLC;         /*!< Specifies the length of the frame that will be received.
212                               This parameter must be a number between Min_Data = 0 and Max_Data = 8 */
213  
214    uint8_t Data[8];      /*!< Contains the data to be received.
215                               This parameter must be a number between Min_Data = 0 and Max_Data = 0xFF */
216  
217    uint32_t FMI;         /*!< Specifies the index of the filter the message stored in the mailbox passes through.
218                               This parameter must be a number between Min_Data = 0 and Max_Data = 0xFF */
219  
220    uint32_t FIFONumber;  /*!< Specifies the receive FIFO number.
221                               This parameter can be CAN_FIFO0 or CAN_FIFO1 */
222  
223  }CanRxMsgTypeDef;
224  
225  /**
226    * @brief  CAN handle Structure definition
227    */
228  typedef struct
229  {
230    CAN_TypeDef                 *Instance;  /*!< Register base address          */
231  
232    CAN_InitTypeDef             Init;       /*!< CAN required parameters        */
233  
234    CanTxMsgTypeDef*            pTxMsg;     /*!< Pointer to transmit structure  */
235  
236    CanRxMsgTypeDef*            pRxMsg;     /*!< Pointer to reception structure for RX FIFO0 msg */
237  
238    CanRxMsgTypeDef*            pRx1Msg;    /*!< Pointer to reception structure for RX FIFO1 msg */
239  
240    __IO HAL_CAN_StateTypeDef   State;      /*!< CAN communication state        */
241  
242    HAL_LockTypeDef             Lock;       /*!< CAN locking object             */
243  
244    __IO uint32_t               ErrorCode;  /*!< CAN Error code                 */
245  
246  }CAN_HandleTypeDef;
247  
248  /**
249    * @}
250    */
251  
252  /* Exported constants --------------------------------------------------------*/
253  /** @defgroup CAN_Exported_Constants CAN Exported Constants
254    * @{
255    */
256  
257  /** @defgroup CAN_Error_Code CAN Error Code
258    * @{
259    */
260  #define   HAL_CAN_ERROR_NONE      0x00000000U    /*!< No error             */
261  #define   HAL_CAN_ERROR_EWG       0x00000001U    /*!< EWG error            */
262  #define   HAL_CAN_ERROR_EPV       0x00000002U    /*!< EPV error            */
263  #define   HAL_CAN_ERROR_BOF       0x00000004U    /*!< BOF error            */
264  #define   HAL_CAN_ERROR_STF       0x00000008U    /*!< Stuff error          */
265  #define   HAL_CAN_ERROR_FOR       0x00000010U    /*!< Form error           */
266  #define   HAL_CAN_ERROR_ACK       0x00000020U    /*!< Acknowledgment error */
267  #define   HAL_CAN_ERROR_BR        0x00000040U    /*!< Bit recessive        */
268  #define   HAL_CAN_ERROR_BD        0x00000080U    /*!< LEC dominant         */
269  #define   HAL_CAN_ERROR_CRC       0x00000100U    /*!< LEC transfer error   */
270  #define   HAL_CAN_ERROR_FOV0      0x00000200U    /*!< FIFO0 overrun error  */
271  #define   HAL_CAN_ERROR_FOV1      0x00000400U    /*!< FIFO1 overrun error  */
272  #define   HAL_CAN_ERROR_TXFAIL    0x00000800U    /*!< Transmit failure     */
273  /**
274    * @}
275    */
276  
277  /** @defgroup CAN_InitStatus CAN InitStatus
278    * @{
279    */
280  #define CAN_INITSTATUS_FAILED       ((uint8_t)0x00)  /*!< CAN initialization failed */
281  #define CAN_INITSTATUS_SUCCESS      ((uint8_t)0x01)  /*!< CAN initialization OK */
282  /**
283    * @}
284    */
285  
286  /** @defgroup CAN_operating_mode CAN Operating Mode
287    * @{
288    */
289  #define CAN_MODE_NORMAL             0x00000000U                                /*!< Normal mode   */
290  #define CAN_MODE_LOOPBACK           ((uint32_t)CAN_BTR_LBKM)                   /*!< Loopback mode */
291  #define CAN_MODE_SILENT             ((uint32_t)CAN_BTR_SILM)                   /*!< Silent mode   */
292  #define CAN_MODE_SILENT_LOOPBACK    ((uint32_t)(CAN_BTR_LBKM | CAN_BTR_SILM))  /*!< Loopback combined with silent mode */
293  /**
294    * @}
295    */
296  
297  /** @defgroup CAN_synchronisation_jump_width CAN Synchronisation Jump Width
298    * @{
299    */
300  #define CAN_SJW_1TQ                 0x00000000U                /*!< 1 time quantum */
301  #define CAN_SJW_2TQ                 ((uint32_t)CAN_BTR_SJW_0)  /*!< 2 time quantum */
302  #define CAN_SJW_3TQ                 ((uint32_t)CAN_BTR_SJW_1)  /*!< 3 time quantum */
303  #define CAN_SJW_4TQ                 ((uint32_t)CAN_BTR_SJW)    /*!< 4 time quantum */
304  /**
305    * @}
306    */
307  
308  /** @defgroup CAN_time_quantum_in_bit_segment_1 CAN Time Quantum in bit segment 1
309    * @{
310    */
311  #define CAN_BS1_1TQ                 0x00000000U                                                  /*!< 1 time quantum  */
312  #define CAN_BS1_2TQ                 ((uint32_t)CAN_BTR_TS1_0)                                    /*!< 2 time quantum  */
313  #define CAN_BS1_3TQ                 ((uint32_t)CAN_BTR_TS1_1)                                    /*!< 3 time quantum  */
314  #define CAN_BS1_4TQ                 ((uint32_t)(CAN_BTR_TS1_1 | CAN_BTR_TS1_0))                  /*!< 4 time quantum  */
315  #define CAN_BS1_5TQ                 ((uint32_t)CAN_BTR_TS1_2)                                    /*!< 5 time quantum  */
316  #define CAN_BS1_6TQ                 ((uint32_t)(CAN_BTR_TS1_2 | CAN_BTR_TS1_0))                  /*!< 6 time quantum  */
317  #define CAN_BS1_7TQ                 ((uint32_t)(CAN_BTR_TS1_2 | CAN_BTR_TS1_1))                  /*!< 7 time quantum  */
318  #define CAN_BS1_8TQ                 ((uint32_t)(CAN_BTR_TS1_2 | CAN_BTR_TS1_1 | CAN_BTR_TS1_0))  /*!< 8 time quantum  */
319  #define CAN_BS1_9TQ                 ((uint32_t)CAN_BTR_TS1_3)                                    /*!< 9 time quantum  */
320  #define CAN_BS1_10TQ                ((uint32_t)(CAN_BTR_TS1_3 | CAN_BTR_TS1_0))                  /*!< 10 time quantum */
321  #define CAN_BS1_11TQ                ((uint32_t)(CAN_BTR_TS1_3 | CAN_BTR_TS1_1))                  /*!< 11 time quantum */
322  #define CAN_BS1_12TQ                ((uint32_t)(CAN_BTR_TS1_3 | CAN_BTR_TS1_1 | CAN_BTR_TS1_0))  /*!< 12 time quantum */
323  #define CAN_BS1_13TQ                ((uint32_t)(CAN_BTR_TS1_3 | CAN_BTR_TS1_2))                  /*!< 13 time quantum */
324  #define CAN_BS1_14TQ                ((uint32_t)(CAN_BTR_TS1_3 | CAN_BTR_TS1_2 | CAN_BTR_TS1_0))  /*!< 14 time quantum */
325  #define CAN_BS1_15TQ                ((uint32_t)(CAN_BTR_TS1_3 | CAN_BTR_TS1_2 | CAN_BTR_TS1_1))  /*!< 15 time quantum */
326  #define CAN_BS1_16TQ                ((uint32_t)CAN_BTR_TS1) /*!< 16 time quantum */
327  /**
328    * @}
329    */
330  
331  /** @defgroup CAN_time_quantum_in_bit_segment_2 CAN Time Quantum in bit segment 2
332    * @{
333    */
334  #define CAN_BS2_1TQ                 0x00000000U                                  /*!< 1 time quantum */
335  #define CAN_BS2_2TQ                 ((uint32_t)CAN_BTR_TS2_0)                    /*!< 2 time quantum */
336  #define CAN_BS2_3TQ                 ((uint32_t)CAN_BTR_TS2_1)                    /*!< 3 time quantum */
337  #define CAN_BS2_4TQ                 ((uint32_t)(CAN_BTR_TS2_1 | CAN_BTR_TS2_0))  /*!< 4 time quantum */
338  #define CAN_BS2_5TQ                 ((uint32_t)CAN_BTR_TS2_2)                    /*!< 5 time quantum */
339  #define CAN_BS2_6TQ                 ((uint32_t)(CAN_BTR_TS2_2 | CAN_BTR_TS2_0))  /*!< 6 time quantum */
340  #define CAN_BS2_7TQ                 ((uint32_t)(CAN_BTR_TS2_2 | CAN_BTR_TS2_1))  /*!< 7 time quantum */
341  #define CAN_BS2_8TQ                 ((uint32_t)CAN_BTR_TS2)                      /*!< 8 time quantum */
342  /**
343    * @}
344    */
345  
346  /** @defgroup CAN_filter_mode  CAN Filter Mode
347    * @{
348    */
349  #define CAN_FILTERMODE_IDMASK       ((uint8_t)0x00)  /*!< Identifier mask mode */
350  #define CAN_FILTERMODE_IDLIST       ((uint8_t)0x01)  /*!< Identifier list mode */
351  /**
352    * @}
353    */
354  
355  /** @defgroup CAN_filter_scale CAN Filter Scale
356    * @{
357    */
358  #define CAN_FILTERSCALE_16BIT       ((uint8_t)0x00)  /*!< Two 16-bit filters */
359  #define CAN_FILTERSCALE_32BIT       ((uint8_t)0x01)  /*!< One 32-bit filter  */
360  /**
361    * @}
362    */
363  
364  /** @defgroup CAN_filter_FIFO CAN Filter FIFO
365    * @{
366    */
367  #define CAN_FILTER_FIFO0             ((uint8_t)0x00)  /*!< Filter FIFO 0 assignment for filter x */
368  #define CAN_FILTER_FIFO1             ((uint8_t)0x01)  /*!< Filter FIFO 1 assignment for filter x */
369  /**
370    * @}
371    */
372  
373  /** @defgroup CAN_Identifier_Type CAN Identifier Type
374    * @{
375    */
376  #define CAN_ID_STD                  0x00000000U  /*!< Standard Id */
377  #define CAN_ID_EXT                  0x00000004U  /*!< Extended Id */
378  /**
379    * @}
380    */
381  
382  /** @defgroup CAN_remote_transmission_request CAN Remote Transmission Request
383    * @{
384    */
385  #define CAN_RTR_DATA                0x00000000U  /*!< Data frame */
386  #define CAN_RTR_REMOTE              0x00000002U  /*!< Remote frame */
387  /**
388    * @}
389    */
390  
391  /** @defgroup CAN_receive_FIFO_number_constants CAN Receive FIFO Number Constants
392    * @{
393    */
394  #define CAN_FIFO0                   ((uint8_t)0x00)  /*!< CAN FIFO 0 used to receive */
395  #define CAN_FIFO1                   ((uint8_t)0x01)  /*!< CAN FIFO 1 used to receive */
396  /**
397    * @}
398    */
399  
400  /** @defgroup CAN_flags CAN Flags
401    * @{
402    */
403  /* If the flag is 0x3XXXXXXX, it means that it can be used with CAN_GetFlagStatus()
404     and CAN_ClearFlag() functions. */
405  /* If the flag is 0x1XXXXXXX, it means that it can only be used with
406     CAN_GetFlagStatus() function.  */
407  
408  /* Transmit Flags */
409  #define CAN_FLAG_RQCP0             0x00000500U  /*!< Request MailBox0 flag         */
410  #define CAN_FLAG_RQCP1             0x00000508U  /*!< Request MailBox1 flag         */
411  #define CAN_FLAG_RQCP2             0x00000510U  /*!< Request MailBox2 flag         */
412  #define CAN_FLAG_TXOK0             0x00000501U  /*!< Transmission OK MailBox0 flag */
413  #define CAN_FLAG_TXOK1             0x00000509U  /*!< Transmission OK MailBox1 flag */
414  #define CAN_FLAG_TXOK2             0x00000511U  /*!< Transmission OK MailBox2 flag */
415  #define CAN_FLAG_TME0              0x0000051AU  /*!< Transmit mailbox 0 empty flag */
416  #define CAN_FLAG_TME1              0x0000051BU  /*!< Transmit mailbox 0 empty flag */
417  #define CAN_FLAG_TME2              0x0000051CU  /*!< Transmit mailbox 0 empty flag */
418  
419  /* Receive Flags */
420  #define CAN_FLAG_FF0               0x00000203U  /*!< FIFO 0 Full flag    */
421  #define CAN_FLAG_FOV0              0x00000204U  /*!< FIFO 0 Overrun flag */
422  
423  #define CAN_FLAG_FF1               0x00000403U  /*!< FIFO 1 Full flag    */
424  #define CAN_FLAG_FOV1              0x00000404U  /*!< FIFO 1 Overrun flag */
425  
426  /* Operating Mode Flags */
427  #define CAN_FLAG_INAK              0x00000100U  /*!<  Initialization acknowledge flag */
428  #define CAN_FLAG_SLAK              0x00000101U  /*!< Sleep acknowledge flag */
429  #define CAN_FLAG_ERRI              0x00000102U  /*!<  Error flag */
430  #define CAN_FLAG_WKU               0x00000103U  /*!< Wake up flag           */
431  #define CAN_FLAG_SLAKI             0x00000104U  /*!< Sleep acknowledge flag */
432  
433  /* @note When SLAK interrupt is disabled (SLKIE=0), no polling on SLAKI is possible.
434           In this case the SLAK bit can be polled.*/
435  
436  /* Error Flags */
437  #define CAN_FLAG_EWG               0x00000300U  /*!< Error warning flag   */
438  #define CAN_FLAG_EPV               0x00000301U  /*!< Error passive flag   */
439  #define CAN_FLAG_BOF               0x00000302U  /*!< Bus-Off flag         */
440  /**
441    * @}
442    */
443  
444  /** @defgroup CAN_Interrupts CAN Interrupts
445    * @{
446    */
447  #define CAN_IT_TME                  ((uint32_t)CAN_IER_TMEIE)   /*!< Transmit mailbox empty interrupt */
448  
449  /* Receive Interrupts */
450  #define CAN_IT_FMP0                 ((uint32_t)CAN_IER_FMPIE0)  /*!< FIFO 0 message pending interrupt */
451  #define CAN_IT_FF0                  ((uint32_t)CAN_IER_FFIE0)   /*!< FIFO 0 full interrupt            */
452  #define CAN_IT_FOV0                 ((uint32_t)CAN_IER_FOVIE0)  /*!< FIFO 0 overrun interrupt         */
453  #define CAN_IT_FMP1                 ((uint32_t)CAN_IER_FMPIE1)  /*!< FIFO 1 message pending interrupt */
454  #define CAN_IT_FF1                  ((uint32_t)CAN_IER_FFIE1)   /*!< FIFO 1 full interrupt            */
455  #define CAN_IT_FOV1                 ((uint32_t)CAN_IER_FOVIE1)  /*!< FIFO 1 overrun interrupt         */
456  
457  /* Operating Mode Interrupts */
458  #define CAN_IT_WKU                  ((uint32_t)CAN_IER_WKUIE)  /*!< Wake-up interrupt           */
459  #define CAN_IT_SLK                  ((uint32_t)CAN_IER_SLKIE)  /*!< Sleep acknowledge interrupt */
460  
461  /* Error Interrupts */
462  #define CAN_IT_EWG                  ((uint32_t)CAN_IER_EWGIE) /*!< Error warning interrupt   */
463  #define CAN_IT_EPV                  ((uint32_t)CAN_IER_EPVIE) /*!< Error passive interrupt   */
464  #define CAN_IT_BOF                  ((uint32_t)CAN_IER_BOFIE) /*!< Bus-off interrupt         */
465  #define CAN_IT_LEC                  ((uint32_t)CAN_IER_LECIE) /*!< Last error code interrupt */
466  #define CAN_IT_ERR                  ((uint32_t)CAN_IER_ERRIE) /*!< Error Interrupt           */
467  /**
468    * @}
469    */
470  
471  /** @defgroup CAN_Mailboxes_Definition CAN Mailboxes Definition
472    * @{
473    */
474  #define CAN_TXMAILBOX_0   ((uint8_t)0x00)
475  #define CAN_TXMAILBOX_1   ((uint8_t)0x01)
476  #define CAN_TXMAILBOX_2   ((uint8_t)0x02)
477  /**
478    * @}
479    */
480  
481  /**
482    * @}
483    */
484  
485  /* Exported macro ------------------------------------------------------------*/
486  /** @defgroup CAN_Exported_Macros CAN Exported Macros
487    * @{
488    */
489  
490  /** @brief Reset CAN handle state
491    * @param  __HANDLE__ specifies the CAN Handle.
492    * @retval None
493    */
494  #define __HAL_CAN_RESET_HANDLE_STATE(__HANDLE__) ((__HANDLE__)->State = HAL_CAN_STATE_RESET)
495  
496  /**
497    * @brief  Enable the specified CAN interrupts.
498    * @param  __HANDLE__ CAN handle
499    * @param  __INTERRUPT__ CAN Interrupt
500    * @retval None
501    */
502  #define __HAL_CAN_ENABLE_IT(__HANDLE__, __INTERRUPT__) (((__HANDLE__)->Instance->IER) |= (__INTERRUPT__))
503  
504  /**
505    * @brief  Disable the specified CAN interrupts.
506    * @param  __HANDLE__ CAN handle
507    * @param  __INTERRUPT__ CAN Interrupt
508    * @retval None
509    */
510  #define __HAL_CAN_DISABLE_IT(__HANDLE__, __INTERRUPT__) (((__HANDLE__)->Instance->IER) &= ~(__INTERRUPT__))
511  
512  /**
513    * @brief  Return the number of pending received messages.
514    * @param  __HANDLE__ CAN handle
515    * @param  __FIFONUMBER__ Receive FIFO number, CAN_FIFO0 or CAN_FIFO1.
516    * @retval The number of pending message.
517    */
518  #define __HAL_CAN_MSG_PENDING(__HANDLE__, __FIFONUMBER__) (((__FIFONUMBER__) == CAN_FIFO0)? \
519  ((uint8_t)((__HANDLE__)->Instance->RF0R&0x03U)) : ((uint8_t)((__HANDLE__)->Instance->RF1R & 0x03U)))
520  
521  /** @brief  Check whether the specified CAN flag is set or not.
522    * @param  __HANDLE__ CAN Handle
523    * @param  __FLAG__ specifies the flag to check.
524    *         This parameter can be one of the following values:
525    *            @arg CAN_TSR_RQCP0: Request MailBox0 Flag
526    *            @arg CAN_TSR_RQCP1: Request MailBox1 Flag
527    *            @arg CAN_TSR_RQCP2: Request MailBox2 Flag
528    *            @arg CAN_FLAG_TXOK0: Transmission OK MailBox0 Flag
529    *            @arg CAN_FLAG_TXOK1: Transmission OK MailBox1 Flag
530    *            @arg CAN_FLAG_TXOK2: Transmission OK MailBox2 Flag
531    *            @arg CAN_FLAG_TME0: Transmit mailbox 0 empty Flag
532    *            @arg CAN_FLAG_TME1: Transmit mailbox 1 empty Flag
533    *            @arg CAN_FLAG_TME2: Transmit mailbox 2 empty Flag
534    *            @arg CAN_FLAG_FMP0: FIFO 0 Message Pending Flag
535    *            @arg CAN_FLAG_FF0: FIFO 0 Full Flag
536    *            @arg CAN_FLAG_FOV0: FIFO 0 Overrun Flag
537    *            @arg CAN_FLAG_FMP1: FIFO 1 Message Pending Flag
538    *            @arg CAN_FLAG_FF1: FIFO 1 Full Flag
539    *            @arg CAN_FLAG_FOV1: FIFO 1 Overrun Flag
540    *            @arg CAN_FLAG_WKU: Wake up Flag
541    *            @arg CAN_FLAG_SLAK: Sleep acknowledge Flag
542    *            @arg CAN_FLAG_SLAKI: Sleep acknowledge Flag
543    *            @arg CAN_FLAG_EWG: Error Warning Flag
544    *            @arg CAN_FLAG_EPV: Error Passive Flag
545    *            @arg CAN_FLAG_BOF: Bus-Off Flag
546    * @retval The new state of __FLAG__ (TRUE or FALSE).
547    */
548  #define __HAL_CAN_GET_FLAG(__HANDLE__, __FLAG__) \
549  ((((__FLAG__) >> 8U) == 5U)? ((((__HANDLE__)->Instance->TSR) & (1U << ((__FLAG__) & CAN_FLAG_MASK))) == (1U << ((__FLAG__) & CAN_FLAG_MASK))): \
550   (((__FLAG__) >> 8U) == 2U)? ((((__HANDLE__)->Instance->RF0R) & (1U << ((__FLAG__) & CAN_FLAG_MASK))) == (1U << ((__FLAG__) & CAN_FLAG_MASK))): \
551   (((__FLAG__) >> 8U) == 4U)? ((((__HANDLE__)->Instance->RF1R) & (1U << ((__FLAG__) & CAN_FLAG_MASK))) == (1U << ((__FLAG__) & CAN_FLAG_MASK))): \
552   (((__FLAG__) >> 8U) == 1U)? ((((__HANDLE__)->Instance->MSR) & (1U << ((__FLAG__) & CAN_FLAG_MASK))) == (1U << ((__FLAG__) & CAN_FLAG_MASK))): \
553   ((((__HANDLE__)->Instance->ESR) & (1U << ((__FLAG__) & CAN_FLAG_MASK))) == (1U << ((__FLAG__) & CAN_FLAG_MASK))))
554  
555  /** @brief  Clear the specified CAN pending flag.
556    * @param  __HANDLE__ CAN Handle.
557    * @param  __FLAG__ specifies the flag to check.
558    *         This parameter can be one of the following values:
559    *            @arg CAN_TSR_RQCP0: Request MailBox0 Flag
560    *            @arg CAN_TSR_RQCP1: Request MailBox1 Flag
561    *            @arg CAN_TSR_RQCP2: Request MailBox2 Flag
562    *            @arg CAN_FLAG_TXOK0: Transmission OK MailBox0 Flag
563    *            @arg CAN_FLAG_TXOK1: Transmission OK MailBox1 Flag
564    *            @arg CAN_FLAG_TXOK2: Transmission OK MailBox2 Flag
565    *            @arg CAN_FLAG_TME0: Transmit mailbox 0 empty Flag
566    *            @arg CAN_FLAG_TME1: Transmit mailbox 1 empty Flag
567    *            @arg CAN_FLAG_TME2: Transmit mailbox 2 empty Flag
568    *            @arg CAN_FLAG_FMP0: FIFO 0 Message Pending Flag
569    *            @arg CAN_FLAG_FF0: FIFO 0 Full Flag
570    *            @arg CAN_FLAG_FOV0: FIFO 0 Overrun Flag
571    *            @arg CAN_FLAG_FMP1: FIFO 1 Message Pending Flag
572    *            @arg CAN_FLAG_FF1: FIFO 1 Full Flag
573    *            @arg CAN_FLAG_FOV1: FIFO 1 Overrun Flag
574    *            @arg CAN_FLAG_WKU: Wake up Flag
575    *            @arg CAN_FLAG_SLAK: Sleep acknowledge Flag
576    *            @arg CAN_FLAG_SLAKI: Sleep acknowledge Flag
577    * @retval The new state of __FLAG__ (TRUE or FALSE).
578    */
579  #define __HAL_CAN_CLEAR_FLAG(__HANDLE__, __FLAG__) \
580  ((((__FLAG__) >> 8U) == 5U)? (((__HANDLE__)->Instance->TSR) = (1U << ((__FLAG__) & CAN_FLAG_MASK))): \
581   (((__FLAG__) >> 8U) == 2U)? (((__HANDLE__)->Instance->RF0R) = (1U << ((__FLAG__) & CAN_FLAG_MASK))): \
582   (((__FLAG__) >> 8U) == 4U)? (((__HANDLE__)->Instance->RF1R) = (1U << ((__FLAG__) & CAN_FLAG_MASK))): \
583   (((__HANDLE__)->Instance->MSR) = ((uint32_t)1U << ((__FLAG__) & CAN_FLAG_MASK))))
584  
585  /** @brief  Check if the specified CAN interrupt source is enabled or disabled.
586    * @param  __HANDLE__ CAN Handle
587    * @param  __INTERRUPT__ specifies the CAN interrupt source to check.
588    *          This parameter can be one of the following values:
589    *             @arg CAN_IT_TME: Transmit mailbox empty interrupt enable
590    *             @arg CAN_IT_FMP0: FIFO0 message pending interrupt enable
591    *             @arg CAN_IT_FMP1: FIFO1 message pending interrupt enable
592    * @retval The new state of __IT__ (TRUE or FALSE).
593    */
594  #define __HAL_CAN_GET_IT_SOURCE(__HANDLE__, __INTERRUPT__) ((((__HANDLE__)->Instance->IER & (__INTERRUPT__)) == (__INTERRUPT__)) ? SET : RESET)
595  
596  /**
597    * @brief  Check the transmission status of a CAN Frame.
598    * @param  __HANDLE__ CAN Handle
599    * @param  __TRANSMITMAILBOX__ the number of the mailbox that is used for transmission.
600    * @retval The new status of transmission  (TRUE or FALSE).
601    */
602  #define __HAL_CAN_TRANSMIT_STATUS(__HANDLE__, __TRANSMITMAILBOX__)\
603  (((__TRANSMITMAILBOX__) == CAN_TXMAILBOX_0)? ((((__HANDLE__)->Instance->TSR) & (CAN_TSR_RQCP0 | CAN_TSR_TXOK0 | CAN_TSR_TME0)) == (CAN_TSR_RQCP0 | CAN_TSR_TXOK0 | CAN_TSR_TME0)) :\
604   ((__TRANSMITMAILBOX__) == CAN_TXMAILBOX_1)? ((((__HANDLE__)->Instance->TSR) & (CAN_TSR_RQCP1 | CAN_TSR_TXOK1 | CAN_TSR_TME1)) == (CAN_TSR_RQCP1 | CAN_TSR_TXOK1 | CAN_TSR_TME1)) :\
605   ((((__HANDLE__)->Instance->TSR) & (CAN_TSR_RQCP2 | CAN_TSR_TXOK2 | CAN_TSR_TME2)) == (CAN_TSR_RQCP2 | CAN_TSR_TXOK2 | CAN_TSR_TME2)))
606  
607  /**
608    * @brief  Release the specified receive FIFO.
609    * @param  __HANDLE__ CAN handle
610    * @param  __FIFONUMBER__ Receive FIFO number, CAN_FIFO0 or CAN_FIFO1.
611    * @retval None
612    */
613  #define __HAL_CAN_FIFO_RELEASE(__HANDLE__, __FIFONUMBER__) (((__FIFONUMBER__) == CAN_FIFO0)? \
614  ((__HANDLE__)->Instance->RF0R = CAN_RF0R_RFOM0) : ((__HANDLE__)->Instance->RF1R = CAN_RF1R_RFOM1))
615  
616  /**
617    * @brief  Cancel a transmit request.
618    * @param  __HANDLE__ CAN Handle
619    * @param  __TRANSMITMAILBOX__ the number of the mailbox that is used for transmission.
620    * @retval None
621    */
622  #define __HAL_CAN_CANCEL_TRANSMIT(__HANDLE__, __TRANSMITMAILBOX__)\
623  (((__TRANSMITMAILBOX__) == CAN_TXMAILBOX_0)? ((__HANDLE__)->Instance->TSR = CAN_TSR_ABRQ0) :\
624   ((__TRANSMITMAILBOX__) == CAN_TXMAILBOX_1)? ((__HANDLE__)->Instance->TSR = CAN_TSR_ABRQ1) :\
625   ((__HANDLE__)->Instance->TSR = CAN_TSR_ABRQ2))
626  
627  /**
628    * @brief  Enable or disable the DBG Freeze for CAN.
629    * @param  __HANDLE__ CAN Handle
630    * @param  __NEWSTATE__ new state of the CAN peripheral.
631    *          This parameter can be: ENABLE (CAN reception/transmission is frozen
632    *          during debug. Reception FIFOs can still be accessed/controlled normally)
633    *          or DISABLE (CAN is working during debug).
634    * @retval None
635    */
636  #define __HAL_CAN_DBG_FREEZE(__HANDLE__, __NEWSTATE__) (((__NEWSTATE__) == ENABLE)? \
637  ((__HANDLE__)->Instance->MCR |= CAN_MCR_DBF) : ((__HANDLE__)->Instance->MCR &= ~CAN_MCR_DBF))
638  
639  /**
640    * @}
641    */
642  
643  /* Exported functions --------------------------------------------------------*/
644  /** @addtogroup CAN_Exported_Functions
645    * @{
646    */
647  
648  /** @addtogroup CAN_Exported_Functions_Group1
649    * @{
650    */
651  /* Initialization/de-initialization functions ***********************************/
652  HAL_StatusTypeDef HAL_CAN_Init(CAN_HandleTypeDef* hcan);
653  HAL_StatusTypeDef HAL_CAN_ConfigFilter(CAN_HandleTypeDef* hcan, CAN_FilterConfTypeDef* sFilterConfig);
654  HAL_StatusTypeDef HAL_CAN_DeInit(CAN_HandleTypeDef* hcan);
655  void HAL_CAN_MspInit(CAN_HandleTypeDef* hcan);
656  void HAL_CAN_MspDeInit(CAN_HandleTypeDef* hcan);
657  /**
658    * @}
659    */
660  
661  /** @addtogroup CAN_Exported_Functions_Group2
662    * @{
663    */
664  /* I/O operation functions ******************************************************/
665  HAL_StatusTypeDef HAL_CAN_Transmit(CAN_HandleTypeDef *hcan, uint32_t Timeout);
666  HAL_StatusTypeDef HAL_CAN_Transmit_IT(CAN_HandleTypeDef *hcan);
667  HAL_StatusTypeDef HAL_CAN_Receive(CAN_HandleTypeDef *hcan, uint8_t FIFONumber, uint32_t Timeout);
668  HAL_StatusTypeDef HAL_CAN_Receive_IT(CAN_HandleTypeDef *hcan, uint8_t FIFONumber);
669  HAL_StatusTypeDef HAL_CAN_Sleep(CAN_HandleTypeDef *hcan);
670  HAL_StatusTypeDef HAL_CAN_WakeUp(CAN_HandleTypeDef *hcan);
671  void HAL_CAN_IRQHandler(CAN_HandleTypeDef* hcan);
672  void HAL_CAN_TxCpltCallback(CAN_HandleTypeDef* hcan);
673  void HAL_CAN_RxCpltCallback(CAN_HandleTypeDef* hcan);
674  void HAL_CAN_ErrorCallback(CAN_HandleTypeDef *hcan);
675  /**
676    * @}
677    */
678  
679  /** @addtogroup CAN_Exported_Functions_Group3
680    * @{
681    */
682  /* Peripheral State functions ***************************************************/
683  uint32_t HAL_CAN_GetError(CAN_HandleTypeDef *hcan);
684  HAL_CAN_StateTypeDef HAL_CAN_GetState(CAN_HandleTypeDef* hcan);
685  /**
686    * @}
687    */
688  
689  /**
690    * @}
691    */
692  
693  /* Private types -------------------------------------------------------------*/
694  /** @defgroup CAN_Private_Types CAN Private Types
695    * @{
696    */
697  
698  /**
699    * @}
700    */
701  
702  /* Private variables ---------------------------------------------------------*/
703  /** @defgroup CAN_Private_Variables CAN Private Variables
704    * @{
705    */
706  
707  /**
708    * @}
709    */
710  
711  /* Private constants ---------------------------------------------------------*/
712  /** @defgroup CAN_Private_Constants CAN Private Constants
713    * @{
714    */
715  #define CAN_TXSTATUS_NOMAILBOX      ((uint8_t)0x04)  /*!< CAN cell did not provide CAN_TxStatus_NoMailBox */
716  #define CAN_FLAG_MASK               0x000000FFU
717  /**
718    * @}
719    */
720  
721  /* Private macros ------------------------------------------------------------*/
722  /** @defgroup CAN_Private_Macros CAN Private Macros
723    * @{
724    */
725  #define IS_CAN_MODE(MODE) (((MODE) == CAN_MODE_NORMAL) || \
726                             ((MODE) == CAN_MODE_LOOPBACK)|| \
727                             ((MODE) == CAN_MODE_SILENT) || \
728                             ((MODE) == CAN_MODE_SILENT_LOOPBACK))
729  #define IS_CAN_SJW(SJW) (((SJW) == CAN_SJW_1TQ) || ((SJW) == CAN_SJW_2TQ)|| \
730                           ((SJW) == CAN_SJW_3TQ) || ((SJW) == CAN_SJW_4TQ))
731  #define IS_CAN_BS1(BS1) ((BS1) <= CAN_BS1_16TQ)
732  #define IS_CAN_BS2(BS2) ((BS2) <= CAN_BS2_8TQ)
733  #define IS_CAN_PRESCALER(PRESCALER) (((PRESCALER) >= 1U) && ((PRESCALER) <= 1024U))
734  #define IS_CAN_FILTER_NUMBER(NUMBER) ((NUMBER) <= 27U)
735  #define IS_CAN_FILTER_MODE(MODE) (((MODE) == CAN_FILTERMODE_IDMASK) || \
736                                    ((MODE) == CAN_FILTERMODE_IDLIST))
737  #define IS_CAN_FILTER_SCALE(SCALE) (((SCALE) == CAN_FILTERSCALE_16BIT) || \
738                                      ((SCALE) == CAN_FILTERSCALE_32BIT))
739  #define IS_CAN_FILTER_FIFO(FIFO) (((FIFO) == CAN_FILTER_FIFO0) || \
740                                    ((FIFO) == CAN_FILTER_FIFO1))
741  #define IS_CAN_BANKNUMBER(BANKNUMBER) ((BANKNUMBER) <= 28U)
742  
743  #define IS_CAN_TRANSMITMAILBOX(TRANSMITMAILBOX) ((TRANSMITMAILBOX) <= ((uint8_t)0x02))
744  #define IS_CAN_STDID(STDID)   ((STDID) <= ((uint32_t)0x7FFU))
745  #define IS_CAN_EXTID(EXTID)   ((EXTID) <= 0x1FFFFFFFU)
746  #define IS_CAN_DLC(DLC)       ((DLC) <= ((uint8_t)0x08))
747  
748  #define IS_CAN_IDTYPE(IDTYPE)  (((IDTYPE) == CAN_ID_STD) || \
749                                  ((IDTYPE) == CAN_ID_EXT))
750  #define IS_CAN_RTR(RTR) (((RTR) == CAN_RTR_DATA) || ((RTR) == CAN_RTR_REMOTE))
751  #define IS_CAN_FIFO(FIFO) (((FIFO) == CAN_FIFO0) || ((FIFO) == CAN_FIFO1))
752  
753  /**
754    * @}
755    */
756  
757  /* Private functions ---------------------------------------------------------*/
758  /** @defgroup CAN_Private_Functions CAN Private Functions
759    * @{
760    */
761  
762  /**
763    * @}
764    */
765  
766  #endif /* STM32F405xx || STM32F415xx || STM32F407xx || STM32F417xx || STM32F427xx || STM32F437xx ||\
767            STM32F429xx || STM32F439xx || STM32F446xx || STM32F469xx || STM32F479xx || STM32F412Zx ||\
768            STM32F412Vx || STM32F412Rx || STM32F412Cx || STM32F413xx || STM32F423xx */
769  
770  /**
771    * @}
772    */
773  
774  /**
775    * @}
776    */
777  
778  #ifdef __cplusplus
779  }
780  #endif
781  
782  #endif /* __STM32F4xx_HAL_CAN_LEGACY_H */
783  
784  
785  /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
786