HAl库开发中断方式接收Can报文的详细流程

下面给出一个基于 HAL 库的中断方式接收 CAN 报文的详细流程说明,描述每一步的硬件配置、软件调用和中断处理机制,而不涉及具体代码细节,只讲解整体原理和步骤:

在使用 HAL 库时,不需要手动清除中断标志位。原因如下:

  • 当你在中断回调函数(例如 HAL_CAN_RxFifo0MsgPendingCallback)中调用 HAL_CAN_GetRxMessage() 读取报文时,HAL 库会自动清除相应的中断标志,使得 CAN 控制器的 FIFO 可以继续接收下一条报文。

  • 这种设计保证了用户只需要专注于数据处理,而不必额外处理中断标志的清除操作。

因此,只要你按照 HAL 库的使用流程,在中断函数中正确调用了 HAL_CAN_GetRxMessage,就无需手动清零中断标志位。

如果使用 标准库(寄存器级别编程) 而不是 HAL 库,那么在 CAN 中断接收报文后,需要手动清除中断标志位,否则 CAN 控制器可能无法接收新的报文。


1. 系统与外设初始化

1.1 HAL 库初始化
  • 调用 HAL_Init()
    初始化 HAL 库,包括重置外设、初始化系统定时器和配置中断分组,为后续外设初始化做准备。
1.2 系统时钟配置
  • 调用 SystemClock_Config()
    配置系统时钟(如 PLL、总线分频等),确保 CAN 模块所属的总线时钟正常,为 CAN 外设提供稳定的时钟信号。
1.3 GPIO 初始化
  • 配置 CAN 引脚
    通过 GPIO 初始化函数(例如 MX_GPIO_Init())配置 CAN_TX 和 CAN_RX 对应的引脚,设置为"复用功能"(Alternate Function),并选择正确的复用映射(例如 GPIO_AF9_CAN1)。
1.4 CAN 外设低级资源配置(MSP 初始化)
  • 在 HAL_CAN_MspInit() 中完成
    • 使能 CAN 外设及其所在总线的时钟。
    • 配置 CAN 引脚(如 PA11、PA12)为复用功能。
    • 配置 NVIC:设置 CAN 接收中断的优先级,并使能相应的中断通道(例如 CAN1_RX0_IRQn)。

2. CAN 外设初始化与滤波器配置

2.1 CAN 参数初始化
  • 设置 CAN_HandleTypeDef 结构体
    配置 CAN 的基本参数,如波特率、工作模式(正常模式、回环模式等)、时间段、重传策略等。
  • 调用 HAL_CAN_Init()
    根据配置初始化 CAN 外设,此时 HAL 库会自动调用 HAL_CAN_MspInit() 完成低级硬件初始化。
2.2 滤波器配置
  • 设置 CAN 滤波器参数
    根据实际应用需求配置 CAN 滤波器(例如使用 ID 掩码模式或列表模式),以便让 CAN 模块只接收符合条件的报文。
  • 调用 HAL_CAN_ConfigFilter()
    将滤波器参数写入 CAN 滤波器寄存器。
    注:滤波器配置一般在 CAN 初始化之后、启动之前完成。
2.3 启动 CAN 模块
  • 调用 HAL_CAN_Start()
    启动 CAN 外设,使其进入正常工作状态,同时使能发送与接收功能。

3. 启用中断接收

  • 使能接收中断
    在 HAL_CAN_MspInit() 中已经配置并使能了 CAN 接收中断(例如使能 FIFO0 接收中断),这样当有报文到达时,CAN 控制器会自动触发中断。

4. 中断处理流程

当 CAN 模块检测到 FIFO0 中有新报文等待接收时,自动触发 CAN 接收中断,HAL 库会调用预定义的回调函数,其详细流程如下:

4.1 进入中断回调
  • *调用回调函数 HAL_CAN_RxFifo0MsgPendingCallback(CAN_HandleTypeDef CanHandle)
    这是用户实现的回调函数,专门用于处理 FIFO0 中待接收的 CAN 报文。
4.2 读取接收到的报文
  • 调用 HAL_CAN_GetRxMessage()
    在回调中,使用该函数从 FIFO0 中读取报文数据和报文头信息:
    • 报文头包含标识符(标准或扩展 ID)、数据长度(DLC)、帧类型(数据帧或远程帧)等信息。
    • 数据部分为 0~8 字节(或更多字节,在 CAN FD 中)。
  • 返回状态检查
    如果返回值为 HAL_OK,则说明报文已正确接收。
4.3 数据处理与分发
  • 解析报文
    根据接收到的报文头字段判断报文类型和标识符,决定如何处理:
    • 对于特定 ID 的报文,可直接解析数据内容,例如拆分成多个数据变量、转换为实际物理量(如角度、速度等)。
    • 如果需要,可以将接收到的数据存入全局变量、结构体或推送到消息队列中,以便后续任务处理。
  • 业务处理
    根据应用需求,对接收到的数据进行进一步处理(如校验、转换、报警处理等)。
4.4 清除中断标志
  • 自动处理
    在调用 HAL_CAN_GetRxMessage 后,CAN 模块会自动清除相应的 FIFO 标志,确保可以接收下一条报文。

5. 后续处理

  • 非中断模式下的数据处理
    接收到的数据通常会通过中断回调保存到某个缓冲区或队列中,主循环或专门的任务会定期检查该缓冲区并对数据进行处理。
  • 错误处理
    如果在中断过程中检测到错误(例如报文校验失败、溢出等),可以调用 HAL_CAN_ErrorCallback() 或自定义错误处理函数,进行必要的错误记录或重传机制。

总结

整个中断接收 CAN 报文的详细流程为:

  1. 初始化阶段
    • 完成 HAL 库、时钟、GPIO、CAN 外设以及 NVIC 中断的初始化。
  2. CAN 配置阶段
    • 设置 CAN 参数,配置滤波器,启动 CAN 模块。
  3. 使能中断
    • 在 MSP 初始化中使能 CAN 接收中断,使得接收 FIFO0 报文时能触发中断。
  4. 中断回调处理
    • 当 CAN 检测到新报文时自动进入 HAL_CAN_RxFifo0MsgPendingCallback 回调函数。
    • 在回调中调用 HAL_CAN_GetRxMessage 从 FIFO0 读取报文。
    • 对报文头和数据进行解析,根据报文 ID 和数据内容进行相应处理,如存入队列或直接计算处理。
  5. 后续数据处理
    • 主循环或后台任务读取缓冲队列中的数据进行后续业务处理。

这种中断驱动的接收方式能保证 CAN 模块在实时接收数据时不会漏报,同时将数据处理与中断服务分离,确保系统稳定高效运行。

相关推荐
cjy_Somnr13 小时前
keil5报错显示stm32的SWDIO未连接不能烧录
stm32·单片机·嵌入式硬件
Lay_鑫辰14 小时前
西门子诊断-状态和错误位(“轴”工艺对象 V1...3)
服务器·网络·单片机·嵌入式硬件·自动化
无垠的广袤16 小时前
【工业树莓派 CM0 NANO 单板计算机】本地部署 EMQX
linux·python·嵌入式硬件·物联网·树莓派·emqx·工业物联网
雲烟18 小时前
嵌入式设备EMC安规检测参考
网络·单片机·嵌入式硬件
泽虞18 小时前
《STM32单片机开发》p7
笔记·stm32·单片机·嵌入式硬件
田甲18 小时前
【STM32】 数码管驱动
stm32·单片机·嵌入式硬件
up向上up19 小时前
基于51单片机垃圾箱自动分类加料机快递物流分拣器系统设计
单片机·嵌入式硬件·51单片机
纳祥科技1 天前
Switch快充方案,内置GaN,集成了多个独立芯片
单片机
单片机日志1 天前
【单片机毕业设计】【mcugc-mcu826】基于单片机的智能风扇系统设计
stm32·单片机·嵌入式硬件·毕业设计·智能家居·课程设计·电子信息
松涛和鸣1 天前
从零开始理解 C 语言函数指针与回调机制
linux·c语言·开发语言·嵌入式硬件·排序算法