如何使用 Python 计算 STM32 bxCAN 位时序

当我需要配置一些具有非标准时钟速度的 STM32 微控制器以使用正确的 CAN 位时序。

虽然此脚本是为 STM32F413 系列编写的,但它应该适用于几乎所有带有 bxCAN 的 STM32 MCU - 但是,你需要检查细节,特别是 CAN 从哪个时钟派生。

你需要知道:

使用迭代试错方法,我们将确定 BRPTS1TS2 的适当值(这些是 CAN 中的特定位集):

bxcan.py
#!/usr/bin/env python3
# 配置。在此更改
master_clock = 48e6 # PCLK1, or whatever CLK CAN is derived from
desired_baudrate = 1e6 # 1e6 = 1 MBaud, 500e3 = 500 kBaud
# 寄存器值
brp = 5 # Baud rate prescaler
ts1 = 4 # (Length of time segment 1) - 1
ts2 = 1 # (Length of time segment 2) - 1

# 计算。你通常不需要更改此部分。
bs1_segments = ts1 +1
bs2_segments = ts2 + 1
total_segments = 1 + bs1_segments + bs2_segments
bittime = 1. / desired_baudrate
master_time = 1. / master_clock
tq = (brp + 1) * master_time
total_time = total_segments * tq
effective_rate = 1. / total_time
sample_point = 1 - (bs2_segments / total_segments)

# 打印结果
print(f"Effective Baudrate: {effective_rate:.2f} Baud = {100. * effective_rate / desired_baudrate:.2f} % of desired baudrate")
print(f"Sample point: {100. * sample_point:.2f}  %")

运行此脚本时,你将看到类似这样的输出:

output.txt
Effective Baudrate: 1000000.00 Baud = 100.00 % of desired baudrate
Sample point: 75.00  %

当然你需要在顶部填写主时钟频率和所需波特率。你可以从 BRPTS1TS2 的预配置值开始。

最后,你应该达到所需波特率的 100% 和 87.5% 的采样点(80%90% 通常可以,75% 在长电缆时可能不起作用。可能有通信标准规定的特定值,例如 CANOpenJ1939)。

更改 BRPTS1TS2 的值,重新运行脚本并每次观察输出。我建议首先更改 BRP 直到接近,然后使用此算法调整:

注意可能存在没有理想设置的主时钟速度和波特率。确保检查稍微不同的波特率在你的应用中是否仍然可以(通常不可以)。如果不可以,你需要找到使用不同 PCLK1 速度的方法。


Check out similar posts by category: Electronics, Embedded