Yang.Lian 发表于 2024-12-9 16:56:18

内部时钟PLL以后不能工作 | 已解决

<h1>内部时钟经过PLL以后不能正常工作</h1>
<h2>代码</h2>
<p>使用 32G12K128</p>
<pre><code class="language-c">/* 设置时钟,初始时钟要设置为 22.1184 Mhz */
        CLKSEL &amp;= ~0x80; /* 选择 x8 作为 PLL 的输出时钟 */

        USBCLK &amp;= ~0x60;
        USBCLK |= 0x20; /* 22.1184Mhz/2 */
        USBCLK |= 0x80; /* 启动PLL*/

        {
                int i;
                for (i = 0; i &lt; 200; i++)
                {
                        _nop_();
                }
        }

        MCLKOCR = 2;

        CLKDIV = 8;                /* 8 分频回来 */
        CLKSEL &amp;= 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>

DebugLab 发表于 2024-12-9 17:07:04


注意MCLKODIV和CLKDIV的设置

Yang.Lian 发表于 2024-12-9 17:15:16

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>

DebugLab 发表于 2024-12-9 17:19:02

Yang.Lian 发表于 2024-12-9 17:15
我注意了,
所以我将,MCLKODIV 设置成 2 这样,我就可以在 P54 测量到主时钟频率,P54测量到的的频率大 ...


这样应该可以正常工作的

Yang.Lian 发表于 2024-12-9 17:40:01

<p>找到问题了,</p>
<p>其实我就是如你上图所说的方式设置的</p>
<p>不是 CLKDIV 也不是 MCLKODIV<br />
而是 <strong>HSCLKDIV</strong> 设置的有问题,HSCLKDIV 实际控制了一个 SPI 的时钟,由于SPI的问题导致系统卡死了</p>
<p>不管怎么谢谢你</p>
<p>经验值+1</p>
页: [1]
查看完整版本: 内部时钟PLL以后不能工作 | 已解决