STM32 HAL CAN 函数完整分类详解
通常,使用 HAL 库进行 CAN 通信需要按以下步骤操作,对应的函数也按此逻辑分组:
1. 初始化和配置
这是使用 CAN 外设的第一步,负责底层硬件和核心参数的设置。
-
HAL_CAN_Init(CAN_HandleTypeDef *hcan)-
作用 : 根据
hcan句柄中的配置参数(如波特率、工作模式、时间触发等)初始化 CAN 外设。 -
参数 :
hcan- CAN 外设句柄。
-
-
HAL_CAN_ConfigFilter(CAN_HandleTypeDef *hcan, CAN_FilterConfigTypeDef *pFilterConfig)-
作用: 配置 CAN 的接收过滤器。通过设置过滤器,可以只接收特定 ID 的报文,减轻 CPU 负担。
-
参数 :
pFilterConfig- 指向过滤器配置结构体的指针,包括过滤器模式(掩码模式/列表模式)、ID、掩码值等。
-
2. 启动与停止
在配置好过滤器和底层后,需要启动 CAN 外设,使其活跃在 CAN 总线上。
-
HAL_CAN_Start(CAN_HandleTypeDef *hcan)- 作用 : 启动 CAN 模块。调用后,CAN 节点才真正进入正常通信模式 ,可以收发报文。这是调用
HAL_CAN_AddTxMessage前的必要步骤。
- 作用 : 启动 CAN 模块。调用后,CAN 节点才真正进入正常通信模式 ,可以收发报文。这是调用
-
HAL_CAN_Stop(CAN_HandleTypeDef *hcan)- 作用: 停止 CAN 模块,使其退出正常通信模式,通常用于进入低功耗状态或进行重配置。
3. 发送相关(控制函数)
除了你提到的函数,还有一组用于管理发送过程的函数。
HAL_StatusTypeDef HAL_CAN_AddTxMessage(CAN_HandleTypeDef *hcan,
CAN_TxHeaderTypeDef *pHeader,
uint8_t aData[],
uint32_t *pTxMailbox)
这个函数用于请求发送一条 CAN 报文。它会自动查找一个空闲的发送邮箱,将报文放入其中并启动发送请求
-
参数:
-
hcan: CAN 外设的句柄(Handle),例如&hcan1。 -
pHeader: 指向CAN_TxHeaderTypeDef结构体的指针,用于配置报文的标识符、类型、长度等元数据。 -
aData[]: 要发送的数据 payload 数组。 -
pTxMailbox: 指向uint32_t变量的指针,函数执行成功后,会将实际使用的发送邮箱编号 (如CAN_TX_MAILBOX0)写入该变量,供后续查询或中止发送时使用。
-
-
返回值 :
HAL_OK表示成功,其他值表示失败(如HAL_ERROR,HAL_BUSY,HAL_TIMEOUT)。
-
HAL_CAN_AbortTxRequest(CAN_HandleTypeDef *hcan, uint32_t TxMailbox)- 作用 : 中止一个等待中或正在发送 的报文请求。需要传入由
HAL_CAN_AddTxMessage返回的邮箱编号。
- 作用 : 中止一个等待中或正在发送 的报文请求。需要传入由
-
HAL_CAN_GetTxMailboxesFreeLevel(CAN_HandleTypeDef *hcan)- 作用 : 查询当前有多少个发送邮箱是空闲的(CAN外设通常有3个发送邮箱)。在调用
HAL_CAN_AddTxMessage前,可先检查此函数返回值,确保有空闲邮箱。
- 作用 : 查询当前有多少个发送邮箱是空闲的(CAN外设通常有3个发送邮箱)。在调用
4. 接收相关(控制函数)
用于从接收 FIFO 中读取数据。
-
HAL_CAN_GetRxMessage(CAN_HandleTypeDef *hcan, uint32_t RxFifo, CAN_RxHeaderTypeDef *pHeader, uint8_t aData[])- 作用 : 从指定的接收 FIFO 中读取一条已接收的 CAN 报文。它会将报文的元数据存入
pHeader,数据载荷存入aData。
- 作用 : 从指定的接收 FIFO 中读取一条已接收的 CAN 报文。它会将报文的元数据存入
-
HAL_CAN_GetRxFifoFillLevel(CAN_HandleTypeDef *hcan, uint32_t RxFifo)- 作用 : 查询指定接收 FIFO 中的报文数量。在
while循环中检查该值,当大于0时调用HAL_CAN_GetRxMessage读取数据。
- 作用 : 查询指定接收 FIFO 中的报文数量。在
5. 中断与回调管理
若希望程序以异步方式工作(收到报文或发送完成时自动执行回调),则需启用中断。
-
HAL_CAN_ActivateNotification(CAN_HandleTypeDef *hcan, uint32_t ActiveITs)- 作用 : 启用 指定的 CAN 中断源,例如接收 FIFO 有数据挂起 (
CAN_IT_RX_FIFO0_MSG_PENDING)、发送完成等。
- 作用 : 启用 指定的 CAN 中断源,例如接收 FIFO 有数据挂起 (
-
HAL_CAN_DeactivateNotification(CAN_HandleTypeDef *hcan, uint32_t InactiveITs)- 作用 : 禁用指定的 CAN 中断源。
-
HAL_CAN_IRQHandler(CAN_HandleTypeDef *hcan)- 作用 : 这是一个非常重要的函数 ,需要在 CAN 中断服务函数(ISR)中调用。它会根据硬件中断状态,自动分发事件并调用对应的用户回调函数(如
HAL_CAN_RxFifo0MsgPendingCallback)。
- 作用 : 这是一个非常重要的函数 ,需要在 CAN 中断服务函数(ISR)中调用。它会根据硬件中断状态,自动分发事件并调用对应的用户回调函数(如
-
HAL_CAN_RegisterCallback()/HAL_CAN_UnRegisterCallback()- 作用: 提供一种动态注册/注销回调函数的方法,使得用户自定义的回调函数能被 HAL 库调用。
6. 状态与错误获取
用于调试和监控 CAN 外设的运行状态。
-
HAL_CAN_GetState(CAN_HandleTypeDef *hcan)- 作用 : 获取 CAN 外设的状态(如
HAL_CAN_STATE_READY,HAL_CAN_STATE_BUSY,HAL_CAN_STATE_ERROR等)。
- 作用 : 获取 CAN 外设的状态(如
-
HAL_CAN_GetError(CAN_HandleTypeDef *hcan)- 作用: 获取 CAN 外设的错误代码,例如接收溢出、发送失败等错误标志。
总结:典型使用流程
-
初始化 :调用
HAL_CAN_Init()和HAL_CAN_ConfigFilter()。 -
启动 :调用
HAL_CAN_Start()。 -
循环发送 :检查
HAL_CAN_GetTxMailboxesFreeLevel()> 0,然后填充CAN_TxHeaderTypeDef和数据,调用HAL_CAN_AddTxMessage()。 -
循环接收(轮询模式) :检查
HAL_CAN_GetRxFifoFillLevel()> 0,然后调用HAL_CAN_GetRxMessage()读取数据。 -
(可选)中断模式 :调用
HAL_CAN_ActivateNotification()开启中断,实现异步收发。