STM32 CAN 库函数

=============================
看似很多,但同时用到的就几个。

CAN筛选器
/**根据筛选器结构体 CAN_FilterTypeDef 配置筛选器信息。*/
HAL_StatusTypeDef HAL_CAN_ConfigFilter(CAN_HandleTypeDef *hcan, CAN_FilterTypeDef *sFilterConfig);
CAN控制
/** 启动CAN模块.*/
HAL_StatusTypeDef HAL_CAN_Start(CAN_HandleTypeDef *hcan);

/** 停止CAN模块.*/
HAL_StatusTypeDef HAL_CAN_Stop(CAN_HandleTypeDef *hcan);

/** 请求CAN进入睡眠模式.*/
HAL_StatusTypeDef HAL_CAN_RequestSleep(CAN_HandleTypeDef *hcan);

/** 从睡眠模式中唤醒.*/
HAL_StatusTypeDef HAL_CAN_WakeUp(CAN_HandleTypeDef *hcan);

/** 检查睡眠模式是否激活.*/
uint32_t HAL_CAN_IsSleepActive(CAN_HandleTypeDef *hcan);

/** 向空闲Tx邮箱添加消息并激活相应的传输请求.
参数: pHeader 传输消息结构体
	  aData 发送的数据
	  pTxMailbox 返回发送消息的邮箱,一共有三个邮箱具体是哪个发送的,用这个来获取。
*/
HAL_StatusTypeDef HAL_CAN_AddTxMessage(CAN_HandleTypeDef *hcan, CAN_TxHeaderTypeDef *pHeader, uint8_t aData[], uint32_t *pTxMailbox);

/** 中止传输请求.*/
HAL_StatusTypeDef HAL_CAN_AbortTxRequest(CAN_HandleTypeDef *hcan, uint32_t TxMailboxes);

/** 获取空闲邮箱数量.*/
uint32_t HAL_CAN_GetTxMailboxesFreeLevel(CAN_HandleTypeDef *hcan);

/** 检测Tx传输是否有挂起请求.*/
uint32_t HAL_CAN_IsTxMessagePending(CAN_HandleTypeDef *hcan, uint32_t TxMailboxes);

/**若启用时间触发模式,则返回Tx的时间戳.*/
uint32_t HAL_CAN_GetTxTimestamp(CAN_HandleTypeDef *hcan, uint32_t TxMailbox);

/**从接收队列中获取消息保存到数组.*/
HAL_StatusTypeDef HAL_CAN_GetRxMessage(CAN_HandleTypeDef *hcan, uint32_t RxFifo, CAN_RxHeaderTypeDef *pHeader, uint8_t aData[]);

/**获取队列中有多少数据.*/
uint32_t HAL_CAN_GetRxFifoFillLevel(CAN_HandleTypeDef *hcan, uint32_t RxFifo);
CAN中断管理
/**
启用中断.
参数  ActiveITs 中断类型
*/
HAL_StatusTypeDef HAL_CAN_ActivateNotification(CAN_HandleTypeDef *hcan, uint32_t ActiveITs);
/**
关闭中断..
参数  ActiveITs 中断类型
*/
HAL_StatusTypeDef HAL_CAN_DeactivateNotification(CAN_HandleTypeDef *hcan, uint32_t InactiveITs);
/* CAN中断请求 */
void HAL_CAN_IRQHandler(CAN_HandleTypeDef *hcan);
回调函数

void HAL_CAN_TxMailbox0CompleteCallback(CAN_HandleTypeDef *hcan);   /* 邮箱0传输完成回调 */

void HAL_CAN_TxMailbox1CompleteCallback(CAN_HandleTypeDef *hcan);   /* 邮箱1传输完成回调 */

void HAL_CAN_TxMailbox2CompleteCallback(CAN_HandleTypeDef *hcan);    /* 邮箱2传输完成回调 */

void HAL_CAN_TxMailbox0AbortCallback(CAN_HandleTypeDef *hcan);      /* 邮箱0传输中止回调 */

void HAL_CAN_TxMailbox1AbortCallback(CAN_HandleTypeDef *hcan);      /* 邮箱1传输中止回调 */

void HAL_CAN_TxMailbox2AbortCallback(CAN_HandleTypeDef *hcan);      /* 邮箱2传输中止回调 */

void HAL_CAN_RxFifo0MsgPendingCallback(CAN_HandleTypeDef *hcan);    /* 接收队列0消息请求回调 */

void HAL_CAN_RxFifo0FullCallback(CAN_HandleTypeDef *hcan);         /* 接收队列0完整回调 */

void HAL_CAN_RxFifo1MsgPendingCallback(CAN_HandleTypeDef *hcan);    /* 接收队列1消息请求回调 */

void HAL_CAN_RxFifo1FullCallback(CAN_HandleTypeDef *hcan);         /* 接收队列1完整回调 */

void HAL_CAN_SleepCallback(CAN_HandleTypeDef *hcan);              /* 睡眠回调 */

void HAL_CAN_WakeUpFromRxMsgCallback(CAN_HandleTypeDef *hcan);    /* 唤醒回调 */

void HAL_CAN_ErrorCallback(CAN_HandleTypeDef *hcan);              /* 错误回调 */


HAL_CAN_StateTypeDef HAL_CAN_GetState(CAN_HandleTypeDef *hcan);     /* 获取CAN状态 */
uint32_t HAL_CAN_GetError(CAN_HandleTypeDef *hcan);               /* 获取CAN错误码 */
HAL_StatusTypeDef HAL_CAN_ResetError(CAN_HandleTypeDef *hcan)     /* 复位CAN错误码 */
参数宏定义
Tx邮箱定义

TxMailbox参数定义:

/* @defgroup CAN_Tx_Mailboxes CAN Tx Mailboxes */
#define CAN_TX_MAILBOX0             (0x00000001U)  /*!< Tx Mailbox 0  */
#define CAN_TX_MAILBOX1             (0x00000002U)  /*!< Tx Mailbox 1  */
#define CAN_TX_MAILBOX2             (0x00000004U)  /*!< Tx Mailbox 2  */
Rx队列定义

RxFifo 参数定义:

/** @defgroup CAN_Tx_Mailboxes CAN Tx Mailboxes  */
#define CAN_RX_FIFO0                (0x00000000U)  /*!< CAN receive FIFO 0 */
#define CAN_RX_FIFO1                (0x00000001U)  /*!< CAN receive FIFO 1 */

中断类型定义

参数 ActiveITs 中断类型定义:

/* 传输中断 */
#define CAN_IT_TX_MAILBOX_EMPTY     ((uint32_t)CAN_IER_TMEIE)   /*!< Transmit mailbox empty interrupt */

/* 接收中断 */
#define CAN_IT_RX_FIFO0_MSG_PENDING ((uint32_t)CAN_IER_FMPIE0)  /*!< FIFO 0 message pending interrupt */
#define CAN_IT_RX_FIFO0_FULL        ((uint32_t)CAN_IER_FFIE0)   /*!< FIFO 0 full interrupt            */
#define CAN_IT_RX_FIFO0_OVERRUN     ((uint32_t)CAN_IER_FOVIE0)  /*!< FIFO 0 overrun interrupt         */
#define CAN_IT_RX_FIFO1_MSG_PENDING ((uint32_t)CAN_IER_FMPIE1)  /*!< FIFO 1 message pending interrupt */
#define CAN_IT_RX_FIFO1_FULL        ((uint32_t)CAN_IER_FFIE1)   /*!< FIFO 1 full interrupt            */
#define CAN_IT_RX_FIFO1_OVERRUN     ((uint32_t)CAN_IER_FOVIE1)  /*!< FIFO 1 overrun interrupt         */

/* 操作模式中断 */
#define CAN_IT_WAKEUP               ((uint32_t)CAN_IER_WKUIE)   /*!< Wake-up interrupt                */
#define CAN_IT_SLEEP_ACK            ((uint32_t)CAN_IER_SLKIE)   /*!< Sleep acknowledge interrupt      */

/* 错误中断 */
#define CAN_IT_ERROR_WARNING        ((uint32_t)CAN_IER_EWGIE)   /*!< Error warning interrupt          */
#define CAN_IT_ERROR_PASSIVE        ((uint32_t)CAN_IER_EPVIE)   /*!< Error passive interrupt          */
#define CAN_IT_BUSOFF               ((uint32_t)CAN_IER_BOFIE)   /*!< Bus-off interrupt                */
#define CAN_IT_LAST_ERROR_CODE      ((uint32_t)CAN_IER_LECIE)   /*!< Last error code interrupt        */
#define CAN_IT_ERROR                ((uint32_t)CAN_IER_ERRIE)   /*!< Error Interrupt                  */

CAN 错误码

/** @defgroup CAN_Error_Code CAN Error Code*/
#define HAL_CAN_ERROR_NONE            (0x00000000U)  /*!< No error                                             */
#define HAL_CAN_ERROR_EWG             (0x00000001U)  /*!< Protocol Error Warning                               */
#define HAL_CAN_ERROR_EPV             (0x00000002U)  /*!< Error Passive                                        */
#define HAL_CAN_ERROR_BOF             (0x00000004U)  /*!< Bus-off error                                        */
#define HAL_CAN_ERROR_STF             (0x00000008U)  /*!< Stuff error                                          */
#define HAL_CAN_ERROR_FOR             (0x00000010U)  /*!< Form error                                           */
#define HAL_CAN_ERROR_ACK             (0x00000020U)  /*!< Acknowledgment error                                 */
#define HAL_CAN_ERROR_BR              (0x00000040U)  /*!< Bit recessive error                                  */
#define HAL_CAN_ERROR_BD              (0x00000080U)  /*!< Bit dominant error                                   */
#define HAL_CAN_ERROR_CRC             (0x00000100U)  /*!< CRC error                                            */
#define HAL_CAN_ERROR_RX_FOV0         (0x00000200U)  /*!< Rx FIFO0 overrun error                               */
#define HAL_CAN_ERROR_RX_FOV1         (0x00000400U)  /*!< Rx FIFO1 overrun error                               */
#define HAL_CAN_ERROR_TX_ALST0        (0x00000800U)  /*!< TxMailbox 0 transmit failure due to arbitration lost */
#define HAL_CAN_ERROR_TX_TERR0        (0x00001000U)  /*!< TxMailbox 0 transmit failure due to transmit error    */
#define HAL_CAN_ERROR_TX_ALST1        (0x00002000U)  /*!< TxMailbox 1 transmit failure due to arbitration lost */
#define HAL_CAN_ERROR_TX_TERR1        (0x00004000U)  /*!< TxMailbox 1 transmit failure due to transmit error    */
#define HAL_CAN_ERROR_TX_ALST2        (0x00008000U)  /*!< TxMailbox 2 transmit failure due to arbitration lost */
#define HAL_CAN_ERROR_TX_TERR2        (0x00010000U)  /*!< TxMailbox 2 transmit failure due to transmit error    */
#define HAL_CAN_ERROR_TIMEOUT         (0x00020000U)  /*!< Timeout error                                        */
#define HAL_CAN_ERROR_NOT_INITIALIZED (0x00040000U)  /*!< Peripheral not initialized                           */
#define HAL_CAN_ERROR_NOT_READY       (0x00080000U)  /*!< Peripheral not ready                                 */
#define HAL_CAN_ERROR_NOT_STARTED     (0x00100000U)  /*!< Peripheral not started                               */
#define HAL_CAN_ERROR_PARAM           (0x00200000U)  /*!< Parameter error                                      */

#if USE_HAL_CAN_REGISTER_CALLBACKS == 1
#define HAL_CAN_ERROR_INVALID_CALLBACK (0x00400000U) /*!< Invalid Callback error                               */
#endif /* USE_HAL_CAN_REGISTER_CALLBACKS */
#define HAL_CAN_ERROR_INTERNAL        (0x00800000U)  /*!< Internal error                                       */
CAN 标志
__HAL_CAN_GET_FLAG(__HANDLE__, __FLAG__)  检测标志是否置位,返回 TRUE or FALSE。

__HAL_CAN_CLEAR_FLAG(__HANDLE__, __FLAG__)  清除标志位。

/** @defgroup CAN_flags CAN Flags/
/* 发送标志 */
#define CAN_FLAG_RQCP0              (0x00000500U)  /*!< Request complete MailBox 0 flag   */
#define CAN_FLAG_TXOK0              (0x00000501U)  /*!< Transmission OK MailBox 0 flag    */
#define CAN_FLAG_ALST0              (0x00000502U)  /*!< Arbitration Lost MailBox 0 flag   */
#define CAN_FLAG_TERR0              (0x00000503U)  /*!< Transmission error MailBox 0 flag */
#define CAN_FLAG_RQCP1              (0x00000508U)  /*!< Request complete MailBox1 flag    */
#define CAN_FLAG_TXOK1              (0x00000509U)  /*!< Transmission OK MailBox 1 flag    */
#define CAN_FLAG_ALST1              (0x0000050AU)  /*!< Arbitration Lost MailBox 1 flag   */
#define CAN_FLAG_TERR1              (0x0000050BU)  /*!< Transmission error MailBox 1 flag */
#define CAN_FLAG_RQCP2              (0x00000510U)  /*!< Request complete MailBox2 flag    */
#define CAN_FLAG_TXOK2              (0x00000511U)  /*!< Transmission OK MailBox 2 flag    */
#define CAN_FLAG_ALST2              (0x00000512U)  /*!< Arbitration Lost MailBox 2 flag   */
#define CAN_FLAG_TERR2              (0x00000513U)  /*!< Transmission error MailBox 2 flag */
#define CAN_FLAG_TME0               (0x0000051AU)  /*!< Transmit mailbox 0 empty flag     */
#define CAN_FLAG_TME1               (0x0000051BU)  /*!< Transmit mailbox 1 empty flag     */
#define CAN_FLAG_TME2               (0x0000051CU)  /*!< Transmit mailbox 2 empty flag     */
#define CAN_FLAG_LOW0               (0x0000051DU)  /*!< Lowest priority mailbox 0 flag    */
#define CAN_FLAG_LOW1               (0x0000051EU)  /*!< Lowest priority mailbox 1 flag    */
#define CAN_FLAG_LOW2               (0x0000051FU)  /*!< Lowest priority mailbox 2 flag    */

/* 接收标志 */
#define CAN_FLAG_FF0                (0x00000203U)  /*!< RX FIFO 0 Full flag               */
#define CAN_FLAG_FOV0               (0x00000204U)  /*!< RX FIFO 0 Overrun flag            */
#define CAN_FLAG_FF1                (0x00000403U)  /*!< RX FIFO 1 Full flag               */
#define CAN_FLAG_FOV1               (0x00000404U)  /*!< RX FIFO 1 Overrun flag            */

/* 操作模式标志 */
#define CAN_FLAG_INAK               (0x00000100U)  /*!< Initialization acknowledge flag   */
#define CAN_FLAG_SLAK               (0x00000101U)  /*!< Sleep acknowledge flag            */
#define CAN_FLAG_ERRI               (0x00000102U)  /*!< Error flag                        */
#define CAN_FLAG_WKU                (0x00000103U)  /*!< Wake up interrupt flag            */
#define CAN_FLAG_SLAKI              (0x00000104U)  /*!< Sleep acknowledge interrupt flag  */

/* 错误标志 */
#define CAN_FLAG_EWG                (0x00000300U)  /*!< Error warning flag                */
#define CAN_FLAG_EPV                (0x00000301U)  /*!< Error passive flag                */
#define CAN_FLAG_BOF                (0x00000302U)  /*!< Bus-Off flag                      */


下面的功能需要定义:
USE_HAL_CAN_REGISTER_CALLBACKS = 1
并在初始化时传入自定义的被调函数。

回调函数注册
/**
* @简介  注册CAN回调函数
* @参数  hcan CAN实例化结构体指针
* @参数  CallbackID 回调函数ID 枚举值
* @param  pCallback 调用的函数
* @retval HAL 状态
*/
HAL_StatusTypeDef HAL_CAN_RegisterCallback(CAN_HandleTypeDef *hcan, HAL_CAN_CallbackIDTypeDef CallbackID,void (* pCallback)(CAN_HandleTypeDef *_hcan) );
		

/* 注销CAN回调函数 */
HAL_StatusTypeDef HAL_CAN_UnRegisterCallback(CAN_HandleTypeDef *hcan, HAL_CAN_CallbackIDTypeDef CallbackID );
回调函数ID枚举定义
typedef enum
{
  HAL_CAN_TX_MAILBOX0_COMPLETE_CB_ID       = 0x00U,    /*!< CAN Tx 邮箱0完成回调ID        */
  HAL_CAN_TX_MAILBOX1_COMPLETE_CB_ID       = 0x01U,    /*!< CAN Tx 邮箱1完成回调ID        */
  HAL_CAN_TX_MAILBOX2_COMPLETE_CB_ID       = 0x02U,    /*!< CAN Tx 邮箱2完成回调ID        */
  HAL_CAN_TX_MAILBOX0_ABORT_CB_ID          = 0x03U,    /*!< CAN Tx 邮箱0中止回调ID        */
  HAL_CAN_TX_MAILBOX1_ABORT_CB_ID          = 0x04U,    /*!< CAN Tx 邮箱1中止回调ID        */
  HAL_CAN_TX_MAILBOX2_ABORT_CB_ID          = 0x05U,    /*!< CAN Tx 邮箱2中止回调ID        */
  HAL_CAN_RX_FIFO0_MSG_PENDING_CB_ID       = 0x06U,    /*!< CAN Rx 队列0消息挂起回调ID    */
  HAL_CAN_RX_FIFO0_FULL_CB_ID              = 0x07U,    /*!< CAN Rx Rx 队列0完整回调ID     */
  HAL_CAN_RX_FIFO1_MSG_PENDING_CB_ID       = 0x08U,    /*!< CAN Rx 队列1消息挂起回调ID    */
  HAL_CAN_RX_FIFO1_FULL_CB_ID              = 0x09U,    /*!< CAN Rx 队列1完整回调ID        */
  HAL_CAN_SLEEP_CB_ID                      = 0x0AU,    /*!< CAN  睡眠回调ID               */
  HAL_CAN_WAKEUP_FROM_RX_MSG_CB_ID         = 0x0BU,    /*!< CAN 从Rx消息唤醒回调ID        */
  HAL_CAN_ERROR_CB_ID                      = 0x0CU,    /*!< CAN 错误回调 ID               */

  HAL_CAN_MSPINIT_CB_ID                    = 0x0DU,    /*!< CAN 端口初始化回调ID           */
  HAL_CAN_MSPDEINIT_CB_ID                  = 0x0EU,    /*!< CAN 端口复位回调ID             */

} HAL_CAN_CallbackIDTypeDef;
  • 3
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值