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() 开启中断,实现异步收发。

相关推荐
gwf2161 小时前
SSD读写速度深度解析:顺序读写vs随机读写、IOPS、延迟,你的硬盘性能到底怎么看?
git·嵌入式硬件·缓存·github·智能硬件
Freak嵌入式5 小时前
版本混乱 / 依赖缺失?uPyPi:MicroPython 版 PyPI,彻底解决库管理混乱
linux·服务器·数据库·单片机·嵌入式硬件·性能优化·依赖倒置原则
wuyk5555 小时前
77.嵌入式 C 语言中 enum 枚举的工程化实践:告别魔法数字,提升代码可维护性
c语言·开发语言·stm32·单片机·嵌入式硬件
义嘉泰6 小时前
XT25F128F-W Flash芯片全面解析
人工智能·嵌入式硬件·芯片
QH139292318806 小时前
Keysight N9917B N9918B手持式综合微波分析仪
网络·科技·嵌入式硬件·集成测试·信息与通信
longxingiot6 小时前
轻量化单片机数传终端降低物联网开发门槛
单片机·嵌入式硬件·物联网
亿道电子Emdoor7 小时前
【Arm】MSP和PSP的区别简介
c语言·arm开发·单片机·mcu
国产HT1621B7 小时前
YL1650 LED驱动芯片详解:从原理到实战应用(附51单片机驱动代码)
stm32·单片机·嵌入式硬件·mcu·fpga开发·lcd驱动