之前有篇文章专门介绍了SAM4S系统时钟使用ASF初始化的问题(SAM4S系统时钟的设置分析),虽然一直工作没发现什么问题,定时、串口、中断什么都没有问题。但是今天当我打印 MCU 工作频率的时候发现,工作时钟竟然是12M!我设定的值可是按120M计算的,问题出在哪里呢?
重新查看时钟初始化那些宏定义,发现就一处跟示例程序不同:
- // ===== PLL0 (A) Options (Fpll = (Fclk * PLL_mul) / PLL_div)
- // Use mul and div effective values here.
- #define CONFIG_PLL0_SOURCE PLL_SRC_MAINCK_XTAL
- #define CONFIG_PLL0_MUL 60
- #define CONFIG_PLL0_DIV 1
就是倍频被我从20改到了60。因为我的板子上面晶振是4M的,开发板的晶振是12M的,我为了省事,就在这里把它放大了三倍,然后就不对劲了。为了进行测试,我把倍频改回到20倍,再查系统频率,果然,回到了40M!问题就在这里。我估计系统倍频参数有个上限,看了pll_config_init()这个函数,里面对倍频的的类型定义是 uint32_t,但是在倍频后,有个最大最小值的检验Assert(),应该是这里没有通过,然后系统就默认了时钟12M。
找到原因就好办,把倍频改到30倍,时钟分频从2改到1,再进行测试,可以输出系统频率是120M了。