STM32 HAL库CAN通信核心函数详解,参数以及作用

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 前的必要步骤。
  • 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 前,可先检查此函数返回值,确保有空闲邮箱。
4. 接收相关(控制函数)

用于从接收 FIFO 中读取数据。

  • HAL_CAN_GetRxMessage(CAN_HandleTypeDef *hcan, uint32_t RxFifo, CAN_RxHeaderTypeDef *pHeader, uint8_t aData[])

    • 作用 : 从指定的接收 FIFO 中读取一条已接收的 CAN 报文。它会将报文的元数据存入 pHeader,数据载荷存入 aData。
  • HAL_CAN_GetRxFifoFillLevel(CAN_HandleTypeDef *hcan, uint32_t RxFifo)

    • 作用 : 查询指定接收 FIFO 中的报文数量。在 while 循环中检查该值,当大于0时调用 HAL_CAN_GetRxMessage 读取数据。
5. 中断与回调管理

若希望程序以异步方式工作(收到报文或发送完成时自动执行回调),则需启用中断。

  • HAL_CAN_ActivateNotification(CAN_HandleTypeDef *hcan, uint32_t ActiveITs)

    • 作用 : 启用 指定的 CAN 中断源,例如接收 FIFO 有数据挂起 (CAN_IT_RX_FIFO0_MSG_PENDING)、发送完成等。
  • HAL_CAN_DeactivateNotification(CAN_HandleTypeDef *hcan, uint32_t InactiveITs)

    • 作用 : 禁用指定的 CAN 中断源。
  • HAL_CAN_IRQHandler(CAN_HandleTypeDef *hcan)

    • 作用 : 这是一个非常重要的函数 ,需要在 CAN 中断服务函数(ISR)中调用。它会根据硬件中断状态,自动分发事件并调用对应的用户回调函数(如 HAL_CAN_RxFifo0MsgPendingCallback)。
  • 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 等)。
  • HAL_CAN_GetError(CAN_HandleTypeDef *hcan)

    • 作用: 获取 CAN 外设的错误代码,例如接收溢出、发送失败等错误标志。

总结:典型使用流程

  1. 初始化 :调用 HAL_CAN_Init() 和 HAL_CAN_ConfigFilter()。

  2. 启动 :调用 HAL_CAN_Start()。

  3. 循环发送 :检查 HAL_CAN_GetTxMailboxesFreeLevel() > 0,然后填充 CAN_TxHeaderTypeDef 和数据,调用 HAL_CAN_AddTxMessage()。

  4. 循环接收(轮询模式) :检查 HAL_CAN_GetRxFifoFillLevel() > 0,然后调用 HAL_CAN_GetRxMessage() 读取数据。

  5. (可选)中断模式 :调用 HAL_CAN_ActivateNotification() 开启中断,实现异步收发。

相关推荐
HQB20265 小时前
EG1198|屹晶微电子 120V 内置 MOS 异步降压 DC‑DC(高性价比)
嵌入式硬件·硬件工程
果壳science6 小时前
张祥前实验如何获取正电荷
笔记·科技·嵌入式硬件·硬件工程·制造
南山电子nscn6 小时前
中科芯CETC汽车电池管理系统BMS进口芯片国产型号替代指南
单片机·汽车·bms
沉淀的.晴天7 小时前
can总线
stm32
桀人7 小时前
认识AT24C02
stm32·单片机·嵌入式硬件
国科安芯8 小时前
星间激光通信终端CANFD控制网络的时延确定性与辐射可靠性
网络·嵌入式硬件·信息与通信·canfd·低轨卫星·商业航天·抗辐射
一直C9 小时前
嵌入式 Linux 驱动开发学习笔记:内核定时器、platform 总线与 I²C 驱动
linux·驱动开发·嵌入式硬件·学习·imx6ull
传感器与混合集成电路9 小时前
150MHz主频、8路DAC与6路PWM:JLH221360伺服控制SIP解析
嵌入式硬件
comyccccc9 小时前
STM32PID控制板设计全解析学习笔记
单片机·嵌入式硬件
碧海银沙音频科技研究院10 小时前
实现炬芯ATS308X的usb cdc 串口IAP 固件升级功能实现
人工智能·嵌入式硬件·深度学习·算法