IfxStm_getFrequency()返回100MHzTC397默认配置可能未启用PLL或分频设置不正确。请按以下步骤检查和修改:
#include "IfxScuCcu.h"
void initClockTo300MHz(void)
{
IfxScuCcu_Config config;
IfxScuCcu_initConfig(&config); // 加载默认配置
// 配置PLL参数(假设使用20MHz外部晶振)
config.pllInitialStep = IfxScuCcu_PllInitialStep_x2; // 安全启动
config.pllInputFrequency = 20000000; // 20MHz晶振
config.pllVcoDivider = 1; // PLLDIV = 1
config.pllVcoMultiplier = 30; // PLLN = 30
config.pllOutputDivider = 2; // PLLP = 2
// 计算:fPLL = (20MHz * 30) / (1 * 2) = 300MHz
config.cpuFrequency = 300000000; // CPU频率
config.stmFrequency = config.cpuFrequency; // STM使用相同频率
// 应用配置
IfxScuCcu_init(&config);
}
int main(void)
{
initClockTo300MHz(); // 在main()开头调用
// ...其他初始化代码
// 验证频率
float stmFreq = IfxStm_getFrequency(&MODULE_STM0);
// stmFreq现在应为300MHz
}关键检查点:
if (IfxScuCcu_isPllLocked()) {
// PLL已锁定,配置成功
}CCUCON0.STMDIV寄存器MODULE_SCU.CCUCON0.B.STMDIV = 0; // 确保分频系数=1MODULE_SCU.STMCLK0.B.CLKSEL = 0; // 0=PLL, 1=fBACK使用内置DSADC测量外部晶振相对于内部fBACK的误差:
#include "IfxDts_Dts.h"
#include "IfxStm.h"
float measureOscillatorError(void)
{
// 1. 初始化DTS模块
IfxDts_Dts_Config dtsConfig;
IfxDts_Dts_initModuleConfig(&dtsConfig);
IfxDts_Dts_initModule(&dtsConfig);
// 2. 校准基准(使用内部fBACK)
uint32 refCount = IfxStm_getFrequency(&MODULE_STM1); // STM1使用fBACK
// 3. 测量外部晶振驱动的STM0
uint32 start = IfxStm_get(&MODULE_STM0);
uint32 endRef = __ldmst(&MODULE_STM1, 0xFFFFFF); // 等待1秒
uint32 end = IfxStm_get(&MODULE_STM0);
// 4. 计算误差
uint32 expectedCount = refCount; // 理论计数值
uint32 actualCount = end - start;
float errorPPM = ((float)(actualCount - expectedCount)/expectedCount)*1e6;
return errorPPM;
}精度测量说明:
如需完整示例:请访问英飞凌开发者社区下载官方DEMO
AURIX™ TC3xx Oscillator Measurement Example
uint32 pllcon1 = MODULE_SCU.PLLCON1.U; // 验证PLLN/PLLP值
uint32 ccucon0 = MODULE_SCU.CCUCON0.U; // 检查分频设置TEST_CLK输出引脚:MODULE_SCU.CLKOUT.B.CLKSEL = 0; // 输出CPU时钟通过上述配置和测量方法,您应能正确设置300MHz主频并验证晶振精度。
举报
更多回帖