来源 CEPARK网站http://www.cepark.com/Index.html 作者: hnrain
今天是2008年7月28日,广州天气热啊,热得叫人受
不了。中午回来啥活都不想干了,还是玩玩手头上的
STM32板吧。
兴致勃勃地把复位及时钟控制(RCC)的寄存器定义写
完了,没得午觉睡倒算了,还累得满头大汗……看来这
事有点吃力不讨好,真想用别人现成的头文件算了,最后
还是咬咬牙自己写吧,至少可以让自己对寄存器结构熟悉
一些。
傍晚回来再写个测试程序,满以为一次就OK的,可
是调试时却发现,运行到选择PLL时钟后程序就跑飞……
顿时就傻眼了……检查各个寄存器配置,似乎没什么问题
啊:选择外部8M时钟,不分频输入到PLL,设置PLL为9倍
频(注意实际写入到寄存器中为7),AHB、ABP2不分频,
ABP1为2分频(注意设置为8才是2分频),都没有超过最大
频率啊。看来想要搞个72M的主频遇到麻烦了……试着将倍
频降下来,当主频为48M时,系统可以正常工作了,莫非是
USB模块的时钟没有设置为1.5分频?再检查,没错啊,是
1.5分频的。找不到原因,额头上开始冒出了豆大的汗珠,
还好今天天气热,被掩饰过去了,不然让那些行家看到笑
死...莫非俺的片子是被人打磨过的...
最后去论坛问了下,斑竹提示说是否忘记了设置FLASH
等待周期?哈哈,好象我的程序是没有这个步骤,因为手册
里没有关于FLASH的寄存器描述,所以把它给忽略了...不过
里面也有提到系统时钟不同时,需要设置不同的等待周期,
24M以下使用0等待,24M~48M使用1等待,48M~72M使用2等
待。找到FALSH的手册,看了下上电复位后的等待设置为0,
晕,72M主频不跑飞才怪了。在配置时钟之前,增加了一句
FLASH_ACR=0x32,将等待周期设置为2,再次运行程序,
流水灯流了起来~~~
根据圈圈以往的经验,通常像访问存储器的相关寄存
器,复位后都会设置为最坏条件下的值(例如等待周期设置
为最大),然后再由用户自己配置以达到最佳性能。不过,
STM32这个是内部的FLASH,上电复位后系统将自动使用内部
8M时钟做为系统时钟,因而设置为0等待是没问题的。
用户1393282 2009-8-6 08:28