当前位置:实例文章 » 其他实例» [文章]【通讯协议备忘录】stm32的CAN外设

【通讯协议备忘录】stm32的CAN外设

发布人:shili8 发布时间:2024-12-25 23:16 阅读次数:0

**STM32 CAN 外设通讯协议备忘录**

**1. 前言**

CAN(Controller Area Network)是一种广泛用于汽车电子系统中的串行通信总线。它提供了一个高效的、低成本的通信方式,适合于在汽车电子系统中传输数据。STM32系列微控制器都内置有CAN外设,可以支持CAN协议的实现。

**2. CAN 总线概述**

CAN是一种多主机、半双工的总线。它使用一个总线来连接所有设备,每个设备都有自己的ID(识别码),用于区分数据包来源。CAN总线支持多种传输速率,最高可达1Mbps。

**3. CAN 外设特性**

STM32系列微控制器上的CAN外设具有以下特性:

* 支持CAN2.0A和CAN2.0B协议* 支持11-bit和29-bitID* 支持多种传输速率,最高可达1Mbps* 支持自动重发功能(在数据包发送过程中,如果接收到错误的数据包,则会自动重发)
* 支持过滤功能(可以根据ID过滤掉不需要的数据包)

**4. CAN 外设寄存器**

CAN外设使用一组寄存器来控制和配置总线。以下是这些寄存器的描述:

| 寄存器名 | 位数 | 描述 |
| --- | --- | --- |
| CR1 |32位 | CAN控制寄存器1,用于设置总线模式、传输速率等参数 |
| CR2 |32位 | CAN控制寄存器2,用于设置自动重发功能和过滤功能等参数 |
| SR1 |32位 | CAN状态寄存器1,用于读取总线状态信息 |
| SR2 |32位 | CAN状态寄存器2,用于读取总线状态信息 |

**5. CAN 外设配置**

以下是如何配置CAN外设的示例代码:

c#include "stm32f10x.h"

void CAN_Config(void)
{
 // 设置总线模式为标准模式 GPIO_InitTypeDef GPIO_InitStruct;
 GPIO_InitStruct.Pin = GPIO_PIN_0; // CAN_TX GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
 GPIO_InitStruct.Pull = GPIO_NOPULL;
 GPIO_InitStruct.Speed = GPIO_SPEED_HIGH;
 GPIO_InitStruct.Alternate = GPIO_AF5_CAN;
 HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

 // 设置总线模式为扩展模式 GPIO_InitStruct.Pin = GPIO_PIN_1; // CAN_RX GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
 GPIO_InitStruct.Pull = GPIO_NOPULL;
 GPIO_InitStruct.Speed = GPIO_SPEED_HIGH;
 GPIO_InitStruct.Alternate = GPIO_AF5_CAN;
 HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

 // 设置总线传输速率为1Mbps CAN_FilterInitTypeDef sFilterInit;
 sFilterInit.FilterMode = CAN_FILTERMODE_IDMASK;
 sFilterInit.FilterScale = CAN_FILTERSCALE_6BIT;
 sFilterInit.FilterIdHigh =0x0000; // ID高位 sFilterInit.FilterIdLow =0x0000; // ID低位 sFilterInit.FilterMaskIdHigh =0x0000; // ID掩码高位 sFilterInit.FilterMaskIdLow =0x0000; // ID掩码低位 HAL_CAN_ConfigFilter(&hcan, &sFilterInit);

 // 设置总线模式为标准模式 CAN_FilterInitTypeDef sFilterInit;
 sFilterInit.FilterMode = CAN_FILTERMODE_IDMASK;
 sFilterInit.FilterScale = CAN_FILTERSCALE_6BIT;
 sFilterInit.FilterIdHigh =0x0000; // ID高位 sFilterInit.FilterIdLow =0x0000; // ID低位 sFilterInit.FilterMaskIdHigh =0x0000; // ID掩码高位 sFilterInit.FilterMaskIdLow =0x0000; // ID掩码低位 HAL_CAN_ConfigFilter(&hcan, &sFilterInit);
}


**6. CAN 外设发送**

以下是如何使用CAN外设发送数据的示例代码:

c#include "stm32f10x.h"

void CAN_Send(void)
{
 // 设置总线模式为标准模式 GPIO_InitTypeDef GPIO_InitStruct;
 GPIO_InitStruct.Pin = GPIO_PIN_0; // CAN_TX GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
 GPIO_InitStruct.Pull = GPIO_NOPULL;
 GPIO_InitStruct.Speed = GPIO_SPEED_HIGH;
 GPIO_InitStruct.Alternate = GPIO_AF5_CAN;
 HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

 // 设置总线模式为扩展模式 GPIO_InitStruct.Pin = GPIO_PIN_1; // CAN_RX GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
 GPIO_InitStruct.Pull = GPIO_NOPULL;
 GPIO_InitStruct.Speed = GPIO_SPEED_HIGH;
 GPIO_InitStruct.Alternate = GPIO_AF5_CAN;
 HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

 // 设置总线传输速率为1Mbps CAN_FilterInitTypeDef sFilterInit;
 sFilterInit.FilterMode = CAN_FILTERMODE_IDMASK;
 sFilterInit.FilterScale = CAN_FILTERSCALE_6BIT;
 sFilterInit.FilterIdHigh =0x0000; // ID高位 sFilterInit.FilterIdLow =0x0000; // ID低位 sFilterInit.FilterMaskIdHigh =0x0000; // ID掩码高位 sFilterInit.FilterMaskIdLow =0x0000; // ID掩码低位 HAL_CAN_ConfigFilter(&hcan, &sFilterInit);

 // 设置总线模式为标准模式 CAN_FilterInitTypeDef sFilterInit;
 sFilterInit.FilterMode = CAN_FILTERMODE_IDMASK;
 sFilterInit.FilterScale = CAN_FILTERSCALE_6BIT;
 sFilterInit.FilterIdHigh =0x0000; // ID高位 sFilterInit.FilterIdLow =0x0000; // ID低位 sFilterInit.FilterMaskIdHigh =0x0000; // ID掩码高位 sFilterInit.FilterMaskIdLow =0x0000; // ID掩码低位 HAL_CAN_ConfigFilter(&hcan, &sFilterInit);

 // 发送数据包 uint32_t data[8];
 data[0] =0x12345678;
 data[1] =0x90123456;
 data[2] =0x78901234;
 data[3] =0x56789012;
 data[4] =0x34567890;
 data[5] =0x12345678;
 data[6] =0x90123456;
 data[7] =0x78901234;

 HAL_CAN_Transmit(&hcan, data,8,100);
}


**7. CAN 外设接收**

以下是如何使用CAN外设接收数据的示例代码:

c#include "stm32f10x.h"

void CAN_Receive(void)
{
 // 设置总线模式为标准模式 GPIO_InitTypeDef GPIO_InitStruct;
 GPIO_InitStruct.Pin = GPIO_PIN_0; // CAN_TX GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
 GPIO_InitStruct.Pull = GPIO_NOPULL;
 GPIO_InitStruct.Speed = GPIO_SPEED_HIGH;
 GPIO_InitStruct.Alternate = GPIO_AF5_CAN;
 HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

 // 设置总线模式为扩展模式 GPIO_InitStruct.Pin = GPIO_PIN_1; // CAN_RX GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
 GPIO_InitStruct.Pull = GPIO_NOPULL;
 GPIO_InitStruct.Speed = GPIO_SPEED_HIGH;
 GPIO_InitStruct.Alternate = GPIO_AF5_CAN;
 HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

 // 设置总线传输速率为1Mbps CAN_FilterInitTypeDef sFilterInit;
 sFilterInit.FilterMode = CAN_FILTERMODE_IDMASK;
 sFilterInit.FilterScale = CAN_FILTERSCALE_6BIT;
 sFilterInit.FilterIdHigh =0x0000; // ID高位 sFilterInit.FilterIdLow =0x0000; // ID低位 sFilterInit.FilterMaskIdHigh =0x0000; // ID掩码高位 sFilterInit.FilterMaskIdLow =0x0000; // ID掩码低位 HAL_CAN_ConfigFilter(&hcan, &sFilterInit);

 // 设置总线模式为标准模式 CAN_FilterInitTypeDef sFilterInit;
 sFilterInit.FilterMode = CAN_FILTERMODE_IDMASK;
 sFilterInit.FilterScale = CAN_FILTERSCALE_6BIT;
 sFilterInit.FilterIdHigh =0x0000; // ID高位 sFilterInit.FilterIdLow =

其他信息

其他资源

Top