STM32 CAN 库函数
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 库函数相关推荐
- STM32 GPIO_INIT()库函数的程序含义
STM32 GPIO一共有七个寄存器:CRL.CRH.IDR.ODR.BSRR.BRR.LCKR 具体功能不再赘述,正点原子的库函数开发指南以及STM32参考手册中都有详细的讲解,网上也有很多大佬通俗 ...
- stm32中库函数和hal库的区别
今天在b站看一个关于嵌入式的视频,讲述使用stm32cube软件的.了解这些的小伙伴们应该知道STM32CubeMX 是意法半导体推出的图形化配置工具,通过傻瓜化的操作便能实现相关配置,最终能够生成C ...
- STM32基于库函数新建工程模板
基于库函数版本 准备资料: a) V3.5 固件库包:STM32F10x_StdPeriph_Lib_V3.5.0 这是 ST 官网下载的固件库完 整版,我们光盘目录: 软件资料\STM32 固件库使 ...
- stm32(库函数)——新建基于固件库的MDK5工程模板
这里根据STM32不完全手册记录建立库函数版本的基于固件库的MDK5工程模板. 1.我们每一次新建工程都会新建一个文件夹存放所有文件. 2.点击MDK的菜单:Project->New Uvisi ...
- STM32利用库函数驱动OLED
使用的1.3寸OLED是I2C接口的对外有四个引脚,分别是VCC.GND.SCL.SDL. 首先看一下运行的效果图: 成功在小屏幕上显示"你好". 首先,我们需要配置好STM32的 ...
- STM32使用库函数点灯实验
GPIO库函数介绍 重要函数: 1个初始化函数:void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct);2个读取输 ...
- 嵌入式接口之TIM定时器与NVIC的STM32模板库函数的一些解释
文章目录 前言 定时基本方法 STM32的时钟 STM的定时器TIM 通用定时器的结构 时基单元 例子讲解 TIM_TimeBaseInit TIM_TimeBaseInitTypeDef TIM_C ...
- STM32使用库函数控制时钟芯片DS1302提供时间
DS1302简介 DS1302是由美国DALLAS公司推出的具有涓细电流充电能力的低功耗实时时钟芯片.它可以对年.月.日.周.时.分.秒进行计时,并且具有闰年补偿等多种功能: 每天的天数和闰年的天数可 ...
- 【STM32单片机-库函数】继电器——relay
5V继电器模块-1 5V继电器模块-2 实验演示: 工作电压5V 模块I/O接STM32的PG6引脚.开漏输出 relay.h #ifndef __RELAY_H #define __RELAY_H/ ...
最新文章
- Linux下分区、格式化、自动挂载
- servlet增删改查实例_SpringBoot系列(2)整合MongoDB实现增删改查(完整案例)
- Python编程基础:第五十六节 filter函数Filter
- java排队买票_【排队买票】 (Java代码)
- 讲解虚拟服务器的书_程序员不得不看的书
- 【今日CV 计算机视觉论文速览】19 Mar 2019
- 小程序api 分享scene_抛弃微信小程序API的嵌套回调吧!
- html表格怎样传入数据类型,Echarts图表中pie类型tooltip中formatter函数传递的参数从哪里来?...
- java读取文件封装的一个类(有部分代码借鉴别人的)
- Git版本控制:Git高级教程
- css的写法 有点凌乱(养成这习惯 神马浏览器兼容都是浮云 so easy)
- Hadoop安装杂记(2)
- android studio 初始化项目加载时间过长或失败问题解决
- flink常用参数说明
- 【运维实战家】无线三建七优之频信优传-锐捷无线
- EXCEL中插入图形
- 回复热爱计算机的数控生
- 2021年,我国的国际骨干网出口怎么样, 有多少海底电缆?
- linux 安装防病毒软件,04Linux环境下Norton防病毒软件安装和使用.doc
- fairyGUI界面控件的基本制作和功能实现
热门文章
- vue中导出excel表格(支持导出图片)
- 蓝牙篇之蓝牙核心规范学习笔记(V5.3)汇总
- 一文了解同态加密(Homomorphic Encryption, HE)
- Excel函数应用之查询与引用函数
- 移动应用安全之沙盒技术
- 2022年中国总体健康指数为66.6%,已连续四年持续稳步上升,工作健康指数提升最为显著 | 美通社头条...
- Oracle 技能强化 Part 9 范围查询
- MYSQL 基础篇(补)
- c++三大函数:拷贝构造(copy ctor)、拷贝赋值(copy op)、析构函数(dtor)
- Attention!当推荐系统遇见注意力机制