打印
[STM32G4]

STM32G431 MCU使用示例:基于CAN通信的温度监控系统

[复制链接]
65|9
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
帛灿灿|  楼主 | 2024-12-17 07:51 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
在现代嵌入式系统中,STM32系列微控制器(MCU)以其强大的性能和丰富的外设支持成为了很多开发者的首选。STM32G431是ST公司推出的基于Arm Cortex-M4核心的MCU,具备高速性能和丰富的外围接口,尤其在CAN(Controller Area Network)总线应用中具有优势。本文将通过一个基于STM32G431的温度监控系统示例,来展示如何利用STM32G431的CAN接口进行多控制器通信,并实现温度数据的实时采集与传输。
系统概述在本示例中,我们将设计一个简单的温度监控系统。该系统包含一个PC端主机和多个STM32G431 MCU作为从设备。每个从设备都会通过CAN总线定期向主机报告其所在位置的温度数据。通过这种方式,主机能够收集所有从设备的数据,并进行集中处理。
主要硬件配置
  • 主机:PC,负责接收来自各个STM32G431从设备的温度数据。
  • 从设备:多个STM32G431微控制器,每个控制器都连接一个温度传感器(如DS18B20)。
  • 通信接口:CAN总线,用于主机和各个从设备之间的数据传输。
开发环境
  • 硬件平台:STM32G431开发板
  • 软件工具:STM32CubeIDE,STM32CubeMX,Keil uVision(可选)
  • 编程语言:C语言
  • 温度传感器:DS18B20(数字温度传感器)
代码实现1. STM32G431 MCU的初始化首先,使用STM32CubeMX配置STM32G431的基本外设。启用CAN接口并配置为标准模式。对于温度传感器的读取,可以通过I/O端口进行控制,或使用一个适当的库来读取DS18B20的数据。
以下是STM32G431主机和从机的基本初始化代码:
#include "stm32g4xx_hal.h"
#include "cmsis_os.h"
#include "can.h"
#include "ds18b20.h"

CAN_HandleTypeDef hcan1;
UART_HandleTypeDef huart2;
DS18B20_HandleTypeDef htemp_sensor;

void SystemClock_Config(void);
static void MX_GPIO_Init(void);
static void MX_CAN1_Init(void);
static void MX_USART2_UART_Init(void);
static void MX_DS18B20_Init(void);
void CAN_Transmit(uint8_t* data, uint8_t len);
void CAN_Receive(uint8_t* buffer, uint8_t len);

int main(void)
{
  HAL_Init();
  SystemClock_Config();
  MX_GPIO_Init();
  MX_CAN1_Init();
  MX_USART2_UART_Init();
  MX_DS18B20_Init();

  uint8_t temp_data[8];  // Temperature data buffer
  
  while (1)
  {
    // Read temperature from DS18B20
    float temperature = DS18B20_ReadTemperature(&htemp_sensor);
   
    // Convert temperature to byte data
    temp_data[0] = (uint8_t)(temperature);  // Temperature low byte
    temp_data[1] = (uint8_t)(temperature >> 8);  // Temperature high byte
   
    // Transmit temperature data over CAN
    CAN_Transmit(temp_data, sizeof(temp_data));
   
    HAL_Delay(1000);  // Delay for 1 second
  }
}

static void MX_CAN1_Init(void)
{
  hcan1.Instance = CAN1;
  hcan1.Init.Prescaler = 16;
  hcan1.Init.Mode = CAN_MODE_NORMAL;
  hcan1.Init.SyncJumpWidth = CAN_SJW_1TQ;
  hcan1.Init.TimeSeg1 = CAN_BS1_8TQ;
  hcan1.Init.TimeSeg2 = CAN_BS2_3TQ;
  hcan1.Init.AutoBusOff = CAN_AUTOBUSOFF_DISABLE;
  hcan1.Init.AutoWakeUp = CAN_AUTOWAKEUP_DISABLE;
  hcan1.Init.TransmitFifoPriority = CAN_TXFIFO_PRIORITY_HIGH;
  
  if (HAL_CAN_Init(&hcan1) != HAL_OK)
  {
    Error_Handler();
  }
}

static void MX_DS18B20_Init(void)
{
  DS18B20_Init(&htemp_sensor, GPIOB, GPIO_PIN_0);
}

void CAN_Transmit(uint8_t* data, uint8_t len)
{
  CAN_TxHeaderTypeDef TxHeader;
  uint32_t TxMailbox;

  TxHeader.StdId = 0x321;
  TxHeader.ExtId = 0x01;
  TxHeader.RTR = CAN_RTR_DATA;
  TxHeader.IDE = CAN_ID_STD;
  TxHeader.DLC = len;
  TxHeader.TransmitGlobalTime = DISABLE;

  if (HAL_CAN_AddTxMessage(&hcan1, &TxHeader, data, &TxMailbox) != HAL_OK)
  {
    Error_Handler();
  }
}

void CAN_Receive(uint8_t* buffer, uint8_t len)
{
  CAN_RxHeaderTypeDef RxHeader;
  
  if (HAL_CAN_GetRxMessage(&hcan1, CAN_RX_FIFO0, &RxHeader, buffer) != HAL_OK)
  {
    Error_Handler();
  }
}
2. PC端接收数据在PC端,您可以使用CAN总线的USB转接模块与PC进行通信,并使用相应的CAN驱动程序读取来自STM32G431从设备的数据。这里展示的是如何在PC端使用Python通过CAN接口接收数据:
import can
import time

def receive_can_data(channel):
    bus = can.interface.Bus(channel=channel, bustype='socketcan')
    while True:
        message = bus.recv()
        print(f"ID: {message.arbitration_id}, Data: {message.data.hex()}")
        time.sleep(1)

if __name__ == '__main__':
    receive_can_data('can0')  # 根据实际的CAN接口名称选择
系统测试与验证完成上述代码编写后,您可以进行系统测试。确保温度传感器正确连接,并且所有STM32G431控制器通过CAN总线与PC进行通信。PC端应该能够接收到每个控制器发送的温度数据并实时显示。
总结本文介绍了如何使用STM32G431微控制器,通过CAN总线实现温度监控系统的设计。STM32G431具备丰富的外设接口,适用于各种通信协议,尤其是CAN总线应用。通过实际代码的示例,我们展示了如何在嵌入式开发中实现温度数据的采集、处理和传输。

使用特权

评论回复
沙发
公羊子丹| | 2024-12-17 07:51 | 只看该作者
这个项目看起来不错,CAN总线真的很适合多设备通信,STM32G431性价比也高!

使用特权

评论回复
板凳
周半梅| | 2024-12-17 07:51 | 只看该作者
这篇文章对我很有帮助,能否再详细说明一下DS18B20的驱动部分?

使用特权

评论回复
地板
童雨竹| | 2024-12-17 07:51 | 只看该作者
代码写得很清晰,感谢分享!我在用STM32F4的开发板,改一下应该就能用吧。

使用特权

评论回复
5
万图| | 2024-12-17 07:52 | 只看该作者
使用CAN总线感觉很靠谱,特别是处理多个设备时,稳定性强。

使用特权

评论回复
6
Wordsworth| | 2024-12-17 07:52 | 只看该作者
这类项目我也做过,CAN总线确实是工业自动化中常用的技术。

使用特权

评论回复
7
Pulitzer| | 2024-12-17 07:52 | 只看该作者
请问PC端如何通过CAN设备接收数据?有更多资料可以推荐吗?

使用特权

评论回复
8
Bblythe| | 2024-12-17 07:53 | 只看该作者
看了你的代码,觉得DS18B20的部分可以优化,是否考虑过多线程来做?

使用特权

评论回复
9
Uriah| | 2024-12-17 07:53 | 只看该作者
这个项目的应用场景很广泛,可以做为温湿度监控系统的一部分,真不错。

使用特权

评论回复
10
Clyde011| | 2024-12-17 07:53 | 只看该作者
STM32G431这个芯片真的是不错,CAN通信的性能很好,集成度高。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

38

主题

3780

帖子

0

粉丝