普通网友 2025-06-10 08:10 采纳率: 98.5%
浏览 3
已采纳

STM32 CAN使用TJA1050时,HSE与HSI时钟源切换会导致通信异常吗?

在STM32 CAN使用TJA1050时,HSE与HSI时钟源切换是否会导致通信异常?这是一个常见的技术问题。STM32的CAN外设依赖系统时钟进行波特率计算,当从高速外部晶振(HSE)切换到高速内部RC振荡器(HSI)时,由于两者频率差异较大(HSE通常为8MHz或更高,而HSI约为16MHz),可能会导致CAN波特率配置偏差。这种偏差可能超出TJA1050物理层的容忍范围,从而引发通信异常,例如丢帧、错误帧或完全无法通信。因此,在实际应用中,若需切换时钟源,必须重新配置CAN的波特率寄存器以匹配新的时钟频率,并确保总线上的其他节点也能适应此变化。此外,建议尽量避免动态切换时钟源,特别是在CAN通信活跃期间,以保证通信稳定性。
  • 写回答

1条回答 默认 最新

  • 祁圆圆 2025-06-10 08:11
    关注

    1. 问题概述

    在嵌入式开发中,STM32的CAN外设依赖系统时钟(SYSCLK)进行波特率计算。当使用TJA1050作为CAN物理层收发器时,切换系统时钟源(如从HSE切换到HSI)可能会导致通信异常。这种现象的根本原因在于HSE和HSI的频率差异较大(通常HSE为8MHz或更高,而HSI约为16MHz),从而影响CAN波特率配置的准确性。

    以下将从常见技术问题、分析过程及解决方案等方面逐步深入探讨:

    • 什么是HSE与HSI?
    • 为什么切换时钟会导致CAN通信异常?
    • 如何解决这一问题?

    2. 技术分析

    HSE(High Speed External Oscillator)是外部晶振提供的精确时钟源,通常用于需要高精度的应用场景;HSI(High Speed Internal RC Oscillator)则是内部RC振荡器提供的时钟源,虽然启动速度快且无需外部元件,但其频率误差较大。

    CAN外设的波特率由以下公式决定:

    Baud Rate = (PCLK / (BTR[PRESC] * (1 + BTR[SJW + TS1 + TS2])))

    其中,PCLK是从SYSCLK派生的时钟信号。如果SYSCLK发生变化(例如从HSE切换到HSI),则PCLK也会随之变化,进而导致波特率偏差。

    TJA1050物理层对波特率容忍范围有限,超出范围可能导致丢帧、错误帧或完全无法通信。

    3. 解决方案

    以下是针对此问题的具体解决方案:

    1. 重新配置CAN波特率寄存器:在切换时钟源后,必须根据新的SYSCLK重新计算并设置波特率寄存器值。
    2. 确保总线上的其他节点兼容:所有CAN节点需能适应新的波特率设置。
    3. 避免动态切换时钟源:特别是在CAN通信活跃期间,建议固定使用一种时钟源以保证稳定性。

    以下是一个简单的代码示例,展示如何在切换时钟源后重新配置CAN波特率:

    
    void Reconfigure_CAN_BaudRate(void) {
        CAN_InitTypeDef CAN_InitStruct;
        // 假设新时钟源为HSI
        uint32_t newSysClock = 16000000; // HSI频率
        uint32_t baudRate = 500000; // 目标波特率
    
        // 计算波特率分频值
        CAN_InitStruct.Baudrate = baudRate;
        CAN_InitStruct.Mode = CAN_MODE_NORMAL;
        CAN_InitStruct.SJW = CAN_SJW_1TQ;
        CAN_InitStruct.BS1 = CAN_BS1_6TQ;
        CAN_InitStruct.BS2 = CAN_BS2_7TQ;
    
        // 根据新的时钟重新初始化CAN
        HAL_CAN_DeInit(&hcan);
        HAL_CAN_Init(&hcan, &CAN_InitStruct);
    }
        

    4. 流程图

    以下是处理该问题的流程图,帮助理解操作步骤:

    graph TD; A[开始] --> B{是否切换时钟源}; B -- 是 --> C[重新计算波特率]; C --> D[更新CAN波特率寄存器]; D --> E[检查总线节点兼容性]; E --> F[结束]; B -- 否 --> F;

    5. 数据对比表

    以下是HSE与HSI的关键参数对比:

    参数HSEHSI
    频率范围4-26 MHz约16 MHz
    精度±20 ppm(典型值)±1%至±4%
    启动时间较慢较快
    适用场景高精度需求快速启动需求
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 已采纳回答 10月23日
  • 创建了问题 6月10日