STM32F4的CAN总线学习笔记
### STM32F4的CAN总线学习笔记 #### 一、引言 在嵌入式系统开发过程中,CAN(Controller Area Network)总线是一种广泛应用于汽车电子、工业自动化等领域的串行通信协议。它能够实现可靠的数据传输,并且具有较高的抗干扰能力。STM32F4系列微控制器内置了高性能的CAN控制器,支持多种CAN通信标准,因此非常适用于需要CAN通信的应用场景。 #### 二、STM32F4的CAN硬件接口配置 ##### 2.1 GPIO配置 在STM32F4中,CAN总线的硬件接口主要通过GPIO端口实现。以下代码展示了如何配置GPIO端口用于CAN通信: ```c #define CAN_Tx_Port GPIOH #define CAN_Tx_Pin GPIO_Pin_13 #define CAN_Rx_Port GPIOI #define CAN_Rx_Pin GPIO_Pin_9 void CAN_GPIO_Config(void) { GPIO_InitTypeDef GPIO_init; RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOH | RCC_AHB1Periph_GPIOI, ENABLE); GPIO_PinAFConfig(CAN_Tx_Port, GPIO_PinSource13, GPIO_AF_CAN1); GPIO_PinAFConfig(CAN_Rx_Port, GPIO_PinSource9, GPIO_AF_CAN1); GPIO_init.GPIO_Mode = GPIO_Mode_AF; GPIO_init.GPIO_OType = GPIO_OType_PP; GPIO_init.GPIO_PuPd = GPIO_PuPd_UP; GPIO_init.GPIO_Speed = GPIO_Speed_50MHz; GPIO_init.GPIO_Pin = CAN_Tx_Pin; GPIO_Init(CAN_Tx_Port, &GPIO_init); GPIO_init.GPIO_Pin = CAN_Rx_Pin; GPIO_Init(CAN_Rx_Port, &GPIO_init); } ``` 上述代码首先定义了两个GPIO端口(GPIOH和GPIOI)作为CAN的发送和接收端口,并指定了具体的GPIO引脚(13号和9号)。接下来,通过`RCC_AHB1PeriphClockCmd`函数启用这两个GPIO端口的时钟。接着使用`GPIO_PinAFConfig`函数配置GPIO引脚的替代功能为CAN1。然后初始化GPIO结构体,并设置工作模式为复用输出(`GPIO_Mode_AF`)、推挽输出类型(`GPIO_OType_PP`)、上拉输入(`GPIO_PuPd_UP`)以及最大速度为50MHz(`GPIO_Speed_50MHz`)。最后调用`GPIO_Init`函数完成GPIO配置。 ##### 2.2 CAN控制器配置 配置完GPIO端口后,还需要进一步配置CAN控制器。以下是一段示例代码,用于初始化CAN控制器: ```c void CAN_Config(void) { CAN_InitTypeDef CAN_init; CAN_FilterInitTypeDef CAN_Filter_init; CAN_DeInit(CAN1); RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN1, ENABLE); // 工作模式的设置 CAN_init.CAN_Mode = CAN_Mode_Normal; // 发送FIFO使能 CAN_init.CAN_TXFP = DISABLE; // 自动重发功能使能 CAN_init.CAN_NART = DISABLE; // FIFO锁定功能 CAN_init.CAN_RFLM = DISABLE; // 总线自动恢复功能 CAN_init.CAN_ABOM = DISABLE; // 其他配置 CAN_init.CAN_AWUM = DISABLE; CAN_init.CAN_TTCM = DISABLE; CAN_Init(CAN1, &CAN_init); } ``` 这段代码首先初始化了CAN_InitTypeDef结构体,然后设置了CAN的工作模式为普通模式(`CAN_Mode_Normal`),禁用了发送FIFO、自动重发等功能。接下来,禁用了FIFO锁定功能,这意味着当FIFO邮箱已满之后,新接收到的消息会覆盖最旧的消息。此外,还禁用了总线自动恢复功能(`CAN_ABOM`),这表示当发生总线关闭状态时,不会自动尝试恢复。最后调用`CAN_Init`函数完成CAN控制器的初始化。 #### 三、CAN总线比特率计算 CAN总线的比特率是通过定时器来控制的,其计算公式如下: \[ \text{Nominal Bit Time} = 1 \times Tq + t_{BS1} + t_{BS2} \] 其中: - \(Tq\) 是时间量子,即每个时间量子所占的时间。 - \(t_{BS1}\) 和 \(t_{BS2}\) 分别是传播阶段1和传播阶段2的时间。 具体的计算方法可以通过下面的公式来实现: - \(t_{BS1} = Tq \times (TS1[3:0] + 1)\) - \(t_{BS2} = Tq \times (TS2[2:0] + 1)\) 这里的\(TS1\)和\(TS2\)是CAN控制器中的定时寄存器值,它们用于调整传播阶段的时间长度,从而控制CAN总线的比特率。 #### 四、总结 通过以上介绍,我们可以了解到STM32F4系列微控制器如何利用其内置的CAN控制器实现CAN通信功能。这包括GPIO端口的配置、CAN控制器的初始化以及比特率的计算等方面的知识点。这些内容对于理解STM32F4的CAN总线工作原理非常重要,也是实际开发中必不可少的基础知识。