STM32F103CAN寄存器配置
时间: 2025-05-19 14:19:25 浏览: 14
### STM32F103 CAN 寄存器配置详解
STM32F103 微控制器支持 CAN 协议,其硬件模块提供了丰富的功能来实现汽车电子和其他工业应用中的可靠通信。以下是关于如何配置 STM32F103 的 CAN 寄存器的相关说明。
#### 配置 CAN 控制器的基本流程
为了使能 CAN 功能并正常工作,需要对多个寄存器进行设置。这些寄存器主要包括以下几个部分:
1. **CAN 初始化模式**
在进入初始化模式之前,必须先禁用 CAN 总线上的所有活动操作。通过设置 `CAN_MCR` 寄存器的 `INRQ` 位可以请求进入初始化状态[^1]。
```c
CAN->MCR |= CAN_MCR_INRQ; // 请求进入初始化模式
while (!(CAN->MSR & CAN_MSR_INAK)); // 等待进入初始化模式
```
2. **波特率配置**
波特率由 `CAN_BTR` 寄存器控制,该寄存器定义了同步跳转宽度 (`SJW`)、时间分段 1 和 2 (`TS1`, `TS2`) 以及重采样位数 (`BRP`)。具体计算公式如下:
\[
f_{bit} = \frac{f_{CAN}}{(BRP + 1) \times (TSEG1 + TSEG2 + 1)}
\]
其中 \( f_{CAN} \) 是 APB1 总线频率[^1]。
示例代码:
```c
CAN->BTR = (PRESCALER << 20) | ((SJW - 1) << 16) | ((TS1 - 1) << 12) | (TS2 - 1);
```
3. **过滤器配置**
CAN 接收滤波器决定了哪些 ID 的消息会被接受或拒绝。STM32 提供了多种滤波器模式(如标识符列表模式和掩码模式)。以下是一个简单示例,展示如何配置单个标准帧 ID 的接收滤波器[^1]:
```c
CAN_FilterInitTypeDef filter;
filter.FilterIdHigh = 0x000; // 标准ID高位
filter.FilterIdLow = 0x18<<5; // 标准ID低位
filter.FilterMaskIdHigh = 0x000; // 掩码高位
filter.FilterMaskIdLow = 0x7FF<<5; // 掩码低位
filter.FilterMode = CAN_FILTERMODE_IDMASK;
filter.FilterScale = CAN_FILTERSCALE_32BIT;
filter.FilterBank = 0;
filter.FilterFIFOAssignment = CAN_FIFO0;
filter.FilterActivation = ENABLE;
CAN_FilterInit(&filter);
```
4. **中断配置**
中断机制允许程序响应特定事件的发生,例如接收到新消息或发生错误。可以通过设置 `CAN_IER` 寄存器启用相应的中断源:
```c
CAN->IER |= CAN_IER_FMPIE0; // 启用 FIFO0 新消息中断
NVIC_EnableIRQ(USB_LP_CAN1_RX0_IRQn); // 启用对应中断向量
```
5. **退出初始化模式**
完成上述配置后,应清除 `INRQ` 位以恢复正常运行模式[^1]:
```c
CAN->MCR &= ~CAN_MCR_INRQ; // 退出初始化模式
while (CAN->MSR & CAN_MSR_INAK); // 等待退出初始化模式
```
#### 实际应用场景下的注意事项
当设计基于 STM32F103 的 CAN 应用时,还需要注意一些额外的因素,比如信号完整性、终端电阻匹配以及电磁兼容性等问题。这些问题通常不在软件层面解决,但在硬件设计阶段非常重要[^1]。
---
### 示例代码总结
下面是一份完整的 CAN 初始化代码片段,综合以上各部分内容:
```c
#include "stm32f1xx_hal.h"
void CAN_Init(void) {
// 进入初始化模式
CAN->MCR |= CAN_MCR_INRQ;
while (!(CAN->MSR & CAN_MSR_INAK));
// 配置波特率
uint32_t PRESCALER = 9; // 假设APB1=36MHz, BRP=(PRESCALER+1)=10 -> 3.6Mbps
uint8_t SJW = 1, TS1 = 13, TS2 = 2;
CAN->BTR = (PRESCALER << 20) | ((SJW - 1) << 16) | ((TS1 - 1) << 12) | (TS2 - 1);
// 配置滤波器
CAN_FilterInitTypeDef filter;
filter.FilterIdHigh = 0x000;
filter.FilterIdLow = 0x18 << 5;
filter.FilterMaskIdHigh = 0x000;
filter.FilterMaskIdLow = 0x7FF << 5;
filter.FilterMode = CAN_FILTERMODE_IDMASK;
filter.FilterScale = CAN_FILTERSCALE_32BIT;
filter.FilterBank = 0;
filter.FilterFIFOAssignment = CAN_FIFO0;
filter.FilterActivation = ENABLE;
CAN_FilterInit(&filter);
// 启用中断
CAN->IER |= CAN_IER_FMPIE0;
// 退出初始化模式
CAN->MCR &= ~CAN_MCR_INRQ;
while (CAN->MSR & CAN_MSR_INAK);
}
```
---
阅读全文
相关推荐


















