[STM32G4] 探索 STM32G431:基于 CAN 总线的从设备通信实现

[复制链接]
1935|12
 楼主| 周半梅 发表于 2025-1-15 07:39 | 显示全部楼层 |阅读模式
STM32G431 是 STMicroelectronics 推出的一款高性能微控制器,基于 ARM Cortex-M4 内核,特别适合工业控制和嵌入式应用。本篇文章将以 STM32G431 为例,详细介绍如何利用 CAN 总线实现从设备通信功能。我们将覆盖硬件配置、固件开发及调试的完整流程,最后提供一段完整的代码示例。

STM32G431 的特点与优势STM32G431 提供丰富的外设和功能:
  • 性能优越:170 MHz 主频,内置浮点运算单元 (FPU)。
  • 集成 CAN 总线控制器:支持 CAN FD,适合高效通信。
  • 丰富的外设接口:UART、SPI、I2C 等,可轻松扩展外设。
对于需要多设备间实时通信的项目,STM32G431 的 CAN 模块是一个非常适合的选择。

硬件连接为了实现从设备的 CAN 通信,需要以下硬件配置:
  • MCU 核心板:STM32G431 芯片最小系统板。
  • CAN 收发器:例如 MCP2551。
  • 总线连接:120 Ω 终端电阻,保证信号稳定。
典型硬件连接图如下:
  • STM32G431 的 CAN_TX 和 CAN_RX 分别连接到收发器的 TXD 和 RXD。
  • 收发器的 CANH 和 CANL 连接到 CAN 总线。

软件开发使用的开发工具
  • IDE:STM32CubeIDE
  • 配置工具:STM32CubeMX

实现步骤
  • CAN 模块初始化
    使用 STM32CubeMX 配置 CAN 接口,选择相应的 GPIO 和波特率(例如 500 kbps)。
  • 编写从设备代码

    • 配置 CAN 接口接收过滤器。
    • 实现 CAN 消息的接收和处理。
    • 响应主机指令并发送状态。
  • 调试与验证
    利用 USB-CAN 调试工具,验证从设备是否正确接收并响应 CAN 消息。


示例代码以下是一个完整的从设备通信实现代码示例:
  1. #include "main.h"

  2. CAN_HandleTypeDef hcan;
  3. CAN_RxHeaderTypeDef rxHeader;
  4. uint8_t rxData[8];
  5. uint8_t txData[8];
  6. CAN_TxHeaderTypeDef txHeader;
  7. uint32_t txMailbox;

  8. // 初始化 CAN
  9. void CAN_Init(void) {
  10.     hcan.Instance = CAN1;
  11.     hcan.Init.Prescaler = 6;
  12.     hcan.Init.Mode = CAN_MODE_NORMAL;
  13.     hcan.Init.SyncJumpWidth = CAN_SJW_1TQ;
  14.     hcan.Init.TimeSeg1 = CAN_BS1_13TQ;
  15.     hcan.Init.TimeSeg2 = CAN_BS2_2TQ;
  16.     hcan.Init.AutoBusOff = DISABLE;
  17.     hcan.Init.AutoRetransmission = ENABLE;
  18.     hcan.Init.ReceiveFifoLocked = DISABLE;
  19.     hcan.Init.TransmitFifoPriority = DISABLE;
  20.    
  21.     if (HAL_CAN_Init(&hcan) != HAL_OK) {
  22.         Error_Handler();
  23.     }
  24. }

  25. // 配置过滤器
  26. void CAN_Filter_Config(void) {
  27.     CAN_FilterTypeDef filterConfig;
  28.     filterConfig.FilterBank = 0;
  29.     filterConfig.FilterMode = CAN_FILTERMODE_IDMASK;
  30.     filterConfig.FilterScale = CAN_FILTERSCALE_32BIT;
  31.     filterConfig.FilterIdHigh = 0x0000;
  32.     filterConfig.FilterIdLow = 0x0000;
  33.     filterConfig.FilterMaskIdHigh = 0x0000;
  34.     filterConfig.FilterMaskIdLow = 0x0000;
  35.     filterConfig.FilterFIFOAssignment = CAN_FILTER_FIFO0;
  36.     filterConfig.FilterActivation = ENABLE;
  37.     filterConfig.SlaveStartFilterBank = 14;

  38.     if (HAL_CAN_ConfigFilter(&hcan, &filterConfig) != HAL_OK) {
  39.         Error_Handler();
  40.     }
  41. }

  42. // 发送 CAN 消息
  43. void CAN_Send_Message(uint32_t id, uint8_t *data, uint8_t len) {
  44.     txHeader.StdId = id;
  45.     txHeader.ExtId = 0x01;
  46.     txHeader.IDE = CAN_ID_STD;
  47.     txHeader.RTR = CAN_RTR_DATA;
  48.     txHeader.DLC = len;

  49.     if (HAL_CAN_AddTxMessage(&hcan, &txHeader, data, &txMailbox) != HAL_OK) {
  50.         Error_Handler();
  51.     }
  52. }

  53. // 主循环接收并处理数据
  54. void HAL_CAN_RxFifo0MsgPendingCallback(CAN_HandleTypeDef *hcan) {
  55.     HAL_CAN_GetRxMessage(hcan, CAN_RX_FIFO0, &rxHeader, rxData);
  56.     // 解析收到的消息并发送响应
  57.     if (rxHeader.StdId == 0x123) {
  58.         txData[0] = 0xAB; // 示例状态
  59.         CAN_Send_Message(0x124, txData, 1);
  60.     }
  61. }

  62. int main(void) {
  63.     HAL_Init();
  64.     SystemClock_Config();
  65.     CAN_Init();
  66.     CAN_Filter_Config();
  67.    
  68.     // 启动 CAN
  69.     if (HAL_CAN_Start(&hcan) != HAL_OK) {
  70.         Error_Handler();
  71.     }
  72.     // 激活中断
  73.     if (HAL_CAN_ActivateNotification(&hcan, CAN_IT_RX_FIFO0_MSG_PENDING) != HAL_OK) {
  74.         Error_Handler();
  75.     }
  76.    
  77.     while (1) {
  78.         // 主循环处理逻辑
  79.     }
  80. }
总结本文介绍了 STM32G431 的 CAN 总线配置和从设备通信实现。通过配置过滤器和中断回调,实现了主从通信的基本功能。这套方案在实际应用中具有广泛的扩展性,适合需要高效、多设备协作的嵌入式项目。
如果你对 STM32G431 或 CAN 总线有更多的兴趣,可以继续深入研究 CAN FD 的应用或结合 RTOS 实现更复杂的系统功能。

公羊子丹 发表于 2025-1-15 07:39 | 显示全部楼层
这篇文章写得很详细,对初学者非常友好!
帛灿灿 发表于 2025-1-15 07:39 | 显示全部楼层
我在使用 STM32G431 的时候遇到过中断不触发的问题,看完代码找到了解决办法。
童雨竹 发表于 2025-1-15 07:39 | 显示全部楼层
CAN 通信确实是工业应用的神器,赞一个!
万图 发表于 2025-1-15 07:40 | 显示全部楼层
我觉得加上一些关于调试技巧的分享会更完善。
Wordsworth 发表于 2025-1-15 07:40 | 显示全部楼层
STM32CubeMX 配置这块解释得很清楚,新手也能快速上手。
Bblythe 发表于 2025-1-15 07:40 | 显示全部楼层
希望能有更多关于 CAN FD 的文章分享!
Pulitzer 发表于 2025-1-15 07:40 | 显示全部楼层
如果能加一些错误处理的细节就更棒了。
Uriah 发表于 2025-1-15 07:41 | 显示全部楼层
这个代码我直接用在我的项目里了,非常实用!
Clyde011 发表于 2025-1-15 07:41 | 显示全部楼层
有没有推荐的 CAN 收发器型号?MCP2551 够用吗?
哈根达斯uz 发表于 2025-1-15 22:16 来自手机 | 显示全部楼层
如何利用 CAN 总线实现从设备通信功能。我们将覆盖硬件配置、固件开发及调试的完整流程
Amazingxixixi 发表于 2025-1-21 17:26 | 显示全部楼层
学习一下啊,还有好多需要学习的。
SophiaOP 发表于 2025-1-22 21:25 来自手机 | 显示全部楼层
can是汽车上用的比较多吧
您需要登录后才可以回帖 登录 | 注册

本版积分规则

170

主题

6161

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部