Ai8H2K32U配置为外部时钟后,就不能再仿真,这是什么原因?
void main(void){
u16 crc;
u8 a;
u16 pre_temp = 0;
delay_ms(1);
EAXSFR(); /* 扩展寄存器访问使能 */
Curr_Comp_JDQ1 = 1; //关闭电流补偿
WorkState_JDQ2= 0;
Clock_init();
delay_ms(1);
while(1);
}
void Clock_init(void)
{
//使用外部晶振时, P1.6 P1.7被占用, PWM4没有功能.
XOSCCR = 0xC0 + 0x00; // 0xc0 + 0x00 启动外部晶振
while (!(XOSCCR & 0x01)); // 等待时钟稳定
CLKDIV = 0x00; // 时钟不分频
CLKSEL = 0x01;// 选择外部晶振
// PLLCR = 0xa0;//将外部晶振频率2分频(PCKI=01),使能PLL倍频(ENCKM=1)
//高速PWM时钟设置
CLKSEL |= CKMS;// 选择PLL的144M作为PLL的输出时钟
PLLCR &= ~PCKI_MSK;
PLLCR |= PCKI_D2;
// 启动PLL
PLLCR |= ENCKM; //使能PLL倍频
delay_us(500);// 等待PLL锁频
CLKSEL |= HSIOCK; //
HSCLKDIV = 0; //HSPWM/HSSPI时钟源不分频
HSPWMA_CFG = 0x03; //使能PWMA相关寄存器异步访问功能(高速PWM,除PWMA_PS寄存器外,其他PWM寄存器读写都必须在异步模式下进行)
}
在配置Ai8H2K32U微控制器使用外部时钟后,无法进行仿真的问题,可能涉及以下几个方面的原因:
1. 时钟切换时序问题:
在Clockinit()函数中,微控制器从内部时钟切换到外部时钟。这一过程需要确保外部晶振已经稳定运行。代码中通过while (!(XOSCCR & 0x01));等待外部晶振稳定,这是正确的做法。然而,仿真环境中可能存在时钟切换时序与硬件实际行为不一致的情况,导致仿真器无法正确同步时钟信号。
2. 仿真器支持限制:
某些仿真器可能无法完全支持外部时钟源的仿真,尤其是在高频或复杂的时钟配置下。例如,代码中启用了PLL倍频(PLLCR |= ENCKM;)并将时钟频率提升至144MHz,这可能导致仿真器无法正确处理高频时钟信号,从而无法继续仿真。
3. 寄存器配置冲突:
在Clockinit()函数中,配置了多个时钟相关寄存器(如CLKDIV、CLKSEL、PLLCR等)。如果这些寄存器的配置在仿真环境中与硬件实际行为存在差异,可能导致仿真器无法正确模拟时钟切换过程。例如,CLKSEL |= CKMS;和CLKSEL |= HSIOCK;的配置可能需要更详细的仿真支持。
4. 仿真环境初始化问题:
仿真器在启动时可能默认使用内部时钟进行初始化。如果在仿真过程中切换到外部时钟,仿真器可能无法正确处理这一变化,导致仿真失败。建议在仿真前检查仿真器的时钟配置选项,确保其支持外部时钟切换。
5. 代码优化与调试:
建议在仿真前对代码进行优化和调试。例如,可以逐步注释掉Clockinit()函数中的部分配置,排查具体是哪一步操作导致了仿真失败。此外,可以在仿真环境中添加调试信息,观察时钟切换过程中各寄存器的状态变化。
解决方案:
检查仿真器支持:确保仿真器支持外部时钟和PLL倍频配置。
优化时钟切换代码:在时钟切换过程中增加更多的稳定性检查和延时,确保外部晶振完全稳定后再进行后续操作。
分步调试:逐步启用Clockinit()函数中的配置,定位导致仿真失败的具体步骤。
使用内部时钟仿真:如果仿真器不支持外部时钟,可以暂时使用内部时钟进行仿真,待功能验证完成后再切换到外部时钟进行硬件测试。
通过以上分析和调整,可以有效解决Ai8H2K32U配置外部时钟后无法仿真的问题。
[本文内容由国芯人工智能辅助生成,仅供参考] 执行到:while (!(XOSCCR & 0x01)); // 等待时钟稳定
一直等不到时钟稳定标志,就卡这里了,是什么问题,怎么解决? liuqixv 发表于 2025-3-24 16:15
执行到:while (!(XOSCCR & 0x01)); // 等待时钟稳定
一直等不到时钟稳定标志,就卡这里了,是什 ...
必须用硬件仿真(制作仿真芯片)
外部时钟正常吗,外部时钟不正常就会卡死
先不仿真,直接用外部时钟,写个简单的通过MCLKO输出分频时钟的方式测试外部时钟是否正常
外部时钟正常再仿真
页:
[1]