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

相关推荐
HUI-47439 分钟前
EG1162|SOP‑16 高压同步整流降压控制器,最高 600V 输入,大电流 5V 输出优选
嵌入式硬件·硬件工程
POMAGTOR43 分钟前
【5G 通讯 POGOPIN 弹簧顶针连接器解决方案】
网络·嵌入式硬件·5g
ZLG_zhiyuan1 小时前
测试方案 | 从“000”到“111”,高效完成100BASE-TX以太网眼图测试
单片机·嵌入式硬件
恒锐丰科技林技术员1 小时前
EG1198:120V 宽压内置 MOS 降压 DC‑DC 电源芯片解析
经验分享·嵌入式硬件·硬件工程
数字新视界2 小时前
能耗管理系统的综合方案与优化实战解析
嵌入式硬件·物联网·数据中心·数据中心基础设施管理·dcim管理系统
深圳市恒锐丰科技杨生2 小时前
EG3525S 推挽 / 半桥 PWM 控制器|屹晶 EGmicro
嵌入式硬件·硬件工程
H_oRIZoN_2 小时前
Linux入门DAY39(51 单片机入门笔记|最小系统、位运算、处理器、数码管基础梳理)
单片机·嵌入式硬件
12.=0.2 小时前
【电学基础】
单片机·嵌入式硬件
开发笔记-阿牛3 小时前
嵌入式蓝牙开发:AC2005B 芯片技术解析 —— 省晶振设计、13dBm 射频与 Auracast 广播音响开发指南
人工智能·单片机·音视频
单片机仿真设计3 小时前
【proteus仿真】基于 STM32 单片机电梯运行状态监控设计(仿真图+程序)
stm32·单片机·嵌入式硬件·proteus