内部时钟PLL以后不能工作 | 已解决
<h1>内部时钟经过PLL以后不能正常工作</h1><h2>代码</h2>
<p>使用 32G12K128</p>
<pre><code class="language-c">/* 设置时钟,初始时钟要设置为 22.1184 Mhz */
CLKSEL &= ~0x80; /* 选择 x8 作为 PLL 的输出时钟 */
USBCLK &= ~0x60;
USBCLK |= 0x20; /* 22.1184Mhz/2 */
USBCLK |= 0x80; /* 启动PLL*/
{
int i;
for (i = 0; i < 200; i++)
{
_nop_();
}
}
MCLKOCR = 2;
CLKDIV = 8; /* 8 分频回来 */
CLKSEL &= 0xf0; /* 选择 PLL 时钟源 */
CLKSEL |= 0x04;
/* 时钟设置完毕 */
</code></pre>
<h2>测试结果</h2>
<p>本来直接使用内部高精度IRC直接设置 SYSCLK 是 11.0592Mhz 的时候工作正常,串口工作正常。<br />
心血来潮,想琢磨一下 PLL,实验了两种情况</p>
<ul>
<li>22.1184MHz / 2 送 PLL x8 后,分频/8, P54 输出 5.56MHz 左右,串口工作异常,上述代码就是这种情况</li>
<li>11.0592MHz 直接送 PLL x8 后,分频/8, P54 输出 5.56MHz 左右,串口工作异常</li>
</ul>
<p>EMO了</p>
注意MCLKODIV和CLKDIV的设置
DebugLab 发表于 2024-12-9 17:07
注意MCLKODIV和CLKDIV的设置
<p>我注意了,</p>
<p>所以我将,MCLKODIV 设置成 2 这样,我就可以在 P54 测量到主时钟频率,P54测量到的的频率大约是 5.56MHz ,乘以2以后是 11.12MHz 正好落在 11.0592MHz 附近。这样可以证明上述代码的 PLL 的设置可以让 SYSCLK 正好是11.0592 MHz</p>
Yang.Lian 发表于 2024-12-9 17:15
我注意了,
所以我将,MCLKODIV 设置成 2 这样,我就可以在 P54 测量到主时钟频率,P54测量到的的频率大 ...
这样应该可以正常工作的
<p>找到问题了,</p>
<p>其实我就是如你上图所说的方式设置的</p>
<p>不是 CLKDIV 也不是 MCLKODIV<br />
而是 <strong>HSCLKDIV</strong> 设置的有问题,HSCLKDIV 实际控制了一个 SPI 的时钟,由于SPI的问题导致系统卡死了</p>
<p>不管怎么谢谢你</p>
<p>经验值+1</p>
页:
[1]