STM32 CAN 库函数

  • CAN筛选器
  • CAN控制
  • CAN中断管理
  • 回调函数
  • 参数宏定义
    • Tx邮箱定义
    • Rx队列定义
    • 中断类型定义
    • CAN 错误码
    • CAN 标志
  • 回调函数注册
    • 回调函数ID枚举定义

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

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;

STM32 CAN 库函数相关推荐

  1. STM32 GPIO_INIT()库函数的程序含义

    STM32 GPIO一共有七个寄存器:CRL.CRH.IDR.ODR.BSRR.BRR.LCKR 具体功能不再赘述,正点原子的库函数开发指南以及STM32参考手册中都有详细的讲解,网上也有很多大佬通俗 ...

  2. stm32中库函数和hal库的区别

    今天在b站看一个关于嵌入式的视频,讲述使用stm32cube软件的.了解这些的小伙伴们应该知道STM32CubeMX 是意法半导体推出的图形化配置工具,通过傻瓜化的操作便能实现相关配置,最终能够生成C ...

  3. STM32基于库函数新建工程模板

    基于库函数版本 准备资料: a) V3.5 固件库包:STM32F10x_StdPeriph_Lib_V3.5.0 这是 ST 官网下载的固件库完 整版,我们光盘目录: 软件资料\STM32 固件库使 ...

  4. stm32(库函数)——新建基于固件库的MDK5工程模板

    这里根据STM32不完全手册记录建立库函数版本的基于固件库的MDK5工程模板. 1.我们每一次新建工程都会新建一个文件夹存放所有文件. 2.点击MDK的菜单:Project->New Uvisi ...

  5. STM32利用库函数驱动OLED

    使用的1.3寸OLED是I2C接口的对外有四个引脚,分别是VCC.GND.SCL.SDL. 首先看一下运行的效果图: 成功在小屏幕上显示"你好". 首先,我们需要配置好STM32的 ...

  6. STM32使用库函数点灯实验

    GPIO库函数介绍 重要函数: 1个初始化函数:void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct);2个读取输 ...

  7. 嵌入式接口之TIM定时器与NVIC的STM32模板库函数的一些解释

    文章目录 前言 定时基本方法 STM32的时钟 STM的定时器TIM 通用定时器的结构 时基单元 例子讲解 TIM_TimeBaseInit TIM_TimeBaseInitTypeDef TIM_C ...

  8. STM32使用库函数控制时钟芯片DS1302提供时间

    DS1302简介 DS1302是由美国DALLAS公司推出的具有涓细电流充电能力的低功耗实时时钟芯片.它可以对年.月.日.周.时.分.秒进行计时,并且具有闰年补偿等多种功能: 每天的天数和闰年的天数可 ...

  9. 【STM32单片机-库函数】继电器——relay

    5V继电器模块-1 5V继电器模块-2 实验演示: 工作电压5V 模块I/O接STM32的PG6引脚.开漏输出 relay.h #ifndef __RELAY_H #define __RELAY_H/ ...

最新文章

  1. Linux下分区、格式化、自动挂载
  2. servlet增删改查实例_SpringBoot系列(2)整合MongoDB实现增删改查(完整案例)
  3. Python编程基础:第五十六节 filter函数Filter
  4. java排队买票_【排队买票】 (Java代码)
  5. 讲解虚拟服务器的书_程序员不得不看的书
  6. 【今日CV 计算机视觉论文速览】19 Mar 2019
  7. 小程序api 分享scene_抛弃微信小程序API的嵌套回调吧!
  8. html表格怎样传入数据类型,Echarts图表中pie类型tooltip中formatter函数传递的参数从哪里来?...
  9. java读取文件封装的一个类(有部分代码借鉴别人的)
  10. Git版本控制:Git高级教程
  11. css的写法 有点凌乱(养成这习惯 神马浏览器兼容都是浮云 so easy)
  12. Hadoop安装杂记(2)
  13. android studio 初始化项目加载时间过长或失败问题解决
  14. flink常用参数说明
  15. 【运维实战家】无线三建七优之频信优传-锐捷无线
  16. EXCEL中插入图形
  17. 回复热爱计算机的数控生
  18. 2021年,我国的国际骨干网出口怎么样, 有多少海底电缆?
  19. linux 安装防病毒软件,04Linux环境下Norton防病毒软件安装和使用.doc
  20. fairyGUI界面控件的基本制作和功能实现

热门文章

  1. vue中导出excel表格(支持导出图片)
  2. 蓝牙篇之蓝牙核心规范学习笔记(V5.3)汇总
  3. 一文了解同态加密(Homomorphic Encryption, HE)
  4. Excel函数应用之查询与引用函数
  5. 移动应用安全之沙盒技术
  6. 2022年中国总体健康指数为66.6%,已连续四年持续稳步上升,工作健康指数提升最为显著 | 美通社头条...
  7. Oracle 技能强化 Part 9 范围查询
  8. MYSQL 基础篇(补)
  9. c++三大函数:拷贝构造(copy ctor)、拷贝赋值(copy op)、析构函数(dtor)
  10. Attention!当推荐系统遇见注意力机制