搜索
bottom↓
回复: 72

[交流]AVR32 UC3专题学习:Power Manager[2008-12-16 Update]【恢复】

[复制链接]

出0入296汤圆

发表于 2008-11-17 17:02:51 | 显示全部楼层 |阅读模式

[章节概述]


    最初当我接触AVR32 UC3系列芯片的时候,对于Power Manager感到相当的迷惑:为什么将时钟管理、

锁相环、复位、休眠通称为电源管理呢?在我仔细阅读了PDF以后,某一天,在马桶盖上“顿悟”了。原

来AVR32所有的节能、休眠、复位都是建立在对时钟的管理上。芯片中有很多独立的时钟域,这些时钟域

中包含一些独立的模块,这些时钟域之间可以工作在不同的频率下(来自同一个同步时钟的不同分频);

时钟域以及时钟域中的模块也可以被独立的掐断时钟源——就是通过这种细分到模块的时钟管理来实现

节能——当某一模块处于非工作状态下时,可以掐断它的时钟以降低功耗。

    当我们试图切断CPU的时钟以进一步降低功耗时,就牵涉到了休眠。休眠的权限是高于普通的对时钟

域以及模块的时钟管理,一旦休眠启动了,牵涉到的模块和时钟域就会被无条件的掐断时钟;甚至连PLL、

Power Manager模块自己、还有外部晶振都不例外。可谓六亲不认阿。

    Power Manager还管理着很多传统的资源,比如RESET、看门狗等等。不同的复位模式对时钟和相关

的资源有着不同的影响……



    总之,Power Manager模块实际上是有很多小模块组成的,以时钟为线索联系在一起,每一个小模块

虽然简单,但是组合起来的情况就非常复杂了,这也是为什么PM那么让人头疼的原因。我敢断言,再熟

练的工程师,使用到PM模块的时候,为了谨慎都会仔细的查阅Datasheet上的注意事项。




<font color=red>[章节索引]


&nbsp;&nbsp;&nbsp;&nbsp;根据我们使用的流程来划分,Power&nbsp;Manager的设置实际上可以分为三个阶段:

&nbsp;&nbsp;&nbsp;&nbsp;A、原始时钟源的设置阶段——主要包括引脚配置、启动时间设置、使能操作等;

&nbsp;&nbsp;&nbsp;&nbsp;B、锁相环设置阶段——主要包括时钟源的选择、分频、倍频的设置、使能、等待稳定、运行中改变

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;等等;

&nbsp;&nbsp;&nbsp;&nbsp;C、时钟域的连接——主要是从原始时钟和PLL倍频以后的时钟中选择有且仅有一个作为“系统主时钟”

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;选择系统主时钟以后,将把主时钟通过不同的分频连接到4个主要的时钟域中。



&nbsp;&nbsp;&nbsp;&nbsp;其实,上面的设置只是对同步时钟(也就是系统主工作时钟)的设置,很多外设需要特殊的时钟频率,

比如USBB需要一个12M的时钟,ABDAC需要一个特殊的频率来作为音频输出。不过不像大家想象的那样,类

似USART这样可能需要特殊频率的模块,却是直接连接到主同步时钟上的,这要归功于他拥有一个和Generic

时钟类似的结构——波特率设置寄存器。



&nbsp;&nbsp;&nbsp;&nbsp;基于上面的说明,我们将首先按照三个阶段的划分介绍原始时钟源的操作;紧接着介绍锁相环PLL、主

时钟于四大时钟域;接下来再介绍如何通过Generic&nbsp;Clock来提供特殊的时钟频率。在专题的最后,我们将

就复位和休眠的问题开展讨论。



&nbsp;&nbsp;&nbsp;&nbsp;每一个小章节都会以独立成篇的形式来编写,其中包括“原理解析”“寄存器概述”“Software&nbsp;

Framework的使用”和“应用实例”组成。



&nbsp;&nbsp;&nbsp;&nbsp;感谢大家的关注,希望更多的朋友就Power&nbsp;Manager的使用进行讨论。谢谢。



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Snail&nbsp;Studio

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2008年11月17日



[相关下载]


&nbsp;&nbsp;&nbsp;&nbsp;点击此处下载&nbsp;Software&nbsp;Framework&nbsp;关于PM的相关内容&nbsp;ourdev_502954.rar(文件大小:279K)&nbsp;<font color=green>(原文件名:PM.rar)
&nbsp;



本贴被 Gorgon Meducer 编辑过,最后修改时间:2008-12-16,22:58:32.

出0入296汤圆

 楼主| 发表于 2009-1-11 16:16:00 | 显示全部楼层
to&nbsp;楼上

&nbsp;&nbsp;&nbsp;请你仔细看一下PLL的设置公式……

出0入0汤圆

发表于 2008-12-29 22:46:39 | 显示全部楼层
&nbsp;&nbsp;&nbsp;&nbsp;//使用PLL0连接Oscillator0产生一个60MHz的时钟,需要先产生一个大于80MHz的频率&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;pm_pll_setup&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pm,&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0,&nbsp;&nbsp;&nbsp;&nbsp;//PLL0&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;9,&nbsp;&nbsp;&nbsp;&nbsp;//*10&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1,&nbsp;&nbsp;&nbsp;&nbsp;//不分频&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0,&nbsp;&nbsp;&nbsp;&nbsp;//连接Oscillator0&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;16&nbsp;&nbsp;&nbsp;&nbsp;//default&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;);

这一部分貌似还是有错误,那个1表示进行2分频,并非不分频的意思。。。

出0入0汤圆

发表于 2008-12-23 20:10:28 | 显示全部楼层
【39楼】&nbsp;zhaolj_kstar&nbsp;

主频超过33M以后,受限于FLASH的速度,需要设置为1等待。

出0入0汤圆

发表于 2008-12-23 15:50:30 | 显示全部楼层
楼主flashc_set_wait_state(1);这个函数是什么意思啊?必须要加上吗?

出0入296汤圆

 楼主| 发表于 2008-12-16 22:24:21 | 显示全部楼层
pm_pll_setup&nbsp;&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(&nbsp;&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pm,&nbsp;&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0,&nbsp;&nbsp;&nbsp;&nbsp;//PLL0&nbsp;&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;10,&nbsp;&nbsp;&nbsp;&nbsp;//*10&nbsp;&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0,&nbsp;&nbsp;&nbsp;&nbsp;//不分频&nbsp;&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0,&nbsp;&nbsp;&nbsp;&nbsp;//连接Oscillator0&nbsp;&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;16&nbsp;&nbsp;&nbsp;&nbsp;//default&nbsp;&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;);&nbsp;&nbsp;

示例程序有BUG,这里10倍频传递的参数应该是9,同时,表示不分频时,div应该为1

pm_pll_setup&nbsp;&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(&nbsp;&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pm,&nbsp;&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0,&nbsp;&nbsp;&nbsp;&nbsp;//PLL0&nbsp;&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;9,&nbsp;&nbsp;&nbsp;&nbsp;//*10&nbsp;&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1,&nbsp;&nbsp;&nbsp;&nbsp;//不分频&nbsp;&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0,&nbsp;&nbsp;&nbsp;&nbsp;//连接Oscillator0&nbsp;&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;16&nbsp;&nbsp;&nbsp;&nbsp;//default&nbsp;&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;);&nbsp;&nbsp;



谢谢你指出。



太感动了……辛辛苦苦写的内容终于有人认真看了,并且还认真思考了……55555555

本贴被 Gorgon Meducer 编辑过,最后修改时间:2008-12-16,22:27:18.

出0入0汤圆

发表于 2008-12-16 21:52:33 | 显示全部楼层
volatile&nbsp;avr32_pm_t*&nbsp;pm&nbsp;=&nbsp;&AVR32_PM;&nbsp;&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;//使用外部的12M晶振&nbsp;&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;pm_enable_osc0_crystal(pm,12000000);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;//使能Oscillator,并设置startup&nbsp;time为18ms&nbsp;&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;pm_enable_clk0(pm,3);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;//使用PLL0连接Oscillator0产生一个60MHz的时钟,需要先产生一个大于80MHz的频率&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;pm_pll_setup&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pm,&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0,&nbsp;&nbsp;&nbsp;&nbsp;//PLL0&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;10,&nbsp;&nbsp;&nbsp;&nbsp;//*10&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0,&nbsp;&nbsp;&nbsp;&nbsp;//不分频&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0,&nbsp;&nbsp;&nbsp;&nbsp;//连接Oscillator0&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;16&nbsp;&nbsp;&nbsp;&nbsp;//default&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;);&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;//设置PLL0的属性&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;pm_pll_set_option&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pm,&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0,&nbsp;&nbsp;//PLL0&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0,&nbsp;&nbsp;//选择频率范围80-180MHz&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1,&nbsp;&nbsp;//输出频率2分频,获得60M的实际输出&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;//default&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;);&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;//使能PLL0&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;pm_pll_enable(pm,&nbsp;0);&nbsp;&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;//等待PLL0锁定&nbsp;

我是初学者哈,我不明白为什么这样设置会产生62MHZ,不是设置的10倍频,不分频吗,按公式不是应该2(10+1)*OSC吗

然后后面设置输出频率2分频,不就该是264/2为132MHZ吗?难道我理解的Fvco有问题

出0入0汤圆

发表于 2008-12-12 12:31:55 | 显示全部楼层
问题已经解决,出问题的原因是没有更新Workspace里面的头文件

出0入0汤圆

发表于 2008-12-11 22:36:43 | 显示全部楼层
顺利找到了范例文件,貌似就只看懂了他操作PLL的那些代码,对While里面的那些代码还没怎么弄明白,而且编译过程中出现了下面的问题



&nbsp;(原文件名:未命名0.JPG)&nbsp;

出0入296汤圆

 楼主| 发表于 2008-12-11 21:51:57 | 显示全部楼层
1.3.0-AT32UC3A\DRIVERS\GPIO\LOCAL_BUS_EXAMPLE

出0入0汤圆

发表于 2008-12-11 21:34:13 | 显示全部楼层
Gorgon&nbsp;Meducer兄,按照你的指点去看了Driver/gpio目录下的gpio.c和gpio.h两个文件的内容,但是也没有发现具体的Local&nbsp;Bus的GPIO例子,还请详细指点下

出0入0汤圆

发表于 2008-11-17 19:53:28 | 显示全部楼层
额,偶UP一下吧

出0入296汤圆

 楼主| 发表于 2008-11-17 17:53:32 | 显示全部楼层
-&nbsp;-b&nbsp;对楼上无语了……

又发现恶搞俺帖子的新花样了……

出0入296汤圆

 楼主| 发表于 2008-11-17 17:03:51 | 显示全部楼层

>>官方PM函数库二次封装函数代码注释




&lt;有待添加注释>



int&nbsp;pm_configure_clocks(pm_freq_param_t&nbsp;*param)

{

&nbsp;&nbsp;//&nbsp;Supported&nbsp;frequencies:

&nbsp;&nbsp;//&nbsp;Fosc0&nbsp;mul&nbsp;div&nbsp;PLL&nbsp;div2_en&nbsp;cpu_f&nbsp;pba_f&nbsp;&nbsp;&nbsp;Comment

&nbsp;&nbsp;//&nbsp;&nbsp;12&nbsp;&nbsp;&nbsp;15&nbsp;&nbsp;&nbsp;1&nbsp;&nbsp;192&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;12&nbsp;&nbsp;&nbsp;&nbsp;12

&nbsp;&nbsp;//&nbsp;&nbsp;12&nbsp;&nbsp;&nbsp;&nbsp;9&nbsp;&nbsp;&nbsp;3&nbsp;&nbsp;&nbsp;40&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;20&nbsp;&nbsp;&nbsp;&nbsp;20&nbsp;&nbsp;&nbsp;&nbsp;PLL&nbsp;out&nbsp;of&nbsp;spec

&nbsp;&nbsp;//&nbsp;&nbsp;12&nbsp;&nbsp;&nbsp;15&nbsp;&nbsp;&nbsp;1&nbsp;&nbsp;192&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;24&nbsp;&nbsp;&nbsp;&nbsp;12

&nbsp;&nbsp;//&nbsp;&nbsp;12&nbsp;&nbsp;&nbsp;&nbsp;9&nbsp;&nbsp;&nbsp;1&nbsp;&nbsp;120&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;30&nbsp;&nbsp;&nbsp;&nbsp;15

&nbsp;&nbsp;//&nbsp;&nbsp;12&nbsp;&nbsp;&nbsp;&nbsp;9&nbsp;&nbsp;&nbsp;3&nbsp;&nbsp;&nbsp;40&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;40&nbsp;&nbsp;&nbsp;&nbsp;20&nbsp;&nbsp;&nbsp;&nbsp;PLL&nbsp;out&nbsp;of&nbsp;spec

&nbsp;&nbsp;//&nbsp;&nbsp;12&nbsp;&nbsp;&nbsp;15&nbsp;&nbsp;&nbsp;1&nbsp;&nbsp;192&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;48&nbsp;&nbsp;&nbsp;&nbsp;12

&nbsp;&nbsp;//&nbsp;&nbsp;12&nbsp;&nbsp;&nbsp;15&nbsp;&nbsp;&nbsp;1&nbsp;&nbsp;192&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;48&nbsp;&nbsp;&nbsp;&nbsp;24

&nbsp;&nbsp;//&nbsp;&nbsp;12&nbsp;&nbsp;&nbsp;&nbsp;8&nbsp;&nbsp;&nbsp;1&nbsp;&nbsp;108&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;54&nbsp;&nbsp;&nbsp;&nbsp;27

&nbsp;&nbsp;//&nbsp;&nbsp;12&nbsp;&nbsp;&nbsp;&nbsp;9&nbsp;&nbsp;&nbsp;1&nbsp;&nbsp;120&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;60&nbsp;&nbsp;&nbsp;&nbsp;15

&nbsp;&nbsp;//&nbsp;&nbsp;12&nbsp;&nbsp;&nbsp;&nbsp;9&nbsp;&nbsp;&nbsp;1&nbsp;&nbsp;120&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;60&nbsp;&nbsp;&nbsp;&nbsp;30

&nbsp;&nbsp;//&nbsp;&nbsp;12&nbsp;&nbsp;&nbsp;10&nbsp;&nbsp;&nbsp;1&nbsp;&nbsp;132&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;66&nbsp;&nbsp;&nbsp;&nbsp;16.5

&nbsp;&nbsp;//

&nbsp;&nbsp;unsigned&nbsp;long&nbsp;in_cpu_f&nbsp;&nbsp;=&nbsp;param->cpu_f;

&nbsp;&nbsp;unsigned&nbsp;long&nbsp;in_osc0_f&nbsp;=&nbsp;param->osc0_f;

&nbsp;&nbsp;unsigned&nbsp;long&nbsp;mul,&nbsp;div,&nbsp;div2_en&nbsp;=&nbsp;0,&nbsp;div2_cpu&nbsp;=&nbsp;0,&nbsp;div2_pba&nbsp;=&nbsp;0;

&nbsp;&nbsp;unsigned&nbsp;long&nbsp;pll_freq,&nbsp;rest;

&nbsp;&nbsp;Bool&nbsp;b_div2_pba,&nbsp;b_div2_cpu;



&nbsp;&nbsp;//&nbsp;Switch&nbsp;to&nbsp;external&nbsp;Oscillator&nbsp;0

&nbsp;&nbsp;pm_switch_to_osc0(&AVR32_PM,&nbsp;in_osc0_f,&nbsp;param->osc0_startup);



&nbsp;&nbsp;//&nbsp;Start&nbsp;with&nbsp;CPU&nbsp;freq&nbsp;config

&nbsp;&nbsp;if&nbsp;(in_cpu_f&nbsp;==&nbsp;in_osc0_f)

&nbsp;&nbsp;{

&nbsp;&nbsp;&nbsp;&nbsp;param->cpu_f&nbsp;=&nbsp;in_osc0_f;

&nbsp;&nbsp;&nbsp;&nbsp;param->pba_f&nbsp;=&nbsp;in_osc0_f;

&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;PM_FREQ_STATUS_OK;

&nbsp;&nbsp;}

&nbsp;&nbsp;else&nbsp;if&nbsp;(in_cpu_f&nbsp;&lt;&nbsp;in_osc0_f)

&nbsp;&nbsp;{

&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;TBD

&nbsp;&nbsp;}



&nbsp;&nbsp;rest&nbsp;=&nbsp;in_cpu_f&nbsp;%&nbsp;in_osc0_f;



&nbsp;&nbsp;for&nbsp;(div&nbsp;=&nbsp;1;&nbsp;div&nbsp;&lt;&nbsp;32;&nbsp;div++)

&nbsp;&nbsp;{

&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;((div&nbsp;*&nbsp;rest)&nbsp;%&nbsp;in_osc0_f&nbsp;==&nbsp;0)

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;

&nbsp;&nbsp;}

&nbsp;&nbsp;if&nbsp;(div&nbsp;==&nbsp;32)

&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;PM_FREQ_STATUS_FAIL;



&nbsp;&nbsp;mul&nbsp;=&nbsp;(in_cpu_f&nbsp;*&nbsp;div)&nbsp;/&nbsp;in_osc0_f;



&nbsp;&nbsp;if&nbsp;(mul>&nbsp;PM_MAX_MUL)

&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;PM_FREQ_STATUS_FAIL;



&nbsp;&nbsp;//&nbsp;export&nbsp;2power&nbsp;from&nbsp;PLL&nbsp;div&nbsp;to&nbsp;div2_cpu

&nbsp;&nbsp;while&nbsp;(!(div&nbsp;%&nbsp;2))

&nbsp;&nbsp;{

&nbsp;&nbsp;&nbsp;&nbsp;div&nbsp;/=&nbsp;2;

&nbsp;&nbsp;&nbsp;&nbsp;div2_cpu++;

&nbsp;&nbsp;}



&nbsp;&nbsp;//&nbsp;Here&nbsp;we&nbsp;know&nbsp;the&nbsp;mul&nbsp;and&nbsp;div&nbsp;parameter&nbsp;of&nbsp;the&nbsp;PLL&nbsp;config.

&nbsp;&nbsp;//&nbsp;.&nbsp;Check&nbsp;out&nbsp;if&nbsp;the&nbsp;PLL&nbsp;has&nbsp;a&nbsp;valid&nbsp;in_cpu_f.

&nbsp;&nbsp;//&nbsp;.&nbsp;Try&nbsp;to&nbsp;have&nbsp;for&nbsp;the&nbsp;PLL&nbsp;frequency&nbsp;(VCO&nbsp;output)&nbsp;the&nbsp;highest&nbsp;possible&nbsp;value

&nbsp;&nbsp;//&nbsp;&nbsp;&nbsp;to&nbsp;reduce&nbsp;jitter.

&nbsp;&nbsp;while&nbsp;(in_osc0_f&nbsp;*&nbsp;2&nbsp;*&nbsp;mul&nbsp;/&nbsp;div&nbsp;&lt;&nbsp;AVR32_PM_PLL_VCO_RANGE0_MAX_FREQ)

&nbsp;&nbsp;{

&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(2&nbsp;*&nbsp;mul>&nbsp;PM_MAX_MUL)

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;

&nbsp;&nbsp;&nbsp;&nbsp;mul&nbsp;*=&nbsp;2;

&nbsp;&nbsp;&nbsp;&nbsp;div2_cpu++;

&nbsp;&nbsp;}



&nbsp;&nbsp;if&nbsp;(div2_cpu&nbsp;!=&nbsp;0)

&nbsp;&nbsp;{

&nbsp;&nbsp;&nbsp;&nbsp;div2_cpu--;

&nbsp;&nbsp;&nbsp;&nbsp;div2_en&nbsp;=&nbsp;1;

&nbsp;&nbsp;}



&nbsp;&nbsp;pll_freq&nbsp;=&nbsp;in_osc0_f&nbsp;*&nbsp;mul&nbsp;/&nbsp;(div&nbsp;*&nbsp;(1&nbsp;&lt;&lt;&nbsp;div2_en));



&nbsp;&nbsp;//&nbsp;Update&nbsp;real&nbsp;CPU&nbsp;Frequency

&nbsp;&nbsp;param->cpu_f&nbsp;=&nbsp;pll_freq&nbsp;/&nbsp;(1&nbsp;&lt;&lt;&nbsp;div2_cpu);

&nbsp;&nbsp;mul--;



&nbsp;&nbsp;pm_pll_setup(&AVR32_PM

&nbsp;&nbsp;,&nbsp;0&nbsp;&nbsp;&nbsp;//&nbsp;pll

&nbsp;&nbsp;,&nbsp;mul&nbsp;//&nbsp;mul

&nbsp;&nbsp;,&nbsp;div&nbsp;//&nbsp;div

&nbsp;&nbsp;,&nbsp;0&nbsp;&nbsp;&nbsp;//&nbsp;osc

&nbsp;&nbsp;,&nbsp;16&nbsp;&nbsp;//&nbsp;lockcount

&nbsp;&nbsp;);



&nbsp;&nbsp;pm_pll_set_option(&AVR32_PM

&nbsp;&nbsp;,&nbsp;0&nbsp;//&nbsp;pll

&nbsp;&nbsp;//&nbsp;PLL&nbsp;clock&nbsp;is&nbsp;lower&nbsp;than&nbsp;160MHz:&nbsp;need&nbsp;to&nbsp;set&nbsp;pllopt.

&nbsp;&nbsp;,&nbsp;(pll_freq&nbsp;&lt;&nbsp;160000000)&nbsp;?&nbsp;1&nbsp;:&nbsp;0&nbsp;//&nbsp;pll_freq

&nbsp;&nbsp;,&nbsp;div2_en&nbsp;//&nbsp;pll_div2

&nbsp;&nbsp;,&nbsp;0&nbsp;//&nbsp;pll_wbwdisable

&nbsp;&nbsp;);



&nbsp;&nbsp;rest&nbsp;=&nbsp;pll_freq;

&nbsp;&nbsp;while&nbsp;(rest>&nbsp;AVR32_PM_PBA_MAX_FREQ&nbsp;||

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rest&nbsp;!=&nbsp;param->pba_f)

&nbsp;&nbsp;{

&nbsp;&nbsp;&nbsp;&nbsp;div2_pba++;

&nbsp;&nbsp;&nbsp;&nbsp;rest&nbsp;=&nbsp;pll_freq&nbsp;/&nbsp;(1&nbsp;&lt;&lt;&nbsp;div2_pba);

&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(rest&nbsp;&lt;&nbsp;param->pba_f)

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;

&nbsp;&nbsp;}



&nbsp;&nbsp;//&nbsp;Update&nbsp;real&nbsp;PBA&nbsp;Frequency

&nbsp;&nbsp;param->pba_f&nbsp;=&nbsp;pll_freq&nbsp;/&nbsp;(1&nbsp;&lt;&lt;&nbsp;div2_pba);



#if&nbsp;__GNUC__

&nbsp;&nbsp;set_cpu_hz(param->pba_f);

#endif



&nbsp;&nbsp;//&nbsp;Enable&nbsp;PLL0

&nbsp;&nbsp;pm_pll_enable(&AVR32_PM,&nbsp;0);



&nbsp;&nbsp;//&nbsp;Wait&nbsp;for&nbsp;PLL0&nbsp;locked

&nbsp;&nbsp;pm_wait_for_pll0_locked(&AVR32_PM);



&nbsp;&nbsp;if&nbsp;(div2_cpu)

&nbsp;&nbsp;{

&nbsp;&nbsp;&nbsp;&nbsp;b_div2_cpu&nbsp;=&nbsp;TRUE;

&nbsp;&nbsp;&nbsp;&nbsp;div2_cpu--;

&nbsp;&nbsp;}

&nbsp;&nbsp;else

&nbsp;&nbsp;&nbsp;&nbsp;b_div2_cpu&nbsp;=&nbsp;FALSE;



&nbsp;&nbsp;if&nbsp;(div2_pba)

&nbsp;&nbsp;{

&nbsp;&nbsp;&nbsp;&nbsp;b_div2_pba&nbsp;=&nbsp;TRUE;

&nbsp;&nbsp;&nbsp;&nbsp;div2_pba--;

&nbsp;&nbsp;}

&nbsp;&nbsp;else

&nbsp;&nbsp;&nbsp;&nbsp;b_div2_pba&nbsp;=&nbsp;FALSE;



&nbsp;&nbsp;pm_cksel(&AVR32_PM

&nbsp;&nbsp;,&nbsp;b_div2_pba,&nbsp;div2_pba&nbsp;//&nbsp;PBA

&nbsp;&nbsp;,&nbsp;b_div2_cpu,&nbsp;div2_cpu&nbsp;//&nbsp;PBB

&nbsp;&nbsp;,&nbsp;b_div2_cpu,&nbsp;div2_cpu&nbsp;//&nbsp;HSB

&nbsp;&nbsp;);



&nbsp;&nbsp;if&nbsp;(param->cpu_f>&nbsp;AVR32_FLASHC_FWS_0_MAX_FREQ)

&nbsp;&nbsp;&nbsp;&nbsp;flashc_set_wait_state(1);

&nbsp;&nbsp;else

&nbsp;&nbsp;&nbsp;&nbsp;flashc_set_wait_state(0);



&nbsp;&nbsp;pm_switch_to_clock(&AVR32_PM,&nbsp;AVR32_PM_MCCTRL_MCSEL_PLL0);



&nbsp;&nbsp;return&nbsp;PM_FREQ_STATUS_OK;

}<font color=#699BCD>

本贴被 Gorgon Meducer 编辑过,最后修改时间:2008-11-19,12:10:26.

出0入296汤圆

 楼主| 发表于 2008-11-17 17:03:33 | 显示全部楼层

>>&nbsp;复位


本贴被 Gorgon Meducer 编辑过,最后修改时间:2008-11-17,17:17:21.

出0入296汤圆

 楼主| 发表于 2008-11-17 17:03:27 | 显示全部楼层

>>&nbsp;节能与休眠


本贴被 Gorgon Meducer 编辑过,最后修改时间:2008-11-17,17:17:09.

出0入296汤圆

 楼主| 发表于 2008-11-17 17:03:20 | 显示全部楼层

>>&nbsp;Generic&nbsp;Clock


有待添加内容




<font color=red>[寄存器概述]






[Software&nbsp;Framework&nbsp;的使用]


&nbsp;&nbsp;&nbsp;&nbsp;当我们通过AVR32&nbsp;Studio的Software&nbsp;Framework添加向导增加了Power&nbsp;Manager驱动模块以后,系统

会自动在DRIVERS模块下增加一个PM文件夹,其中包含了操作AVR32&nbsp;UC3&nbsp;PM模块的底层API,我们只需要

在工程中增加一个&nbsp;#inlude"PM.h"&nbsp;语句,就可以获得以下函数的使用权限:




extern&nbsp;void&nbsp;pm_gc_setup

&nbsp;&nbsp;&nbsp;&nbsp;(

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;volatile&nbsp;avr32_pm_t&nbsp;*pm,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&AVR32_PM

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;unsigned&nbsp;int&nbsp;gc,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//普通时钟通道编号,请参阅具体器件手册

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;unsigned&nbsp;int&nbsp;osc_or_pll,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//0表示OSC,1表示PLL

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;unsigned&nbsp;int&nbsp;pll_osc,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//当选择OSC时,0表示OSC0、1表示OSC1

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//当选择PLL时,0表示PLL0、1表示PLL1

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;unsigned&nbsp;int&nbsp;diven,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//分频开关&nbsp;0表示不分频

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;unsigned&nbsp;int&nbsp;div&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//当DIVEN为1时,输入的时钟将被处以

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//2&nbsp;*&nbsp;(DIV&nbsp;+&nbsp;1)

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;);


函数说明:该函数用于设置指定通道编号的普通时钟,选择输入时钟源,分频开关以及分频参数等

输入参数:&AVR32_PM,&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;普通时钟通道编号,

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;OSC或PLL选择,

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;OSC0/OSC1或者PLL0/PLL1选择

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;分频开关,

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;分频设置&nbsp;


extern&nbsp;void&nbsp;pm_gc_enable(volatile&nbsp;avr32_pm_t&nbsp;*pm,&nbsp;unsigned&nbsp;int&nbsp;gc);

函数说明:该函数将开启指定通道普通时钟的使能标志

输入参数:&AVR32_PM,

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;普通时钟的通道编号


extern&nbsp;void&nbsp;pm_gc_disable(volatile&nbsp;avr32_pm_t&nbsp;*pm,&nbsp;unsigned&nbsp;int&nbsp;gc);

函数说明:该函数将关闭指定编号的普通时钟通道

输入参数:&AVR32_PM,普通时钟的通道编号




[应用实例]


#include&nbsp;"avr32/io.h"&nbsp;&nbsp;

#include&nbsp;"PM.h"&nbsp;&nbsp;



int&nbsp;main(void)&nbsp;&nbsp;

{&nbsp;&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;volatile&nbsp;avr32_pm_t*&nbsp;pm&nbsp;=&nbsp;&AVR32_PM;&nbsp;&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;//使用外部的12M晶振&nbsp;&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;pm_enable_osc0_crystal(pm,12000000);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;//使能Oscillator,并设置startup&nbsp;time为18ms&nbsp;&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;pm_enable_clk0(pm,3);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;//使用PLL1连接Oscillator0产生一个48MHz的时钟,需要先产生一个大于80MHz的频率&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;pm_pll_setup&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pm,&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1,&nbsp;&nbsp;&nbsp;&nbsp;//PLL0&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;15,&nbsp;&nbsp;&nbsp;//*16

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1,&nbsp;&nbsp;&nbsp;&nbsp;//不分频&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0,&nbsp;&nbsp;&nbsp;&nbsp;//连接Oscillator0&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;16&nbsp;&nbsp;&nbsp;&nbsp;//default&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;);&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;//设置PLL1的属性&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;pm_pll_set_option&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pm,&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1,&nbsp;&nbsp;//PLL1&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0,&nbsp;&nbsp;//选择频率范围80-180MHz&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0,&nbsp;&nbsp;//输出频率不分频,获得192M的实际输出&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;//default&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;);&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;//使能PLL1&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;pm_pll_enable(pm,&nbsp;1);&nbsp;&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;//等待PLL1锁定&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;pm_wait_for_pll1_locked(pm);&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;//向USBB输出48M普通时钟

&nbsp;&nbsp;&nbsp;&nbsp;pm_gc_setup

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pm,

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;4,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//输出到USBB

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//选择PLL

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//PLL1

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//打开分频

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;1/(2(DIV&nbsp;+&nbsp;1))&nbsp;&nbsp;192M/4&nbsp;=&nbsp;48M&nbsp;&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;)

&nbsp;&nbsp;&nbsp;&nbsp;//使能普通时钟

&nbsp;&nbsp;&nbsp;&nbsp;pm_gc_enable(pm,4);

&nbsp;&nbsp;&nbsp;&nbsp;


}

本贴被 Gorgon Meducer 编辑过,最后修改时间:2008-12-16,22:25:14.

出0入296汤圆

 楼主| 发表于 2008-11-17 17:03:15 | 显示全部楼层

>>&nbsp;同步时钟与四大时钟域(CPU/HSB/PBB/PBA)


&nbsp;&nbsp;&nbsp;&nbsp;所谓同步时钟,就是芯片内部用于协调各个模块的工作的脉搏,通常说来就是系统时钟。一个系统

只有一个系统时钟,虽然四大时钟域可以有彼此不同的时钟(对UC3A和UC3B来说HSB永远和CPU工作在同

频率),但是他们只是系统时钟的不同分频而已——换句话说,四大时钟域拥有的只是对引入自己的系

统使用拥有独立自主的分频设置。



&nbsp;&nbsp;&nbsp;&nbsp;能够有资格做系统时钟的只有三种时钟源:系统内部自带的115KHz默认RC时钟,就是通常所谓的

Slow&nbsp;clock,当系统复位以后会自动默认连接这个时钟;Oscillator&nbsp;0和PLL0。大家注意,PLL1和

Oscillator&nbsp;1是没有资格充当系统时钟的。可以用“数字0的等级高于1,因此0比1更强悍”来记忆这个

特征。




<font color=red>[寄存器概述]





&nbsp;&nbsp;&nbsp;&nbsp;对系统时钟和四大时钟域的设定来说,主要有以下几个方面:

&nbsp;&nbsp;&nbsp;&nbsp;一、系统时钟的选择

&nbsp;&nbsp;&nbsp;&nbsp;二、时钟域连接到系统主时钟的分频设置



&nbsp;&nbsp;&nbsp;&nbsp;其中,系统时钟的选择是通过寄存器MCCTRL的MCSEL位来实现的,这是一个长度为2的二进制数,可

以表示3种有效的选择:

&nbsp;&nbsp;&nbsp;&nbsp;--------------------------------------------------

&nbsp;&nbsp;&nbsp;&nbsp;0:&nbsp;The&nbsp;slow&nbsp;clock&nbsp;is&nbsp;the&nbsp;source&nbsp;for&nbsp;the&nbsp;main&nbsp;clock

&nbsp;&nbsp;&nbsp;&nbsp;1:&nbsp;Oscillator&nbsp;0&nbsp;is&nbsp;source&nbsp;for&nbsp;the&nbsp;main&nbsp;clock

&nbsp;&nbsp;&nbsp;&nbsp;2:&nbsp;PLL0&nbsp;is&nbsp;source&nbsp;for&nbsp;the&nbsp;main&nbsp;clock

&nbsp;&nbsp;&nbsp;&nbsp;--------------------------------------------------



&nbsp;&nbsp;&nbsp;&nbsp;四大时钟域的分频设置是通过寄存器CKSEL进行的。其中xxxDIV是分频开关,当为0时表示不分频;

xxxSEL是分频设置,这是一个3位的二进制数字,表示将进行2^(xxxSEL&nbsp;+&nbsp;1)倍的分频。

&nbsp;&nbsp;&nbsp;&nbsp;需要强调的是,当xxxDIV为0时,一定要把xxxSEL也写为0。








[Software&nbsp;Framework&nbsp;的使用]


&nbsp;&nbsp;&nbsp;&nbsp;当我们通过AVR32&nbsp;Studio的Software&nbsp;Framework添加向导增加了Power&nbsp;Manager驱动模块以后,系统

会自动在DRIVERS模块下增加一个PM文件夹,其中包含了操作AVR32&nbsp;UC3&nbsp;PM模块的底层API,我们只需要

在工程中增加一个&nbsp;#inludePM.h&nbsp;语句,就可以获得以下函数的使用权限:




extern&nbsp;void&nbsp;pm_cksel

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;volatile&nbsp;avr32_pm_t&nbsp;*pm,&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;unsigned&nbsp;int&nbsp;pbadiv,&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;unsigned&nbsp;int&nbsp;pbasel,&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;unsigned&nbsp;int&nbsp;pbbdiv,&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;unsigned&nbsp;int&nbsp;pbbsel,&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;unsigned&nbsp;int&nbsp;hsbdiv,&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;unsigned&nbsp;int&nbsp;hsbsel

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;);


函数说明:该函数将分别指定四大时钟域在连接到系统主时钟时“是否分频”以及“选择多大的分频”

输入参数:&AVR32_PM

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PBA分频开关&nbsp;0表示不分频&nbsp;1表示总线PBA将以pbasel指定的分频数连接到系统主时钟

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PBA的分频

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PBB的分频开关

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PBB的分频

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HSB的分频开关(UC3A/B永远和CPU域的时钟设置相同,所以这里实际上设置的是CPU的分频开关)

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HSB的分频(UC3A/B永远和CPU域的时钟设置相同,所以这里实际上设置的是CPU的分频)


extern&nbsp;void&nbsp;pm_switch_to_clock(volatile&nbsp;avr32_pm_t&nbsp;*pm,&nbsp;unsigned&nbsp;long&nbsp;clock);

函数说明:该函数用于选择系统的主时钟

输入参数:&AVR32_PM

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;主时钟源,只能是以下的常数之一:

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;AVR32_PM_MCSEL_SLOW&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;芯片自带的默认115K&nbsp;RC振荡器

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;AVR32_PM_MCSEL_OSC0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;选择Oscillator&nbsp;0作为系统主时钟

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;AVR32_PM_MCSEL_PLL0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;选择PLL0作为系统主时钟


extern&nbsp;void&nbsp;pm_switch_to_osc0(volatile&nbsp;avr32_pm_t&nbsp;*pm,&nbsp;unsigned&nbsp;int&nbsp;fosc0,&nbsp;unsigned&nbsp;int&nbsp;startup);

函数说明:直接将Oscillator&nbsp;0作为系统主时钟(使用晶振而不是时钟),同时要指定所连接的外晶振的频率和启动时间。

输入参数:&AVR32_PM

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;所连接的晶振频率

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;该晶振的启动时间


extern&nbsp;int&nbsp;pm_configure_clocks(pm_freq_param_t&nbsp;*param);

函数说明:该函数会根据用户的需要自动的配置PM,以满足设定的CPU和PBA总线时钟

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;该函数会首先尝试连接PLL来实现所设定的CPU频率,如果失败了,系统会尝试直接连接Oscillator&nbsp;0

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PBA的频率会根据CPU的频率自动的进行优化,他总是等于CPU频率的/(2^x),所以PBA的最大频率总是

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;低于30MHz

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HSB和PBB的频率总是和CPU相同,当自动配置完成以后,CPU、HSB和PBA的频率会被自动的反馈回来

输入参数:频率设置信息结构体指针&nbsp;(pm_freq_param_t&nbsp;*)&nbsp;相信情况请参考下面的结构体说明

输出参数:PM_FREQ_STATUS_OK&nbsp;&nbsp;&nbsp;频率设置成功

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PM_FREQ_STATUS_FAIL&nbsp;频率设置失败

//!&nbsp;Input&nbsp;and&nbsp;output&nbsp;parameters&nbsp;when&nbsp;initializing&nbsp;PM&nbsp;clocks&nbsp;using&nbsp;pm_configure_clocks().

typedef&nbsp;struct

{

&nbsp;&nbsp;//!&nbsp;CPU&nbsp;frequency&nbsp;(input/output&nbsp;argument).

&nbsp;&nbsp;unsigned&nbsp;long&nbsp;cpu_f;



&nbsp;&nbsp;//!&nbsp;PBA&nbsp;frequency&nbsp;(input/output&nbsp;argument).

&nbsp;&nbsp;unsigned&nbsp;long&nbsp;pba_f;



&nbsp;&nbsp;//!&nbsp;Oscillator&nbsp;0&nbsp;frequency&nbsp;(board&nbsp;dependant)&nbsp;(input&nbsp;argument).

&nbsp;&nbsp;unsigned&nbsp;long&nbsp;osc0_f;



&nbsp;&nbsp;//!&nbsp;Oscillator&nbsp;0&nbsp;startup&nbsp;time:&nbsp;AVR32_PM_OSCCTRL0_STARTUP_x_RCOSC&nbsp;(input&nbsp;argument).

&nbsp;&nbsp;unsigned&nbsp;long&nbsp;osc0_startup;

}&nbsp;pm_freq_param_t;




[应用实例]




#include&nbsp;avr32/io.h&nbsp;

#include&nbsp;PM.h&nbsp;



int&nbsp;main(void)&nbsp;

{&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;volatile&nbsp;avr32_pm_t*&nbsp;pm&nbsp;=&nbsp;&AVR32_PM;&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;//使用外部的12M晶振&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;pm_enable_osc0_crystal(pm,12000000);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;//使能Oscillator,并设置startup&nbsp;time为18ms&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;pm_enable_clk0(pm,3);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;//使用PLL0连接Oscillator0产生一个60MHz的时钟,需要先产生一个大于80MHz的频率

&nbsp;&nbsp;&nbsp;&nbsp;pm_pll_setup

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pm,

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0,&nbsp;&nbsp;&nbsp;&nbsp;//PLL0

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;9,&nbsp;&nbsp;&nbsp;&nbsp;//*10

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1,&nbsp;&nbsp;&nbsp;&nbsp;//不分频

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0,&nbsp;&nbsp;&nbsp;&nbsp;//连接Oscillator0

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;16&nbsp;&nbsp;&nbsp;&nbsp;//default

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;);

&nbsp;&nbsp;&nbsp;&nbsp;//设置PLL0的属性

&nbsp;&nbsp;&nbsp;&nbsp;pm_pll_set_option

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pm,

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0,&nbsp;&nbsp;//PLL0

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0,&nbsp;&nbsp;//选择频率范围80-180MHz

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1,&nbsp;&nbsp;//输出频率2分频,获得60M的实际输出

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;//default

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;);

&nbsp;&nbsp;&nbsp;&nbsp;//使能PLL0

&nbsp;&nbsp;&nbsp;&nbsp;pm_pll_enable(pm,&nbsp;0);&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;//等待PLL0锁定

&nbsp;&nbsp;&nbsp;&nbsp;pm_wait_for_pll0_locked(pm);

&nbsp;&nbsp;&nbsp;&nbsp;//这一句不可省略,当CPU/HSB时钟超过系统最工作频率的一半,也就是33M时

&nbsp;&nbsp;&nbsp;&nbsp;flashc_set_wait_state(1);

&nbsp;&nbsp;&nbsp;&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;//选择PLL作为系统主时钟

&nbsp;&nbsp;&nbsp;&nbsp;pm_switch_to_clock(pm,AVR32_PM_MCSEL_PLL0);

&nbsp;&nbsp;&nbsp;&nbsp;//分别设置四大时钟域的时钟

&nbsp;&nbsp;&nbsp;&nbsp;pm_cksel

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pm,

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//PBA开启分频&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//2分频,也就是PBA工作在30M频率之下

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//PBB不分频

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//PBB工作在60M频率下

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//HSB不分频

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//CPU和HSB都工作在60M的频率下

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;);&nbsp;&nbsp;&nbsp;&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;


&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;0;&nbsp;

}





本贴被 Gorgon Meducer 编辑过,最后修改时间:2008-12-16,22:26:34.

出0入296汤圆

 楼主| 发表于 2008-11-17 17:03:10 | 显示全部楼层

>>&nbsp;PLL锁相环


&nbsp;&nbsp;&nbsp;&nbsp;AVR32&nbsp;UC3提供了两个锁相环,分别是PLL0和PLL1。他们都可以从Oscillator&nbsp;0&nbsp;和&nbsp;Oscillator&nbsp;1中

任选一个作为自己的输入时钟fosc,彼此并不影响。对每一个PLL来说,都有一个长度为4位的乘法因子和除法

因子,他们的取值范围是0~0x0F。根据这两个因子,相应的PLL初级输出频率fvco计算公式为:

&nbsp;&nbsp;&nbsp;&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;当PLLDIV大于0时(也就是除法因子不为0时)

&nbsp;&nbsp;&nbsp;&nbsp;fvco&nbsp;=&nbsp;(PLLMUL+1)/(PLLDIV)&nbsp;&#8226;&nbsp;fosc

&nbsp;&nbsp;&nbsp;&nbsp;当PLLDIV为0时

&nbsp;&nbsp;&nbsp;&nbsp;fvco&nbsp;=&nbsp;2*(PLLMUL+1)&nbsp;&#8226;&nbsp;fosc



&nbsp;&nbsp;&nbsp;&nbsp;需要补充说明的是,对于fvco,PLL有两个可选的频率范围,分别是80~180Mhz和160~240Mhz,也就是说,

无论如何,乘数因子配合除数因子应该达到至少指定频率范围的最小值。那么,对于小于频率范围最小值的

频率我们应该如何做到呢?比如,我们想获得一个40M的频率。PLL为我们提供了一个对fvco分频的途径,通过

PLLOPT[1]置位,我们可以将fvco二分频以后再输出。<font color=blue>根据上面的公式,我们知道,利用PLL我们能得到的最小

频率是40M,而Oscillator能支持的最大时钟源为16M,这里就出现了一个16M~40M的频率空缺,请大家注意这个

问题。
PLL&nbsp;fvco频率范围的选择,可以通过PLLOPT[0]来设置,0表示80~180Mhz,1表示160~240Mhz。








[寄存器概述]




&nbsp;&nbsp;&nbsp;&nbsp;对PLL锁相环来说,所需要设置的内容主要包括“倍频/分频参数设置”、“时钟源的选择”和“PLL属性

设置”。



&nbsp;&nbsp;&nbsp;&nbsp;A、倍频/分频设置主要是通过对寄存器PLLn的PLLMUL和PLLDIV位进行设置,其中PLLMUL和PLLDIV都是4位

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;二进制长度,可以表示0~0x0F之间的任意数值。

&nbsp;&nbsp;&nbsp;&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;B、PLL属性设置又包括“fvco频率输出范围选择”、“PLL频率输出二分频开关”和“Wide-Bandith开关”

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;三个部分组成。分别对应寄存器PLLn中的PLLOPT[0]、PLLOPT[1]和PLLOPT[2]。

&nbsp;&nbsp;&nbsp;&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;C、通过对PLLn中PLLOSC位的设置,我们可以选择Oscillator0(默认)或者Oscillator1作为PLLn的时钟源&nbsp;&nbsp;&nbsp;&nbsp;



&nbsp;&nbsp;&nbsp;&nbsp;D、通过PLLn中的PLLEN位,我们可以使能/关闭PLL的功能。




[Software&nbsp;Framework&nbsp;的使用]




&nbsp;&nbsp;&nbsp;&nbsp;当我们通过AVR32&nbsp;Studio的Software&nbsp;Framework添加向导增加了Power&nbsp;Manager驱动模块以后,系统&nbsp;

会自动在DRIVERS模块下增加一个PM文件夹,其中包含了操作AVR32&nbsp;UC3&nbsp;PM模块的底层API,我们只需要&nbsp;

在工程中增加一个&nbsp;#inludePM.h&nbsp;语句,就可以获得以下函数的使用权限:&nbsp;




extern&nbsp;void&nbsp;pm_pll_setup

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;volatile&nbsp;avr32_pm_t&nbsp;*pm,&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;unsigned&nbsp;int&nbsp;pll,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//PLL编号,具体制定是PLL0还是PLL1

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;unsigned&nbsp;int&nbsp;mul,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//乘法因数,当为0时,表示不进行倍频

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;unsigned&nbsp;int&nbsp;div,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//除法因数,当为1时,表示不进行分频

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;unsigned&nbsp;int&nbsp;osc,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//PLL选择的Oscillator时钟源编号

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;unsigned&nbsp;int&nbsp;lockcount&nbsp;&nbsp;&nbsp;&nbsp;//在PLL成功锁定以后,以115KHz为频率,

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//延时指定的周期以后才设置ISR的Lockn

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//标志位。

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;);


函数说明:该函数用于设定指定编号的PLL的各项参数,并不作其他任何操作

输入参数:&AVR_PM

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;要操作的PLL编号

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;倍频倍数

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;分频

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PLL选择的Oscillator时钟源编号

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;在PLL成功的被锁定以后,设置ISR中Lockn标志位前所需要延时的Slow&nbsp;Clock周期


extern&nbsp;void&nbsp;pm_pll_set_option

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;volatile&nbsp;avr32_pm_t&nbsp;*pm,&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;unsigned&nbsp;int&nbsp;&nbsp;pll,&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;unsigned&nbsp;int&nbsp;&nbsp;pll_freq,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//PLL频率范围选择&nbsp;1&nbsp;表示80-180MHz

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//0&nbsp;表示&nbsp;160-240Mhz

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;unsigned&nbsp;int&nbsp;&nbsp;pll_div2,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//PLL输出频率是否2分频

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;unsigned&nbsp;int&nbsp;&nbsp;pll_wbwdisable&nbsp;&nbsp;&nbsp;//是否关闭Wide-Bandith模式,开启

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//该模式将获得更短的启动和锁定时间

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;);


函数说明:该函数用于设定制定PLL的某些控制属性,比如输出的频率范围,是否在输出前进行

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2分频,是否关闭Wide-Bandith模式等等。

输入参数:&AVR_PM

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;要操作的PLL编号

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pll输出频率的范围

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;是否在pll输出前进行二分频

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;是否关闭Wide-Bandith模式


extern&nbsp;unsigned&nbsp;int&nbsp;pm_pll_get_option(volatile&nbsp;avr32_pm_t&nbsp;*pm,&nbsp;unsigned&nbsp;int&nbsp;pll);

函数说明:该函数用于获取指定PLL的控制属性,比如频率范围、是否分频,是否关闭Wide-Bandith

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;等等。这些信息分别放在输出变量的BIT2、BIT1和BIT0上。

输入参数:&AVR32_PM

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;指定的PLL编号


extern&nbsp;void&nbsp;pm_pll_enable(volatile&nbsp;avr32_pm_t&nbsp;*pm,&nbsp;unsigned&nbsp;int&nbsp;pll);

函数说明:直接使能指定的PLL,并不等待ISR中的LOCKn置位

输入参数:&AVR32_PM

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;指定的PLL编号


extern&nbsp;void&nbsp;pm_pll_disable(volatile&nbsp;avr32_pm_t&nbsp;*pm,&nbsp;unsigned&nbsp;int&nbsp;pll);

函数说明:直接关闭指定的PLL

输入参数:&AVR32_PM

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;指定的PLL编号


extern&nbsp;void&nbsp;pm_wait_for_pll0_locked(volatile&nbsp;avr32_pm_t&nbsp;*pm);

函数说明:等待PLL0锁定位LOCK0被置位

输入参数:&AVR32_PM


extern&nbsp;void&nbsp;pm_wait_for_pll1_locked(volatile&nbsp;avr32_pm_t&nbsp;*pm);

函数说明:等待PLL1锁定位LOCK1被置位

输入参数:&AVR32_PM






[应用实例]


#include&nbsp;avr32/io.h&nbsp;

#include&nbsp;PM.h&nbsp;



int&nbsp;main(void)&nbsp;

{&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;volatile&nbsp;avr32_pm_t*&nbsp;pm&nbsp;=&nbsp;&AVR32_PM;&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;//使用外部的12M晶振&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;pm_enable_osc0_crystal(pm,12000000);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;//使能Oscillator,并设置startup&nbsp;time为18ms&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;pm_enable_clk0(pm,3);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;//使用PLL0连接Oscillator0产生一个60MHz的时钟,需要先产生一个大于80MHz的频率

&nbsp;&nbsp;&nbsp;&nbsp;pm_pll_setup

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pm,

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0,&nbsp;&nbsp;&nbsp;&nbsp;//PLL0

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;9,&nbsp;&nbsp;&nbsp;&nbsp;//*10

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1,&nbsp;&nbsp;&nbsp;&nbsp;//不分频

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0,&nbsp;&nbsp;&nbsp;&nbsp;//连接Oscillator0

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;16&nbsp;&nbsp;&nbsp;&nbsp;//default

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;);

&nbsp;&nbsp;&nbsp;&nbsp;//设置PLL0的属性

&nbsp;&nbsp;&nbsp;&nbsp;pm_pll_set_option

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pm,

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0,&nbsp;&nbsp;//PLL0

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0,&nbsp;&nbsp;//选择频率范围80-180MHz

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1,&nbsp;&nbsp;//输出频率2分频,获得60M的实际输出

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;//default

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;);

&nbsp;&nbsp;&nbsp;&nbsp;//使能PLL0

&nbsp;&nbsp;&nbsp;&nbsp;pm_pll_enable(pm,&nbsp;0);&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;//等待PLL0锁定

&nbsp;&nbsp;&nbsp;&nbsp;pm_wait_for_pll0_locked(pm);

&nbsp;&nbsp;&nbsp;&nbsp;


&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;0;&nbsp;

}



本贴被 Gorgon Meducer 编辑过,最后修改时间:2009-01-11,16:14:10.

出0入296汤圆

 楼主| 发表于 2008-11-17 17:02:59 | 显示全部楼层

>>&nbsp;外部时钟、晶振源、32.768KHz时钟源


&nbsp;&nbsp;&nbsp;&nbsp;AVR32&nbsp;UC3系列芯片有两组时钟源输入,同时还额外支持32.768KHz的实时时钟源输入。他们分别

被称为Oscillator&nbsp;0、Oscillator1和32&nbsp;KHz&nbsp;oscillator。当他们通过XIN、XOUT连接外部晶振时,通

常按照下图所示的方法进行(对32&nbsp;KHz&nbsp;Osillator来说,引脚名称是XIN32和XOUT32):



&nbsp;&nbsp;&nbsp;&nbsp;当我们使用外部时钟(Extern&nbsp;Clock)而不是晶振时,需要将外部时钟连接到XIN(XIN32)上,

此时,XOUT(XOUT32)引脚仍然可以作为普通的GPIO引脚来使用。

&nbsp;&nbsp;&nbsp;&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;对于Oscillator&nbsp;0和Oscillator&nbsp;1来说,支持的外部晶振(时钟)频率范围从450KHz~16MHz,我

们需要根据具体的频率范围使用正确数值范围的电容。


<font color=blue>Note&nbsp;1:&nbsp;These&nbsp;values&nbsp;are&nbsp;given&nbsp;only&nbsp;as&nbsp;a&nbsp;typical&nbsp;example.&nbsp;The&nbsp;capacitance&nbsp;C&nbsp;of&nbsp;the&nbsp;biasing&nbsp;capacitors&nbsp;can&nbsp;be&nbsp;computed&nbsp;based

on&nbsp;the&nbsp;crystal&nbsp;load&nbsp;capacitance&nbsp;CL&nbsp;and&nbsp;the&nbsp;internal&nbsp;capacitance&nbsp;Ci&nbsp;of&nbsp;the&nbsp;MCU&nbsp;as&nbsp;follows:

C&nbsp;=&nbsp;2&nbsp;(CL&nbsp;–&nbsp;Ci)

The&nbsp;value&nbsp;of&nbsp;CL&nbsp;can&nbsp;be&nbsp;found&nbsp;in&nbsp;the&nbsp;crystal&nbsp;datasheet&nbsp;and&nbsp;the&nbsp;value&nbsp;of&nbsp;Ci&nbsp;can&nbsp;be&nbsp;found&nbsp;in&nbsp;the&nbsp;MCU&nbsp;datasheet.

Note&nbsp;2:&nbsp;Decoupling&nbsp;capacitor&nbsp;should&nbsp;be&nbsp;placed&nbsp;as&nbsp;close&nbsp;as&nbsp;possible&nbsp;to&nbsp;each&nbsp;pin&nbsp;in&nbsp;the&nbsp;signal&nbsp;group,&nbsp;vias&nbsp;should&nbsp;be&nbsp;avoided.


这里给定的值只是一些典型例子。偏置电容的值C可以通过晶振的负载电容值CL和MCU内部的电容值Ci按照下面的公式计算获得:

C&nbsp;=&nbsp;2&nbsp;(CL&nbsp;-&nbsp;Ci)

其中,CL的值可以从晶振的数据手册上获得,Ci的值可以从MCU的数据手册上得到。

需要注意的是,退欧电容应该尽可能的靠近时钟的信号引脚以避免不必要的干扰。







[寄存器概述]


&nbsp;&nbsp;&nbsp;&nbsp;对Oscillator&nbsp;0/1来说,其控制主要包括“模式选择”,“Startup设置”和“使能”两个部分。



&nbsp;&nbsp;&nbsp;&nbsp;A、所谓的模式选择,就是通过对OSCCTRLn寄存器的MODE位进行操作,这是一个长度为3的位域,

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;总共可以表示8个不同的选项,其具体的含义如下:

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-----------------------------------------------------------------------------------------------------

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0:&nbsp;External&nbsp;clock&nbsp;connected&nbsp;on&nbsp;XIN,&nbsp;XOUT&nbsp;can&nbsp;be&nbsp;used&nbsp;as&nbsp;an&nbsp;I/O&nbsp;(no&nbsp;crystal)

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1&nbsp;to&nbsp;3:&nbsp;reserved

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;4:&nbsp;Crystal&nbsp;is&nbsp;connected&nbsp;to&nbsp;XIN/XOUT&nbsp;-&nbsp;Oscillator&nbsp;is&nbsp;used&nbsp;with&nbsp;gain&nbsp;G0&nbsp;(&nbsp;XIN&nbsp;from&nbsp;0.4&nbsp;MHz&nbsp;to&nbsp;0.9&nbsp;MHz&nbsp;).

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;5:&nbsp;Crystal&nbsp;is&nbsp;connected&nbsp;to&nbsp;XIN/XOUT&nbsp;-&nbsp;Oscillator&nbsp;is&nbsp;used&nbsp;with&nbsp;gain&nbsp;G1&nbsp;(&nbsp;XIN&nbsp;from&nbsp;0.9&nbsp;MHz&nbsp;to&nbsp;3.0&nbsp;MHz&nbsp;).

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;6:&nbsp;Crystal&nbsp;is&nbsp;connected&nbsp;to&nbsp;XIN/XOUT&nbsp;-&nbsp;Oscillator&nbsp;is&nbsp;used&nbsp;with&nbsp;gain&nbsp;G2&nbsp;(&nbsp;XIN&nbsp;from&nbsp;3.0&nbsp;MHz&nbsp;to&nbsp;8.0&nbsp;MHz&nbsp;).

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;7:&nbsp;Crystal&nbsp;is&nbsp;connected&nbsp;to&nbsp;XIN/XOUT&nbsp;-&nbsp;Oscillator&nbsp;is&nbsp;used&nbsp;with&nbsp;gain&nbsp;G3&nbsp;(&nbsp;XIN&nbsp;from&nbsp;8.0&nbsp;Mhz).

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-----------------------------------------------------------------------------------------------------



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;B、所谓的Startup设置,就是选择外部晶振的启动时间,对于外部时钟来说,这一选项没有意义。

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;对启动时间的选择设置,也是通过寄存器OSCCTRLn进行的。STARTUP也是一个长度为3的位域,

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;总共可以表示8个不同的选项,其具体含义如下表所示:



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;C、在上述的设置都已经完成(或者明确不用重新设置)以后,可以通过对MCCTRL寄存器中的OSCnEN

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;进行置位,以使能编号n所指示的晶振(外部时钟)。



&nbsp;&nbsp;&nbsp;&nbsp;对32KHz&nbsp;Oscillator的设置与Oscillator&nbsp;0/1的内容类似,只不过所要设置的内容都集中在寄存器

OSCCTRL32中,包括“模式选择”、“Startup&nbsp;time设置”和使能。



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;A、模式选择对应OSCCTRL32寄存器的MODE位,这是一个长度为3的位域,实际有效的模式只有2个,

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;他们分别是:

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-----------------------------------------------------------------------------------

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;External&nbsp;clock&nbsp;connected&nbsp;on&nbsp;XIN32,&nbsp;XOUT32&nbsp;can&nbsp;be&nbsp;used&nbsp;as&nbsp;a&nbsp;I/O&nbsp;(no&nbsp;crystal)

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Crystal&nbsp;is&nbsp;connected&nbsp;to&nbsp;XIN32/XOUT32

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2&nbsp;to&nbsp;7:&nbsp;reserved

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-----------------------------------------------------------------------------------



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;B、Startup设置对应寄存器OSCCTRL32的STARTUP位,这是一个长度为3的位域,可以表示8个不同的

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;选项,其具体含义如下表所示:



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;C、在上述的设置都已经完成(或者明确不用重新设置)以后,可以通过对OSCCTRL32的OSC32EN位

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;置位,以使能32K&nbsp;Hz&nbsp;晶振(外部时钟)。



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;当Oscillator&nbsp;0/1以及32KHz&nbsp;Oscillator在使能以后,都要经过startup所设置的时间才能正常工

作,在此期间寄存器POSCSR的OSCnRDY会被自动置位,直到Oscillator&nbsp;0/1正常工作以后,该标志位将

自动被清零。每次使能Oscillator以后,我们都应该仔细检查该标志位的状态,以决定是否进行下一步

的相关操作。对于32KHz&nbsp;Oscillator来说,相同功能的标志位位于寄存器POSCSR中,名为OSC32RDY。





[Software&nbsp;Framework&nbsp;的使用]


&nbsp;&nbsp;&nbsp;&nbsp;当我们通过AVR32&nbsp;Studio的Software&nbsp;Framework添加向导增加了Power&nbsp;Manager驱动模块以后,系统

会自动在DRIVERS模块下增加一个PM文件夹,其中包含了操作AVR32&nbsp;UC3&nbsp;PM模块的底层API,我们只需要

在工程中增加一个&nbsp;#inludePM.h&nbsp;语句,就可以获得以下函数的使用权限:




Osillator&nbsp;0


extern&nbsp;void&nbsp;pm_enable_osc0_ext_clock(volatile&nbsp;avr32_pm_t&nbsp;*pm);

功能说明:该函数将&nbsp;Oscillator&nbsp;0&nbsp;的工作模式设置为外部时钟,此时XIN引脚应该连接外部时钟的输出端,而

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;XOUT则不用特殊处理——它已经还原为普通的GPIO了。

输入参数:&AVR32_PM,也就是Power&nbsp;Manager寄存器文件的首地址,AVR32_PM是一个地址常量,由UTILS\

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;AVR32_HEADER_FILES\avr32目录中,具体的器件头文件来定义,比如uc3b0256.h中,关于

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;AVR32_PM的定义如下:

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#define&nbsp;AVR32_PM_ADDRESS&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0xFFFF0C00

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#define&nbsp;AVR32_PM&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(*((volatile&nbsp;avr32_pm_t*)AVR32_PM_ADDRESS))&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;


extern&nbsp;void&nbsp;pm_enable_osc0_crystal(volatile&nbsp;avr32_pm_t&nbsp;*pm,&nbsp;unsigned&nbsp;int&nbsp;fosc0);

功能说明:该函数将&nbsp;Oscillator&nbsp;0的工作模式设置为外部晶振,并告知系统实际使用的晶振频率大小,

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;根据这一数据,系统会自动选择对应的外部晶振模式。此时XIN和XOUT引脚都应该配合正确

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;的电容连接在外晶振的引脚上。

输入参数:&AVR32_PM

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;实际使用的外晶振频率


extern&nbsp;void&nbsp;pm_enable_clk0(volatile&nbsp;avr32_pm_t&nbsp;*pm,&nbsp;unsigned&nbsp;int&nbsp;startup);

功能说明:该函数将首先设置Oscillator&nbsp;0的startup&nbsp;time,并使能Oscillator&nbsp;0

输入参数:&AVR32_PM

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;startup&nbsp;time设置,其范围只能是&nbsp;0~7


extern&nbsp;void&nbsp;pm_disable_clk0(volatile&nbsp;avr32_pm_t&nbsp;*pm);

功能说明:该函数将关闭Oscillator&nbsp;0。

输入参数:&AVR32_PM


extern&nbsp;void&nbsp;pm_enable_clk0_no_wait(volatile&nbsp;avr32_pm_t&nbsp;*pm,&nbsp;unsigned&nbsp;int&nbsp;startup);

功能说明:该函数功能和pm_enable_clk0相同,只不过,他并不像pm_enable_clk0那样负责——一直

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;等到Oscillator&nbsp;0启动成功正式生效以后才离开函数,他是并不进行任何等待的。

输入参数:&AVR32_PM

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;startup&nbsp;time设置,其范围只能是&nbsp;0~7


extern&nbsp;void&nbsp;pm_wait_for_clk0_ready(volatile&nbsp;avr32_pm_t&nbsp;*pm);

功能说明:该函数用于确认当前的Oscillator&nbsp;0是正常工作,时钟源是有效的。当Oscillator&nbsp;0处于

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;内部新参数生效的调整状态时,该函数将一直等待,直到该过程完成。一个典型的例子:

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pm_enable_clk0函数实际上是pm_enable_clk0_no_wait和

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;extern&nbsp;void&nbsp;pm_wait_for_clk0_ready的整合

输入参数:&AVR32_PM




Oscillator&nbsp;1&nbsp;&nbsp;相关设置请参考Oscillator&nbsp;0


extern&nbsp;void&nbsp;pm_enable_osc1_ext_clock(volatile&nbsp;avr32_pm_t&nbsp;*pm);

extern&nbsp;void&nbsp;pm_enable_osc1_crystal(volatile&nbsp;avr32_pm_t&nbsp;*pm,&nbsp;unsigned&nbsp;int&nbsp;fosc1);

extern&nbsp;void&nbsp;pm_enable_clk1(volatile&nbsp;avr32_pm_t&nbsp;*pm,&nbsp;unsigned&nbsp;int&nbsp;startup);

extern&nbsp;void&nbsp;pm_disable_clk1(volatile&nbsp;avr32_pm_t&nbsp;*pm);

extern&nbsp;void&nbsp;pm_enable_clk1_no_wait(volatile&nbsp;avr32_pm_t&nbsp;*pm,&nbsp;unsigned&nbsp;int&nbsp;startup);

extern&nbsp;void&nbsp;pm_wait_for_clk1_ready(volatile&nbsp;avr32_pm_t&nbsp;*pm);




<font color=red>32KHz&nbsp;Oscillator
&nbsp;&nbsp;相关设置请参考Oscillator&nbsp;0


extern&nbsp;void&nbsp;pm_enable_osc32_ext_clock(volatile&nbsp;avr32_pm_t&nbsp;*pm);

extern&nbsp;void&nbsp;pm_enable_osc32_crystal(volatile&nbsp;avr32_pm_t&nbsp;*pm);

extern&nbsp;void&nbsp;pm_enable_clk32(volatile&nbsp;avr32_pm_t&nbsp;*pm,&nbsp;unsigned&nbsp;int&nbsp;startup);

extern&nbsp;void&nbsp;pm_disable_clk32(volatile&nbsp;avr32_pm_t&nbsp;*pm);

extern&nbsp;void&nbsp;pm_enable_clk32_no_wait(volatile&nbsp;avr32_pm_t&nbsp;*pm,&nbsp;unsigned&nbsp;int&nbsp;startup);

extern&nbsp;void&nbsp;pm_wait_for_clk32_ready(volatile&nbsp;avr32_pm_t&nbsp;*pm);




[应用实例]


#include&nbsp;avr32/io.h

#include&nbsp;PM.h



int&nbsp;main(void)

{

&nbsp;&nbsp;&nbsp;&nbsp;volatile&nbsp;avr32_pm_t*&nbsp;pm&nbsp;=&nbsp;&AVR32_PM;

&nbsp;&nbsp;&nbsp;&nbsp;//使用外部的12M晶振

&nbsp;&nbsp;&nbsp;&nbsp;pm_enable_osc0_crystal(pm,12000000);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;//使能Oscillator,并设置startup&nbsp;time为18ms

&nbsp;&nbsp;&nbsp;&nbsp;pm_enable_clk0(pm,3);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;0;

}

本贴被 Gorgon Meducer 编辑过,最后修改时间:2008-11-19,12:08:11.

出0入296汤圆

 楼主| 发表于 2008-12-10 22:25:49 | 显示全部楼层
你去参考一下Software&nbsp;Framework的DRIVERS/GPIO的Local&nbsp;Bus的GPIO例子。

出0入0汤圆

发表于 2008-12-10 13:31:23 | 显示全部楼层
呃,是这样呵&nbsp;,请求赐教Local&nbsp;Bus操作的相关指令

出0入296汤圆

 楼主| 发表于 2008-12-10 07:40:51 | 显示全部楼层
你要使用Local&nbsp;Bus操作才能达到高速GPIO操作,你使用的方法是通过普通的设备总线,

能达到5M已经很神速了……

出0入0汤圆

发表于 2008-12-9 23:28:04 | 显示全部楼层
我是想问有没有办法检测实际频率是否和计算值一样,因为用直接操作AVR32_GPIO.port[0].ovr的方式让IO口输出方波,我的最高频率只到达了5MHz,而此时PLL设置的60MHz的频率,根据KingofKings在《UC3教程1&nbsp;UC3功能简单介绍+选型表格》的帖子里面的介绍33MHz就应该能输出16MHz的方波,而我使用60MHz怎么输出方波频率不升反降?实在是想不通阿

出0入296汤圆

 楼主| 发表于 2008-12-6 12:48:42 | 显示全部楼层
频率是自己计算出来的啊……

出0入0汤圆

发表于 2008-12-5 22:08:11 | 显示全部楼层
Thanks,搞了半天都没有弄懂,原来是这样,对了,再请教下,有什么办法能够读出当前PLL的输出频率么

出0入296汤圆

 楼主| 发表于 2008-12-5 21:56:01 | 显示全部楼层
你要加入flashc.h就OK了

这是因为缺少DRIVERS/FLASHC/下的两个文件,分别是flashc.h和flashc.c。可以通过

AVR32&nbsp;Studio的Software&nbsp;Framework向导加入对flashc的支持。

本贴被 Gorgon Meducer 编辑过,最后修改时间:2008-12-05,21:57:23.

出0入0汤圆

发表于 2008-12-5 21:30:35 | 显示全部楼层


&nbsp;(原文件名:未命名.JPG)&nbsp;

在设置PLL时在"flashc_set_wait_state(1);&nbsp;"一句处出现上图所示问题,请高人解答...

出0入296汤圆

 楼主| 发表于 2008-12-2 21:21:29 | 显示全部楼层
http://www.ouravr.com/bbs/bbs_content.jsp?bbs_sn=1879031&bbs_page_no=1&bbs_id=1030

中断控制器的已经写好了阿……

出0入0汤圆

发表于 2008-12-1 21:26:51 | 显示全部楼层
期待中断控制器哈

出0入296汤圆

 楼主| 发表于 2008-11-26 21:20:41 | 显示全部楼层
更新&nbsp;普通时钟Generic&nbsp;Clock

谢谢大家关注。

本周将开始中断控制器的专题。

出0入0汤圆

发表于 2008-11-22 21:22:48 | 显示全部楼层
&nbsp;我帮顶

出0入0汤圆

发表于 2008-11-22 09:53:34 | 显示全部楼层
顶了,期待更新啊!

出0入0汤圆

发表于 2008-11-22 00:32:02 | 显示全部楼层
好东西啊!

出0入0汤圆

发表于 2008-11-21 23:14:47 | 显示全部楼层
呵呵,再顶一下。楼主加油,再接再厉啊。

出0入296汤圆

 楼主| 发表于 2008-11-19 22:30:19 | 显示全部楼层
更新&nbsp;同步时钟与四大时钟域(CPU/HSB/PBB/PBA)

自己顶一下……

出0入0汤圆

发表于 2008-11-18 20:18:52 | 显示全部楼层
不错啊,傻孩子的学习态度不是一般的认真的哦,佩服啊

出0入296汤圆

 楼主| 发表于 2008-11-18 19:41:27 | 显示全部楼层
更新&nbsp;>>&nbsp;PLL锁相环&nbsp;

肚子饿了……

出0入0汤圆

发表于 2008-11-18 16:33:57 | 显示全部楼层
先顶一下再看!

出0入296汤圆

 楼主| 发表于 2008-11-18 13:18:40 | 显示全部楼层
完成对&nbsp;外部时钟、晶振源、32.768KHz时钟源&nbsp;的更新哈

庆祝下

出0入0汤圆

发表于 2008-11-17 22:55:34 | 显示全部楼层
其实不光是调频,还应该有调压吧,一般都是动态调频调压的,电源管理的代码很庞大。。。。

出0入0汤圆

发表于 2008-11-17 20:51:58 | 显示全部楼层
我顶!&nbsp;呵呵,楼主终于开专题了,这下有的玩了。&nbsp;&nbsp;持续关注中...

出0入0汤圆

发表于 2008-11-18 19:41:27 | 显示全部楼层
更新&nbsp;>>&nbsp;PLL锁相环&nbsp;

肚子饿了……

出0入0汤圆

发表于 2008-11-18 13:18:40 | 显示全部楼层
完成对&nbsp;外部时钟、晶振源、32.768KHz时钟源&nbsp;的更新哈

庆祝下

出0入0汤圆

发表于 2008-11-17 17:53:32 | 显示全部楼层
-&nbsp;-b&nbsp;对楼上无语了……

又发现恶搞俺帖子的新花样了……

出0入0汤圆

发表于 2008-11-17 17:03:51 | 显示全部楼层

>>官方PM函数库二次封装函数代码注释




&lt;有待添加注释>



int&nbsp;pm_configure_clocks(pm_freq_param_t&nbsp;*param)

{

&nbsp;&nbsp;//&nbsp;Supported&nbsp;frequencies:

&nbsp;&nbsp;//&nbsp;Fosc0&nbsp;mul&nbsp;div&nbsp;PLL&nbsp;div2_en&nbsp;cpu_f&nbsp;pba_f&nbsp;&nbsp;&nbsp;Comment

&nbsp;&nbsp;//&nbsp;&nbsp;12&nbsp;&nbsp;&nbsp;15&nbsp;&nbsp;&nbsp;1&nbsp;&nbsp;192&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;12&nbsp;&nbsp;&nbsp;&nbsp;12

&nbsp;&nbsp;//&nbsp;&nbsp;12&nbsp;&nbsp;&nbsp;&nbsp;9&nbsp;&nbsp;&nbsp;3&nbsp;&nbsp;&nbsp;40&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;20&nbsp;&nbsp;&nbsp;&nbsp;20&nbsp;&nbsp;&nbsp;&nbsp;PLL&nbsp;out&nbsp;of&nbsp;spec

&nbsp;&nbsp;//&nbsp;&nbsp;12&nbsp;&nbsp;&nbsp;15&nbsp;&nbsp;&nbsp;1&nbsp;&nbsp;192&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;24&nbsp;&nbsp;&nbsp;&nbsp;12

&nbsp;&nbsp;//&nbsp;&nbsp;12&nbsp;&nbsp;&nbsp;&nbsp;9&nbsp;&nbsp;&nbsp;1&nbsp;&nbsp;120&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;30&nbsp;&nbsp;&nbsp;&nbsp;15

&nbsp;&nbsp;//&nbsp;&nbsp;12&nbsp;&nbsp;&nbsp;&nbsp;9&nbsp;&nbsp;&nbsp;3&nbsp;&nbsp;&nbsp;40&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;40&nbsp;&nbsp;&nbsp;&nbsp;20&nbsp;&nbsp;&nbsp;&nbsp;PLL&nbsp;out&nbsp;of&nbsp;spec

&nbsp;&nbsp;//&nbsp;&nbsp;12&nbsp;&nbsp;&nbsp;15&nbsp;&nbsp;&nbsp;1&nbsp;&nbsp;192&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;48&nbsp;&nbsp;&nbsp;&nbsp;12

&nbsp;&nbsp;//&nbsp;&nbsp;12&nbsp;&nbsp;&nbsp;15&nbsp;&nbsp;&nbsp;1&nbsp;&nbsp;192&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;48&nbsp;&nbsp;&nbsp;&nbsp;24

&nbsp;&nbsp;//&nbsp;&nbsp;12&nbsp;&nbsp;&nbsp;&nbsp;8&nbsp;&nbsp;&nbsp;1&nbsp;&nbsp;108&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;54&nbsp;&nbsp;&nbsp;&nbsp;27

&nbsp;&nbsp;//&nbsp;&nbsp;12&nbsp;&nbsp;&nbsp;&nbsp;9&nbsp;&nbsp;&nbsp;1&nbsp;&nbsp;120&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;60&nbsp;&nbsp;&nbsp;&nbsp;15

&nbsp;&nbsp;//&nbsp;&nbsp;12&nbsp;&nbsp;&nbsp;&nbsp;9&nbsp;&nbsp;&nbsp;1&nbsp;&nbsp;120&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;60&nbsp;&nbsp;&nbsp;&nbsp;30

&nbsp;&nbsp;//&nbsp;&nbsp;12&nbsp;&nbsp;&nbsp;10&nbsp;&nbsp;&nbsp;1&nbsp;&nbsp;132&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;66&nbsp;&nbsp;&nbsp;&nbsp;16.5

&nbsp;&nbsp;//

&nbsp;&nbsp;unsigned&nbsp;long&nbsp;in_cpu_f&nbsp;&nbsp;=&nbsp;param->cpu_f;

&nbsp;&nbsp;unsigned&nbsp;long&nbsp;in_osc0_f&nbsp;=&nbsp;param->osc0_f;

&nbsp;&nbsp;unsigned&nbsp;long&nbsp;mul,&nbsp;div,&nbsp;div2_en&nbsp;=&nbsp;0,&nbsp;div2_cpu&nbsp;=&nbsp;0,&nbsp;div2_pba&nbsp;=&nbsp;0;

&nbsp;&nbsp;unsigned&nbsp;long&nbsp;pll_freq,&nbsp;rest;

&nbsp;&nbsp;Bool&nbsp;b_div2_pba,&nbsp;b_div2_cpu;



&nbsp;&nbsp;//&nbsp;Switch&nbsp;to&nbsp;external&nbsp;Oscillator&nbsp;0

&nbsp;&nbsp;pm_switch_to_osc0(&AVR32_PM,&nbsp;in_osc0_f,&nbsp;param->osc0_startup);



&nbsp;&nbsp;//&nbsp;Start&nbsp;with&nbsp;CPU&nbsp;freq&nbsp;config

&nbsp;&nbsp;if&nbsp;(in_cpu_f&nbsp;==&nbsp;in_osc0_f)

&nbsp;&nbsp;{

&nbsp;&nbsp;&nbsp;&nbsp;param->cpu_f&nbsp;=&nbsp;in_osc0_f;

&nbsp;&nbsp;&nbsp;&nbsp;param->pba_f&nbsp;=&nbsp;in_osc0_f;

&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;PM_FREQ_STATUS_OK;

&nbsp;&nbsp;}

&nbsp;&nbsp;else&nbsp;if&nbsp;(in_cpu_f&nbsp;&lt;&nbsp;in_osc0_f)

&nbsp;&nbsp;{

&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;TBD

&nbsp;&nbsp;}



&nbsp;&nbsp;rest&nbsp;=&nbsp;in_cpu_f&nbsp;%&nbsp;in_osc0_f;



&nbsp;&nbsp;for&nbsp;(div&nbsp;=&nbsp;1;&nbsp;div&nbsp;&lt;&nbsp;32;&nbsp;div++)

&nbsp;&nbsp;{

&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;((div&nbsp;*&nbsp;rest)&nbsp;%&nbsp;in_osc0_f&nbsp;==&nbsp;0)

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;

&nbsp;&nbsp;}

&nbsp;&nbsp;if&nbsp;(div&nbsp;==&nbsp;32)

&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;PM_FREQ_STATUS_FAIL;



&nbsp;&nbsp;mul&nbsp;=&nbsp;(in_cpu_f&nbsp;*&nbsp;div)&nbsp;/&nbsp;in_osc0_f;



&nbsp;&nbsp;if&nbsp;(mul>&nbsp;PM_MAX_MUL)

&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;PM_FREQ_STATUS_FAIL;



&nbsp;&nbsp;//&nbsp;export&nbsp;2power&nbsp;from&nbsp;PLL&nbsp;div&nbsp;to&nbsp;div2_cpu

&nbsp;&nbsp;while&nbsp;(!(div&nbsp;%&nbsp;2))

&nbsp;&nbsp;{

&nbsp;&nbsp;&nbsp;&nbsp;div&nbsp;/=&nbsp;2;

&nbsp;&nbsp;&nbsp;&nbsp;div2_cpu++;

&nbsp;&nbsp;}



&nbsp;&nbsp;//&nbsp;Here&nbsp;we&nbsp;know&nbsp;the&nbsp;mul&nbsp;and&nbsp;div&nbsp;parameter&nbsp;of&nbsp;the&nbsp;PLL&nbsp;config.

&nbsp;&nbsp;//&nbsp;.&nbsp;Check&nbsp;out&nbsp;if&nbsp;the&nbsp;PLL&nbsp;has&nbsp;a&nbsp;valid&nbsp;in_cpu_f.

&nbsp;&nbsp;//&nbsp;.&nbsp;Try&nbsp;to&nbsp;have&nbsp;for&nbsp;the&nbsp;PLL&nbsp;frequency&nbsp;(VCO&nbsp;output)&nbsp;the&nbsp;highest&nbsp;possible&nbsp;value

&nbsp;&nbsp;//&nbsp;&nbsp;&nbsp;to&nbsp;reduce&nbsp;jitter.

&nbsp;&nbsp;while&nbsp;(in_osc0_f&nbsp;*&nbsp;2&nbsp;*&nbsp;mul&nbsp;/&nbsp;div&nbsp;&lt;&nbsp;AVR32_PM_PLL_VCO_RANGE0_MAX_FREQ)

&nbsp;&nbsp;{

&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(2&nbsp;*&nbsp;mul>&nbsp;PM_MAX_MUL)

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;

&nbsp;&nbsp;&nbsp;&nbsp;mul&nbsp;*=&nbsp;2;

&nbsp;&nbsp;&nbsp;&nbsp;div2_cpu++;

&nbsp;&nbsp;}



&nbsp;&nbsp;if&nbsp;(div2_cpu&nbsp;!=&nbsp;0)

&nbsp;&nbsp;{

&nbsp;&nbsp;&nbsp;&nbsp;div2_cpu--;

&nbsp;&nbsp;&nbsp;&nbsp;div2_en&nbsp;=&nbsp;1;

&nbsp;&nbsp;}



&nbsp;&nbsp;pll_freq&nbsp;=&nbsp;in_osc0_f&nbsp;*&nbsp;mul&nbsp;/&nbsp;(div&nbsp;*&nbsp;(1&nbsp;&lt;&lt;&nbsp;div2_en));



&nbsp;&nbsp;//&nbsp;Update&nbsp;real&nbsp;CPU&nbsp;Frequency

&nbsp;&nbsp;param->cpu_f&nbsp;=&nbsp;pll_freq&nbsp;/&nbsp;(1&nbsp;&lt;&lt;&nbsp;div2_cpu);

&nbsp;&nbsp;mul--;



&nbsp;&nbsp;pm_pll_setup(&AVR32_PM

&nbsp;&nbsp;,&nbsp;0&nbsp;&nbsp;&nbsp;//&nbsp;pll

&nbsp;&nbsp;,&nbsp;mul&nbsp;//&nbsp;mul

&nbsp;&nbsp;,&nbsp;div&nbsp;//&nbsp;div

&nbsp;&nbsp;,&nbsp;0&nbsp;&nbsp;&nbsp;//&nbsp;osc

&nbsp;&nbsp;,&nbsp;16&nbsp;&nbsp;//&nbsp;lockcount

&nbsp;&nbsp;);



&nbsp;&nbsp;pm_pll_set_option(&AVR32_PM

&nbsp;&nbsp;,&nbsp;0&nbsp;//&nbsp;pll

&nbsp;&nbsp;//&nbsp;PLL&nbsp;clock&nbsp;is&nbsp;lower&nbsp;than&nbsp;160MHz:&nbsp;need&nbsp;to&nbsp;set&nbsp;pllopt.

&nbsp;&nbsp;,&nbsp;(pll_freq&nbsp;&lt;&nbsp;160000000)&nbsp;?&nbsp;1&nbsp;:&nbsp;0&nbsp;//&nbsp;pll_freq

&nbsp;&nbsp;,&nbsp;div2_en&nbsp;//&nbsp;pll_div2

&nbsp;&nbsp;,&nbsp;0&nbsp;//&nbsp;pll_wbwdisable

&nbsp;&nbsp;);



&nbsp;&nbsp;rest&nbsp;=&nbsp;pll_freq;

&nbsp;&nbsp;while&nbsp;(rest>&nbsp;AVR32_PM_PBA_MAX_FREQ&nbsp;||

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rest&nbsp;!=&nbsp;param->pba_f)

&nbsp;&nbsp;{

&nbsp;&nbsp;&nbsp;&nbsp;div2_pba++;

&nbsp;&nbsp;&nbsp;&nbsp;rest&nbsp;=&nbsp;pll_freq&nbsp;/&nbsp;(1&nbsp;&lt;&lt;&nbsp;div2_pba);

&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(rest&nbsp;&lt;&nbsp;param->pba_f)

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;

&nbsp;&nbsp;}



&nbsp;&nbsp;//&nbsp;Update&nbsp;real&nbsp;PBA&nbsp;Frequency

&nbsp;&nbsp;param->pba_f&nbsp;=&nbsp;pll_freq&nbsp;/&nbsp;(1&nbsp;&lt;&lt;&nbsp;div2_pba);



#if&nbsp;__GNUC__

&nbsp;&nbsp;set_cpu_hz(param->pba_f);

#endif



&nbsp;&nbsp;//&nbsp;Enable&nbsp;PLL0

&nbsp;&nbsp;pm_pll_enable(&AVR32_PM,&nbsp;0);



&nbsp;&nbsp;//&nbsp;Wait&nbsp;for&nbsp;PLL0&nbsp;locked

&nbsp;&nbsp;pm_wait_for_pll0_locked(&AVR32_PM);



&nbsp;&nbsp;if&nbsp;(div2_cpu)

&nbsp;&nbsp;{

&nbsp;&nbsp;&nbsp;&nbsp;b_div2_cpu&nbsp;=&nbsp;TRUE;

&nbsp;&nbsp;&nbsp;&nbsp;div2_cpu--;

&nbsp;&nbsp;}

&nbsp;&nbsp;else

&nbsp;&nbsp;&nbsp;&nbsp;b_div2_cpu&nbsp;=&nbsp;FALSE;



&nbsp;&nbsp;if&nbsp;(div2_pba)

&nbsp;&nbsp;{

&nbsp;&nbsp;&nbsp;&nbsp;b_div2_pba&nbsp;=&nbsp;TRUE;

&nbsp;&nbsp;&nbsp;&nbsp;div2_pba--;

&nbsp;&nbsp;}

&nbsp;&nbsp;else

&nbsp;&nbsp;&nbsp;&nbsp;b_div2_pba&nbsp;=&nbsp;FALSE;



&nbsp;&nbsp;pm_cksel(&AVR32_PM

&nbsp;&nbsp;,&nbsp;b_div2_pba,&nbsp;div2_pba&nbsp;//&nbsp;PBA

&nbsp;&nbsp;,&nbsp;b_div2_cpu,&nbsp;div2_cpu&nbsp;//&nbsp;PBB

&nbsp;&nbsp;,&nbsp;b_div2_cpu,&nbsp;div2_cpu&nbsp;//&nbsp;HSB

&nbsp;&nbsp;);



&nbsp;&nbsp;if&nbsp;(param->cpu_f>&nbsp;AVR32_FLASHC_FWS_0_MAX_FREQ)

&nbsp;&nbsp;&nbsp;&nbsp;flashc_set_wait_state(1);

&nbsp;&nbsp;else

&nbsp;&nbsp;&nbsp;&nbsp;flashc_set_wait_state(0);



&nbsp;&nbsp;pm_switch_to_clock(&AVR32_PM,&nbsp;AVR32_PM_MCCTRL_MCSEL_PLL0);



&nbsp;&nbsp;return&nbsp;PM_FREQ_STATUS_OK;

}<font color=#699BCD>

本贴被 Gorgon Meducer 编辑过,最后修改时间:2008-11-19,12:10:26.

出0入0汤圆

发表于 2008-11-17 17:03:33 | 显示全部楼层

>>&nbsp;复位


本贴被 Gorgon Meducer 编辑过,最后修改时间:2008-11-17,17:17:21.

出0入0汤圆

发表于 2008-11-17 17:03:27 | 显示全部楼层

>>&nbsp;节能与休眠


本贴被 Gorgon Meducer 编辑过,最后修改时间:2008-11-17,17:17:09.

出0入0汤圆

发表于 2008-11-17 17:03:20 | 显示全部楼层

>>&nbsp;Generic&nbsp;Clock


有待添加内容




<font color=red>[寄存器概述]






[Software&nbsp;Framework&nbsp;的使用]


&nbsp;&nbsp;&nbsp;&nbsp;当我们通过AVR32&nbsp;Studio的Software&nbsp;Framework添加向导增加了Power&nbsp;Manager驱动模块以后,系统

会自动在DRIVERS模块下增加一个PM文件夹,其中包含了操作AVR32&nbsp;UC3&nbsp;PM模块的底层API,我们只需要

在工程中增加一个&nbsp;#inlude"PM.h"&nbsp;语句,就可以获得以下函数的使用权限:




extern&nbsp;void&nbsp;pm_gc_setup

&nbsp;&nbsp;&nbsp;&nbsp;(

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;volatile&nbsp;avr32_pm_t&nbsp;*pm,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&AVR32_PM

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;unsigned&nbsp;int&nbsp;gc,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//普通时钟通道编号,请参阅具体器件手册

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;unsigned&nbsp;int&nbsp;osc_or_pll,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//0表示OSC,1表示PLL

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;unsigned&nbsp;int&nbsp;pll_osc,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//当选择OSC时,0表示OSC0、1表示OSC1

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//当选择PLL时,0表示PLL0、1表示PLL1

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;unsigned&nbsp;int&nbsp;diven,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//分频开关&nbsp;0表示不分频

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;unsigned&nbsp;int&nbsp;div&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//当DIVEN为1时,输入的时钟将被处以

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//2&nbsp;*&nbsp;(DIV&nbsp;+&nbsp;1)

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;);


函数说明:该函数用于设置指定通道编号的普通时钟,选择输入时钟源,分频开关以及分频参数等

输入参数:&AVR32_PM,&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;普通时钟通道编号,

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;OSC或PLL选择,

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;OSC0/OSC1或者PLL0/PLL1选择

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;分频开关,

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;分频设置&nbsp;


extern&nbsp;void&nbsp;pm_gc_enable(volatile&nbsp;avr32_pm_t&nbsp;*pm,&nbsp;unsigned&nbsp;int&nbsp;gc);

函数说明:该函数将开启指定通道普通时钟的使能标志

输入参数:&AVR32_PM,

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;普通时钟的通道编号


extern&nbsp;void&nbsp;pm_gc_disable(volatile&nbsp;avr32_pm_t&nbsp;*pm,&nbsp;unsigned&nbsp;int&nbsp;gc);

函数说明:该函数将关闭指定编号的普通时钟通道

输入参数:&AVR32_PM,普通时钟的通道编号




[应用实例]


#include&nbsp;"avr32/io.h"&nbsp;&nbsp;

#include&nbsp;"PM.h"&nbsp;&nbsp;



int&nbsp;main(void)&nbsp;&nbsp;

{&nbsp;&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;volatile&nbsp;avr32_pm_t*&nbsp;pm&nbsp;=&nbsp;&AVR32_PM;&nbsp;&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;//使用外部的12M晶振&nbsp;&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;pm_enable_osc0_crystal(pm,12000000);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;//使能Oscillator,并设置startup&nbsp;time为18ms&nbsp;&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;pm_enable_clk0(pm,3);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;//使用PLL1连接Oscillator0产生一个48MHz的时钟,需要先产生一个大于80MHz的频率&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;pm_pll_setup&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pm,&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1,&nbsp;&nbsp;&nbsp;&nbsp;//PLL0&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;15,&nbsp;&nbsp;&nbsp;//*16

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1,&nbsp;&nbsp;&nbsp;&nbsp;//不分频&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0,&nbsp;&nbsp;&nbsp;&nbsp;//连接Oscillator0&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;16&nbsp;&nbsp;&nbsp;&nbsp;//default&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;);&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;//设置PLL1的属性&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;pm_pll_set_option&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pm,&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1,&nbsp;&nbsp;//PLL1&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0,&nbsp;&nbsp;//选择频率范围80-180MHz&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0,&nbsp;&nbsp;//输出频率不分频,获得192M的实际输出&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;//default&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;);&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;//使能PLL1&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;pm_pll_enable(pm,&nbsp;1);&nbsp;&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;//等待PLL1锁定&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;pm_wait_for_pll1_locked(pm);&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;//向USBB输出48M普通时钟

&nbsp;&nbsp;&nbsp;&nbsp;pm_gc_setup

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pm,

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;4,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//输出到USBB

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//选择PLL

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//PLL1

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//打开分频

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;1/(2(DIV&nbsp;+&nbsp;1))&nbsp;&nbsp;192M/4&nbsp;=&nbsp;48M&nbsp;&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;)

&nbsp;&nbsp;&nbsp;&nbsp;//使能普通时钟

&nbsp;&nbsp;&nbsp;&nbsp;pm_gc_enable(pm,4);

&nbsp;&nbsp;&nbsp;&nbsp;


}

本贴被 Gorgon Meducer 编辑过,最后修改时间:2008-12-16,22:25:14.

出0入0汤圆

发表于 2008-11-17 17:03:15 | 显示全部楼层

>>&nbsp;同步时钟与四大时钟域(CPU/HSB/PBB/PBA)


&nbsp;&nbsp;&nbsp;&nbsp;所谓同步时钟,就是芯片内部用于协调各个模块的工作的脉搏,通常说来就是系统时钟。一个系统

只有一个系统时钟,虽然四大时钟域可以有彼此不同的时钟(对UC3A和UC3B来说HSB永远和CPU工作在同

频率),但是他们只是系统时钟的不同分频而已——换句话说,四大时钟域拥有的只是对引入自己的系

统使用拥有独立自主的分频设置。



&nbsp;&nbsp;&nbsp;&nbsp;能够有资格做系统时钟的只有三种时钟源:系统内部自带的115KHz默认RC时钟,就是通常所谓的

Slow&nbsp;clock,当系统复位以后会自动默认连接这个时钟;Oscillator&nbsp;0和PLL0。大家注意,PLL1和

Oscillator&nbsp;1是没有资格充当系统时钟的。可以用“数字0的等级高于1,因此0比1更强悍”来记忆这个

特征。




<font color=red>[寄存器概述]





&nbsp;&nbsp;&nbsp;&nbsp;对系统时钟和四大时钟域的设定来说,主要有以下几个方面:

&nbsp;&nbsp;&nbsp;&nbsp;一、系统时钟的选择

&nbsp;&nbsp;&nbsp;&nbsp;二、时钟域连接到系统主时钟的分频设置



&nbsp;&nbsp;&nbsp;&nbsp;其中,系统时钟的选择是通过寄存器MCCTRL的MCSEL位来实现的,这是一个长度为2的二进制数,可

以表示3种有效的选择:

&nbsp;&nbsp;&nbsp;&nbsp;--------------------------------------------------

&nbsp;&nbsp;&nbsp;&nbsp;0:&nbsp;The&nbsp;slow&nbsp;clock&nbsp;is&nbsp;the&nbsp;source&nbsp;for&nbsp;the&nbsp;main&nbsp;clock

&nbsp;&nbsp;&nbsp;&nbsp;1:&nbsp;Oscillator&nbsp;0&nbsp;is&nbsp;source&nbsp;for&nbsp;the&nbsp;main&nbsp;clock

&nbsp;&nbsp;&nbsp;&nbsp;2:&nbsp;PLL0&nbsp;is&nbsp;source&nbsp;for&nbsp;the&nbsp;main&nbsp;clock

&nbsp;&nbsp;&nbsp;&nbsp;--------------------------------------------------



&nbsp;&nbsp;&nbsp;&nbsp;四大时钟域的分频设置是通过寄存器CKSEL进行的。其中xxxDIV是分频开关,当为0时表示不分频;

xxxSEL是分频设置,这是一个3位的二进制数字,表示将进行2^(xxxSEL&nbsp;+&nbsp;1)倍的分频。

&nbsp;&nbsp;&nbsp;&nbsp;需要强调的是,当xxxDIV为0时,一定要把xxxSEL也写为0。








[Software&nbsp;Framework&nbsp;的使用]


&nbsp;&nbsp;&nbsp;&nbsp;当我们通过AVR32&nbsp;Studio的Software&nbsp;Framework添加向导增加了Power&nbsp;Manager驱动模块以后,系统

会自动在DRIVERS模块下增加一个PM文件夹,其中包含了操作AVR32&nbsp;UC3&nbsp;PM模块的底层API,我们只需要

在工程中增加一个&nbsp;#inlude"PM.h"&nbsp;语句,就可以获得以下函数的使用权限:




extern&nbsp;void&nbsp;pm_cksel

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;volatile&nbsp;avr32_pm_t&nbsp;*pm,&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;unsigned&nbsp;int&nbsp;pbadiv,&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;unsigned&nbsp;int&nbsp;pbasel,&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;unsigned&nbsp;int&nbsp;pbbdiv,&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;unsigned&nbsp;int&nbsp;pbbsel,&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;unsigned&nbsp;int&nbsp;hsbdiv,&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;unsigned&nbsp;int&nbsp;hsbsel

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;);


函数说明:该函数将分别指定四大时钟域在连接到系统主时钟时“是否分频”以及“选择多大的分频”

输入参数:&AVR32_PM

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PBA分频开关&nbsp;0表示不分频&nbsp;1表示总线PBA将以pbasel指定的分频数连接到系统主时钟

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PBA的分频

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PBB的分频开关

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PBB的分频

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HSB的分频开关(UC3A/B永远和CPU域的时钟设置相同,所以这里实际上设置的是CPU的分频开关)

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HSB的分频(UC3A/B永远和CPU域的时钟设置相同,所以这里实际上设置的是CPU的分频)


extern&nbsp;void&nbsp;pm_switch_to_clock(volatile&nbsp;avr32_pm_t&nbsp;*pm,&nbsp;unsigned&nbsp;long&nbsp;clock);

函数说明:该函数用于选择系统的主时钟

输入参数:&AVR32_PM

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;主时钟源,只能是以下的常数之一:

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;AVR32_PM_MCSEL_SLOW&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;芯片自带的默认115K&nbsp;RC振荡器

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;AVR32_PM_MCSEL_OSC0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;选择Oscillator&nbsp;0作为系统主时钟

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;AVR32_PM_MCSEL_PLL0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;选择PLL0作为系统主时钟


extern&nbsp;void&nbsp;pm_switch_to_osc0(volatile&nbsp;avr32_pm_t&nbsp;*pm,&nbsp;unsigned&nbsp;int&nbsp;fosc0,&nbsp;unsigned&nbsp;int&nbsp;startup);

函数说明:直接将Oscillator&nbsp;0作为系统主时钟(使用晶振而不是时钟),同时要指定所连接的外晶振的频率和启动时间。

输入参数:&AVR32_PM

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;所连接的晶振频率

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;该晶振的启动时间


extern&nbsp;int&nbsp;pm_configure_clocks(pm_freq_param_t&nbsp;*param);

函数说明:该函数会根据用户的需要自动的配置PM,以满足设定的CPU和PBA总线时钟

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;该函数会首先尝试连接PLL来实现所设定的CPU频率,如果失败了,系统会尝试直接连接Oscillator&nbsp;0

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PBA的频率会根据CPU的频率自动的进行优化,他总是等于CPU频率的/(2^x),所以PBA的最大频率总是

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;低于30MHz

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HSB和PBB的频率总是和CPU相同,当自动配置完成以后,CPU、HSB和PBA的频率会被自动的反馈回来

输入参数:频率设置信息结构体指针&nbsp;(pm_freq_param_t&nbsp;*)&nbsp;相信情况请参考下面的结构体说明

输出参数:PM_FREQ_STATUS_OK&nbsp;&nbsp;&nbsp;频率设置成功

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PM_FREQ_STATUS_FAIL&nbsp;频率设置失败

//!&nbsp;Input&nbsp;and&nbsp;output&nbsp;parameters&nbsp;when&nbsp;initializing&nbsp;PM&nbsp;clocks&nbsp;using&nbsp;pm_configure_clocks().

typedef&nbsp;struct

{

&nbsp;&nbsp;//!&nbsp;CPU&nbsp;frequency&nbsp;(input/output&nbsp;argument).

&nbsp;&nbsp;unsigned&nbsp;long&nbsp;cpu_f;



&nbsp;&nbsp;//!&nbsp;PBA&nbsp;frequency&nbsp;(input/output&nbsp;argument).

&nbsp;&nbsp;unsigned&nbsp;long&nbsp;pba_f;



&nbsp;&nbsp;//!&nbsp;Oscillator&nbsp;0&nbsp;frequency&nbsp;(board&nbsp;dependant)&nbsp;(input&nbsp;argument).

&nbsp;&nbsp;unsigned&nbsp;long&nbsp;osc0_f;



&nbsp;&nbsp;//!&nbsp;Oscillator&nbsp;0&nbsp;startup&nbsp;time:&nbsp;AVR32_PM_OSCCTRL0_STARTUP_x_RCOSC&nbsp;(input&nbsp;argument).

&nbsp;&nbsp;unsigned&nbsp;long&nbsp;osc0_startup;

}&nbsp;pm_freq_param_t;




[应用实例]




#include&nbsp;"avr32/io.h"&nbsp;

#include&nbsp;"PM.h"&nbsp;



int&nbsp;main(void)&nbsp;

{&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;volatile&nbsp;avr32_pm_t*&nbsp;pm&nbsp;=&nbsp;&AVR32_PM;&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;//使用外部的12M晶振&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;pm_enable_osc0_crystal(pm,12000000);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;//使能Oscillator,并设置startup&nbsp;time为18ms&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;pm_enable_clk0(pm,3);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;//使用PLL0连接Oscillator0产生一个60MHz的时钟,需要先产生一个大于80MHz的频率

&nbsp;&nbsp;&nbsp;&nbsp;pm_pll_setup

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pm,

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0,&nbsp;&nbsp;&nbsp;&nbsp;//PLL0

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;9,&nbsp;&nbsp;&nbsp;&nbsp;//*10

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1,&nbsp;&nbsp;&nbsp;&nbsp;//不分频

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0,&nbsp;&nbsp;&nbsp;&nbsp;//连接Oscillator0

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;16&nbsp;&nbsp;&nbsp;&nbsp;//default

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;);

&nbsp;&nbsp;&nbsp;&nbsp;//设置PLL0的属性

&nbsp;&nbsp;&nbsp;&nbsp;pm_pll_set_option

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pm,

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0,&nbsp;&nbsp;//PLL0

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0,&nbsp;&nbsp;//选择频率范围80-180MHz

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1,&nbsp;&nbsp;//输出频率2分频,获得60M的实际输出

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;//default

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;);

&nbsp;&nbsp;&nbsp;&nbsp;//使能PLL0

&nbsp;&nbsp;&nbsp;&nbsp;pm_pll_enable(pm,&nbsp;0);&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;//等待PLL0锁定

&nbsp;&nbsp;&nbsp;&nbsp;pm_wait_for_pll0_locked(pm);

&nbsp;&nbsp;&nbsp;&nbsp;//这一句不可省略,当CPU/HSB时钟超过系统最工作频率的一半,也就是33M时

&nbsp;&nbsp;&nbsp;&nbsp;flashc_set_wait_state(1);

&nbsp;&nbsp;&nbsp;&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;//选择PLL作为系统主时钟

&nbsp;&nbsp;&nbsp;&nbsp;pm_switch_to_clock(pm,AVR32_PM_MCSEL_PLL0);

&nbsp;&nbsp;&nbsp;&nbsp;//分别设置四大时钟域的时钟

&nbsp;&nbsp;&nbsp;&nbsp;pm_cksel

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pm,

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//PBA开启分频&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//2分频,也就是PBA工作在30M频率之下

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//PBB不分频

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//PBB工作在60M频率下

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//HSB不分频

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//CPU和HSB都工作在60M的频率下

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;);&nbsp;&nbsp;&nbsp;&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;


&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;0;&nbsp;

}





本贴被 Gorgon Meducer 编辑过,最后修改时间:2008-12-16,22:26:34.

出0入0汤圆

发表于 2008-11-17 17:03:10 | 显示全部楼层

>>&nbsp;PLL锁相环


&nbsp;&nbsp;&nbsp;&nbsp;AVR32&nbsp;UC3提供了两个锁相环,分别是PLL0和PLL1。他们都可以从Oscillator&nbsp;0&nbsp;和&nbsp;Oscillator&nbsp;1中

任选一个作为自己的输入时钟fosc,彼此并不影响。对每一个PLL来说,都有一个长度为4位的乘法因子和除法

因子,他们的取值范围是0~0x0F。根据这两个因子,相应的PLL初级输出频率fvco计算公式为:

&nbsp;&nbsp;&nbsp;&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;当PLLDIV大于0时(也就是除法因子不为0时)

&nbsp;&nbsp;&nbsp;&nbsp;fvco&nbsp;=&nbsp;(PLLMUL+1)/(PLLDIV)&nbsp;&#8226;&nbsp;fosc

&nbsp;&nbsp;&nbsp;&nbsp;当PLLDIV为0时

&nbsp;&nbsp;&nbsp;&nbsp;fvco&nbsp;=&nbsp;2*(PLLMUL+1)&nbsp;&#8226;&nbsp;fosc



&nbsp;&nbsp;&nbsp;&nbsp;需要补充说明的是,对于fvco,PLL有两个可选的频率范围,分别是80~180Mhz和160~240Mhz,也就是说,

无论如何,乘数因子配合除数因子应该达到至少指定频率范围的最小值。那么,对于小于频率范围最小值的

频率我们应该如何做到呢?比如,我们想获得一个40M的频率。PLL为我们提供了一个对fvco分频的途径,通过

PLLOPT[1]置位,我们可以将fvco二分频以后再输出。<font color=blue>根据上面的公式,我们知道,利用PLL我们能得到的最小

频率是40M,而Oscillator能支持的最大时钟源为16M,这里就出现了一个16M~40M的频率空缺,请大家注意这个

问题。
PLL&nbsp;fvco频率范围的选择,可以通过PLLOPT[0]来设置,0表示80~180Mhz,1表示160~240Mhz。








[寄存器概述]




&nbsp;&nbsp;&nbsp;&nbsp;对PLL锁相环来说,所需要设置的内容主要包括“倍频/分频参数设置”、“时钟源的选择”和“PLL属性

设置”。



&nbsp;&nbsp;&nbsp;&nbsp;A、倍频/分频设置主要是通过对寄存器PLLn的PLLMUL和PLLDIV位进行设置,其中PLLMUL和PLLDIV都是4位

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;二进制长度,可以表示0~0x0F之间的任意数值。

&nbsp;&nbsp;&nbsp;&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;B、PLL属性设置又包括“fvco频率输出范围选择”、“PLL频率输出二分频开关”和“Wide-Bandith开关”

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;三个部分组成。分别对应寄存器PLLn中的PLLOPT[0]、PLLOPT[1]和PLLOPT[2]。

&nbsp;&nbsp;&nbsp;&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;C、通过对PLLn中PLLOSC位的设置,我们可以选择Oscillator0(默认)或者Oscillator1作为PLLn的时钟源&nbsp;&nbsp;&nbsp;&nbsp;



&nbsp;&nbsp;&nbsp;&nbsp;D、通过PLLn中的PLLEN位,我们可以使能/关闭PLL的功能。




[Software&nbsp;Framework&nbsp;的使用]




&nbsp;&nbsp;&nbsp;&nbsp;当我们通过AVR32&nbsp;Studio的Software&nbsp;Framework添加向导增加了Power&nbsp;Manager驱动模块以后,系统&nbsp;

会自动在DRIVERS模块下增加一个PM文件夹,其中包含了操作AVR32&nbsp;UC3&nbsp;PM模块的底层API,我们只需要&nbsp;

在工程中增加一个&nbsp;#inlude"PM.h"&nbsp;语句,就可以获得以下函数的使用权限:&nbsp;




extern&nbsp;void&nbsp;pm_pll_setup

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;volatile&nbsp;avr32_pm_t&nbsp;*pm,&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;unsigned&nbsp;int&nbsp;pll,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//PLL编号,具体制定是PLL0还是PLL1

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;unsigned&nbsp;int&nbsp;mul,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//乘法因数,当为0时,表示不进行倍频

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;unsigned&nbsp;int&nbsp;div,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//除法因数,当为1时,表示不进行分频

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;unsigned&nbsp;int&nbsp;osc,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//PLL选择的Oscillator时钟源编号

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;unsigned&nbsp;int&nbsp;lockcount&nbsp;&nbsp;&nbsp;&nbsp;//在PLL成功锁定以后,以115KHz为频率,

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//延时指定的周期以后才设置ISR的Lockn

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//标志位。

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;);


函数说明:该函数用于设定指定编号的PLL的各项参数,并不作其他任何操作

输入参数:&AVR_PM

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;要操作的PLL编号

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;倍频倍数

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;分频

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PLL选择的Oscillator时钟源编号

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;在PLL成功的被锁定以后,设置ISR中Lockn标志位前所需要延时的Slow&nbsp;Clock周期


extern&nbsp;void&nbsp;pm_pll_set_option

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;volatile&nbsp;avr32_pm_t&nbsp;*pm,&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;unsigned&nbsp;int&nbsp;&nbsp;pll,&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;unsigned&nbsp;int&nbsp;&nbsp;pll_freq,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//PLL频率范围选择&nbsp;1&nbsp;表示80-180MHz

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//0&nbsp;表示&nbsp;160-240Mhz

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;unsigned&nbsp;int&nbsp;&nbsp;pll_div2,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//PLL输出频率是否2分频

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;unsigned&nbsp;int&nbsp;&nbsp;pll_wbwdisable&nbsp;&nbsp;&nbsp;//是否关闭Wide-Bandith模式,开启

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//该模式将获得更短的启动和锁定时间

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;);


函数说明:该函数用于设定制定PLL的某些控制属性,比如输出的频率范围,是否在输出前进行

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2分频,是否关闭Wide-Bandith模式等等。

输入参数:&AVR_PM

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;要操作的PLL编号

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pll输出频率的范围

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;是否在pll输出前进行二分频

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;是否关闭Wide-Bandith模式


extern&nbsp;unsigned&nbsp;int&nbsp;pm_pll_get_option(volatile&nbsp;avr32_pm_t&nbsp;*pm,&nbsp;unsigned&nbsp;int&nbsp;pll);

函数说明:该函数用于获取指定PLL的控制属性,比如频率范围、是否分频,是否关闭Wide-Bandith

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;等等。这些信息分别放在输出变量的BIT2、BIT1和BIT0上。

输入参数:&AVR32_PM

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;指定的PLL编号


extern&nbsp;void&nbsp;pm_pll_enable(volatile&nbsp;avr32_pm_t&nbsp;*pm,&nbsp;unsigned&nbsp;int&nbsp;pll);

函数说明:直接使能指定的PLL,并不等待ISR中的LOCKn置位

输入参数:&AVR32_PM

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;指定的PLL编号


extern&nbsp;void&nbsp;pm_pll_disable(volatile&nbsp;avr32_pm_t&nbsp;*pm,&nbsp;unsigned&nbsp;int&nbsp;pll);

函数说明:直接关闭指定的PLL

输入参数:&AVR32_PM

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;指定的PLL编号


extern&nbsp;void&nbsp;pm_wait_for_pll0_locked(volatile&nbsp;avr32_pm_t&nbsp;*pm);

函数说明:等待PLL0锁定位LOCK0被置位

输入参数:&AVR32_PM


extern&nbsp;void&nbsp;pm_wait_for_pll1_locked(volatile&nbsp;avr32_pm_t&nbsp;*pm);

函数说明:等待PLL1锁定位LOCK1被置位

输入参数:&AVR32_PM






[应用实例]


#include&nbsp;"avr32/io.h"&nbsp;

#include&nbsp;"PM.h"&nbsp;



int&nbsp;main(void)&nbsp;

{&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;volatile&nbsp;avr32_pm_t*&nbsp;pm&nbsp;=&nbsp;&AVR32_PM;&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;//使用外部的12M晶振&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;pm_enable_osc0_crystal(pm,12000000);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;//使能Oscillator,并设置startup&nbsp;time为18ms&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;pm_enable_clk0(pm,3);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;//使用PLL0连接Oscillator0产生一个60MHz的时钟,需要先产生一个大于80MHz的频率

&nbsp;&nbsp;&nbsp;&nbsp;pm_pll_setup

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pm,

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0,&nbsp;&nbsp;&nbsp;&nbsp;//PLL0

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;9,&nbsp;&nbsp;&nbsp;&nbsp;//*10

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1,&nbsp;&nbsp;&nbsp;&nbsp;//不分频

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0,&nbsp;&nbsp;&nbsp;&nbsp;//连接Oscillator0

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;16&nbsp;&nbsp;&nbsp;&nbsp;//default

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;);

&nbsp;&nbsp;&nbsp;&nbsp;//设置PLL0的属性

&nbsp;&nbsp;&nbsp;&nbsp;pm_pll_set_option

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pm,

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0,&nbsp;&nbsp;//PLL0

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0,&nbsp;&nbsp;//选择频率范围80-180MHz

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1,&nbsp;&nbsp;//输出频率2分频,获得60M的实际输出

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;//default

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;);

&nbsp;&nbsp;&nbsp;&nbsp;//使能PLL0

&nbsp;&nbsp;&nbsp;&nbsp;pm_pll_enable(pm,&nbsp;0);&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;//等待PLL0锁定

&nbsp;&nbsp;&nbsp;&nbsp;pm_wait_for_pll0_locked(pm);

&nbsp;&nbsp;&nbsp;&nbsp;


&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;0;&nbsp;

}



本贴被 Gorgon Meducer 编辑过,最后修改时间:2009-01-11,16:14:10.

出0入0汤圆

发表于 2008-11-17 17:02:59 | 显示全部楼层

>>&nbsp;外部时钟、晶振源、32.768KHz时钟源


&nbsp;&nbsp;&nbsp;&nbsp;AVR32&nbsp;UC3系列芯片有两组时钟源输入,同时还额外支持32.768KHz的实时时钟源输入。他们分别

被称为Oscillator&nbsp;0、Oscillator1和32&nbsp;KHz&nbsp;oscillator。当他们通过XIN、XOUT连接外部晶振时,通

常按照下图所示的方法进行(对32&nbsp;KHz&nbsp;Osillator来说,引脚名称是XIN32和XOUT32):



&nbsp;&nbsp;&nbsp;&nbsp;当我们使用外部时钟(Extern&nbsp;Clock)而不是晶振时,需要将外部时钟连接到XIN(XIN32)上,

此时,XOUT(XOUT32)引脚仍然可以作为普通的GPIO引脚来使用。

&nbsp;&nbsp;&nbsp;&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;对于Oscillator&nbsp;0和Oscillator&nbsp;1来说,支持的外部晶振(时钟)频率范围从450KHz~16MHz,我

们需要根据具体的频率范围使用正确数值范围的电容。


<font color=blue>Note&nbsp;1:&nbsp;These&nbsp;values&nbsp;are&nbsp;given&nbsp;only&nbsp;as&nbsp;a&nbsp;typical&nbsp;example.&nbsp;The&nbsp;capacitance&nbsp;C&nbsp;of&nbsp;the&nbsp;biasing&nbsp;capacitors&nbsp;can&nbsp;be&nbsp;computed&nbsp;based

on&nbsp;the&nbsp;crystal&nbsp;load&nbsp;capacitance&nbsp;CL&nbsp;and&nbsp;the&nbsp;internal&nbsp;capacitance&nbsp;Ci&nbsp;of&nbsp;the&nbsp;MCU&nbsp;as&nbsp;follows:

C&nbsp;=&nbsp;2&nbsp;(CL&nbsp;–&nbsp;Ci)

The&nbsp;value&nbsp;of&nbsp;CL&nbsp;can&nbsp;be&nbsp;found&nbsp;in&nbsp;the&nbsp;crystal&nbsp;datasheet&nbsp;and&nbsp;the&nbsp;value&nbsp;of&nbsp;Ci&nbsp;can&nbsp;be&nbsp;found&nbsp;in&nbsp;the&nbsp;MCU&nbsp;datasheet.

Note&nbsp;2:&nbsp;Decoupling&nbsp;capacitor&nbsp;should&nbsp;be&nbsp;placed&nbsp;as&nbsp;close&nbsp;as&nbsp;possible&nbsp;to&nbsp;each&nbsp;pin&nbsp;in&nbsp;the&nbsp;signal&nbsp;group,&nbsp;vias&nbsp;should&nbsp;be&nbsp;avoided.


这里给定的值只是一些典型例子。偏置电容的值C可以通过晶振的负载电容值CL和MCU内部的电容值Ci按照下面的公式计算获得:

C&nbsp;=&nbsp;2&nbsp;(CL&nbsp;-&nbsp;Ci)

其中,CL的值可以从晶振的数据手册上获得,Ci的值可以从MCU的数据手册上得到。

需要注意的是,退欧电容应该尽可能的靠近时钟的信号引脚以避免不必要的干扰。







[寄存器概述]


&nbsp;&nbsp;&nbsp;&nbsp;对Oscillator&nbsp;0/1来说,其控制主要包括“模式选择”,“Startup设置”和“使能”两个部分。



&nbsp;&nbsp;&nbsp;&nbsp;A、所谓的模式选择,就是通过对OSCCTRLn寄存器的MODE位进行操作,这是一个长度为3的位域,

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;总共可以表示8个不同的选项,其具体的含义如下:

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-----------------------------------------------------------------------------------------------------

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0:&nbsp;External&nbsp;clock&nbsp;connected&nbsp;on&nbsp;XIN,&nbsp;XOUT&nbsp;can&nbsp;be&nbsp;used&nbsp;as&nbsp;an&nbsp;I/O&nbsp;(no&nbsp;crystal)

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1&nbsp;to&nbsp;3:&nbsp;reserved

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;4:&nbsp;Crystal&nbsp;is&nbsp;connected&nbsp;to&nbsp;XIN/XOUT&nbsp;-&nbsp;Oscillator&nbsp;is&nbsp;used&nbsp;with&nbsp;gain&nbsp;G0&nbsp;(&nbsp;XIN&nbsp;from&nbsp;0.4&nbsp;MHz&nbsp;to&nbsp;0.9&nbsp;MHz&nbsp;).

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;5:&nbsp;Crystal&nbsp;is&nbsp;connected&nbsp;to&nbsp;XIN/XOUT&nbsp;-&nbsp;Oscillator&nbsp;is&nbsp;used&nbsp;with&nbsp;gain&nbsp;G1&nbsp;(&nbsp;XIN&nbsp;from&nbsp;0.9&nbsp;MHz&nbsp;to&nbsp;3.0&nbsp;MHz&nbsp;).

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;6:&nbsp;Crystal&nbsp;is&nbsp;connected&nbsp;to&nbsp;XIN/XOUT&nbsp;-&nbsp;Oscillator&nbsp;is&nbsp;used&nbsp;with&nbsp;gain&nbsp;G2&nbsp;(&nbsp;XIN&nbsp;from&nbsp;3.0&nbsp;MHz&nbsp;to&nbsp;8.0&nbsp;MHz&nbsp;).

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;7:&nbsp;Crystal&nbsp;is&nbsp;connected&nbsp;to&nbsp;XIN/XOUT&nbsp;-&nbsp;Oscillator&nbsp;is&nbsp;used&nbsp;with&nbsp;gain&nbsp;G3&nbsp;(&nbsp;XIN&nbsp;from&nbsp;8.0&nbsp;Mhz).

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-----------------------------------------------------------------------------------------------------



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;B、所谓的Startup设置,就是选择外部晶振的启动时间,对于外部时钟来说,这一选项没有意义。

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;对启动时间的选择设置,也是通过寄存器OSCCTRLn进行的。STARTUP也是一个长度为3的位域,

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;总共可以表示8个不同的选项,其具体含义如下表所示:



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;C、在上述的设置都已经完成(或者明确不用重新设置)以后,可以通过对MCCTRL寄存器中的OSCnEN

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;进行置位,以使能编号n所指示的晶振(外部时钟)。



&nbsp;&nbsp;&nbsp;&nbsp;对32KHz&nbsp;Oscillator的设置与Oscillator&nbsp;0/1的内容类似,只不过所要设置的内容都集中在寄存器

OSCCTRL32中,包括“模式选择”、“Startup&nbsp;time设置”和使能。



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;A、模式选择对应OSCCTRL32寄存器的MODE位,这是一个长度为3的位域,实际有效的模式只有2个,

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;他们分别是:

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-----------------------------------------------------------------------------------

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;External&nbsp;clock&nbsp;connected&nbsp;on&nbsp;XIN32,&nbsp;XOUT32&nbsp;can&nbsp;be&nbsp;used&nbsp;as&nbsp;a&nbsp;I/O&nbsp;(no&nbsp;crystal)

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Crystal&nbsp;is&nbsp;connected&nbsp;to&nbsp;XIN32/XOUT32

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2&nbsp;to&nbsp;7:&nbsp;reserved

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-----------------------------------------------------------------------------------



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;B、Startup设置对应寄存器OSCCTRL32的STARTUP位,这是一个长度为3的位域,可以表示8个不同的

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;选项,其具体含义如下表所示:



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;C、在上述的设置都已经完成(或者明确不用重新设置)以后,可以通过对OSCCTRL32的OSC32EN位

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;置位,以使能32K&nbsp;Hz&nbsp;晶振(外部时钟)。



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;当Oscillator&nbsp;0/1以及32KHz&nbsp;Oscillator在使能以后,都要经过startup所设置的时间才能正常工

作,在此期间寄存器POSCSR的OSCnRDY会被自动置位,直到Oscillator&nbsp;0/1正常工作以后,该标志位将

自动被清零。每次使能Oscillator以后,我们都应该仔细检查该标志位的状态,以决定是否进行下一步

的相关操作。对于32KHz&nbsp;Oscillator来说,相同功能的标志位位于寄存器POSCSR中,名为OSC32RDY。





[Software&nbsp;Framework&nbsp;的使用]


&nbsp;&nbsp;&nbsp;&nbsp;当我们通过AVR32&nbsp;Studio的Software&nbsp;Framework添加向导增加了Power&nbsp;Manager驱动模块以后,系统

会自动在DRIVERS模块下增加一个PM文件夹,其中包含了操作AVR32&nbsp;UC3&nbsp;PM模块的底层API,我们只需要

在工程中增加一个&nbsp;#inlude"PM.h"&nbsp;语句,就可以获得以下函数的使用权限:




Osillator&nbsp;0


extern&nbsp;void&nbsp;pm_enable_osc0_ext_clock(volatile&nbsp;avr32_pm_t&nbsp;*pm);

功能说明:该函数将&nbsp;Oscillator&nbsp;0&nbsp;的工作模式设置为外部时钟,此时XIN引脚应该连接外部时钟的输出端,而

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;XOUT则不用特殊处理——它已经还原为普通的GPIO了。

输入参数:&AVR32_PM,也就是Power&nbsp;Manager寄存器文件的首地址,AVR32_PM是一个地址常量,由UTILS\

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;AVR32_HEADER_FILES\avr32目录中,具体的器件头文件来定义,比如uc3b0256.h中,关于

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;AVR32_PM的定义如下:

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#define&nbsp;AVR32_PM_ADDRESS&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0xFFFF0C00

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#define&nbsp;AVR32_PM&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(*((volatile&nbsp;avr32_pm_t*)AVR32_PM_ADDRESS))&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;


extern&nbsp;void&nbsp;pm_enable_osc0_crystal(volatile&nbsp;avr32_pm_t&nbsp;*pm,&nbsp;unsigned&nbsp;int&nbsp;fosc0);

功能说明:该函数将&nbsp;Oscillator&nbsp;0的工作模式设置为外部晶振,并告知系统实际使用的晶振频率大小,

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;根据这一数据,系统会自动选择对应的外部晶振模式。此时XIN和XOUT引脚都应该配合正确

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;的电容连接在外晶振的引脚上。

输入参数:&AVR32_PM

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;实际使用的外晶振频率


extern&nbsp;void&nbsp;pm_enable_clk0(volatile&nbsp;avr32_pm_t&nbsp;*pm,&nbsp;unsigned&nbsp;int&nbsp;startup);

功能说明:该函数将首先设置Oscillator&nbsp;0的startup&nbsp;time,并使能Oscillator&nbsp;0

输入参数:&AVR32_PM

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;startup&nbsp;time设置,其范围只能是&nbsp;0~7


extern&nbsp;void&nbsp;pm_disable_clk0(volatile&nbsp;avr32_pm_t&nbsp;*pm);

功能说明:该函数将关闭Oscillator&nbsp;0。

输入参数:&AVR32_PM


extern&nbsp;void&nbsp;pm_enable_clk0_no_wait(volatile&nbsp;avr32_pm_t&nbsp;*pm,&nbsp;unsigned&nbsp;int&nbsp;startup);

功能说明:该函数功能和pm_enable_clk0相同,只不过,他并不像pm_enable_clk0那样负责——一直

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;等到Oscillator&nbsp;0启动成功正式生效以后才离开函数,他是并不进行任何等待的。

输入参数:&AVR32_PM

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;startup&nbsp;time设置,其范围只能是&nbsp;0~7


extern&nbsp;void&nbsp;pm_wait_for_clk0_ready(volatile&nbsp;avr32_pm_t&nbsp;*pm);

功能说明:该函数用于确认当前的Oscillator&nbsp;0是正常工作,时钟源是有效的。当Oscillator&nbsp;0处于

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;内部新参数生效的调整状态时,该函数将一直等待,直到该过程完成。一个典型的例子:

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pm_enable_clk0函数实际上是pm_enable_clk0_no_wait和

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;extern&nbsp;void&nbsp;pm_wait_for_clk0_ready的整合

输入参数:&AVR32_PM




Oscillator&nbsp;1&nbsp;&nbsp;相关设置请参考Oscillator&nbsp;0


extern&nbsp;void&nbsp;pm_enable_osc1_ext_clock(volatile&nbsp;avr32_pm_t&nbsp;*pm);

extern&nbsp;void&nbsp;pm_enable_osc1_crystal(volatile&nbsp;avr32_pm_t&nbsp;*pm,&nbsp;unsigned&nbsp;int&nbsp;fosc1);

extern&nbsp;void&nbsp;pm_enable_clk1(volatile&nbsp;avr32_pm_t&nbsp;*pm,&nbsp;unsigned&nbsp;int&nbsp;startup);

extern&nbsp;void&nbsp;pm_disable_clk1(volatile&nbsp;avr32_pm_t&nbsp;*pm);

extern&nbsp;void&nbsp;pm_enable_clk1_no_wait(volatile&nbsp;avr32_pm_t&nbsp;*pm,&nbsp;unsigned&nbsp;int&nbsp;startup);

extern&nbsp;void&nbsp;pm_wait_for_clk1_ready(volatile&nbsp;avr32_pm_t&nbsp;*pm);




<font color=red>32KHz&nbsp;Oscillator
&nbsp;&nbsp;相关设置请参考Oscillator&nbsp;0


extern&nbsp;void&nbsp;pm_enable_osc32_ext_clock(volatile&nbsp;avr32_pm_t&nbsp;*pm);

extern&nbsp;void&nbsp;pm_enable_osc32_crystal(volatile&nbsp;avr32_pm_t&nbsp;*pm);

extern&nbsp;void&nbsp;pm_enable_clk32(volatile&nbsp;avr32_pm_t&nbsp;*pm,&nbsp;unsigned&nbsp;int&nbsp;startup);

extern&nbsp;void&nbsp;pm_disable_clk32(volatile&nbsp;avr32_pm_t&nbsp;*pm);

extern&nbsp;void&nbsp;pm_enable_clk32_no_wait(volatile&nbsp;avr32_pm_t&nbsp;*pm,&nbsp;unsigned&nbsp;int&nbsp;startup);

extern&nbsp;void&nbsp;pm_wait_for_clk32_ready(volatile&nbsp;avr32_pm_t&nbsp;*pm);




[应用实例]


#include&nbsp;"avr32/io.h"

#include&nbsp;"PM.h"



int&nbsp;main(void)

{

&nbsp;&nbsp;&nbsp;&nbsp;volatile&nbsp;avr32_pm_t*&nbsp;pm&nbsp;=&nbsp;&AVR32_PM;

&nbsp;&nbsp;&nbsp;&nbsp;//使用外部的12M晶振

&nbsp;&nbsp;&nbsp;&nbsp;pm_enable_osc0_crystal(pm,12000000);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;//使能Oscillator,并设置startup&nbsp;time为18ms

&nbsp;&nbsp;&nbsp;&nbsp;pm_enable_clk0(pm,3);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;0;

}

本贴被 Gorgon Meducer 编辑过,最后修改时间:2008-11-19,12:08:11.

出0入0汤圆

发表于 2009-5-13 09:55:50 | 显示全部楼层
最近接触AVR32,PM部分涉及的内容比较宽,玩不好PM就玩不转AVR32也不言过其实。今天把这么好的帖子应该置顶,期待傻孩子逐步完善这部分,对初学者非常有益。傻孩子辛苦了。

出0入0汤圆

发表于 2009-5-13 11:04:34 | 显示全部楼层
To: Gorgon Meducer 傻孩子
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
pm_pll_set_option  
        (  
            pm,  
            0,  //PLL0  
            0,  //选择频率范围80-180MHz  
            1,  //输出频率2分频,获得60M的实际输出  
            0   //default  

&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
上述例程中关于pll属性选择频率范围的说明是不是应该在160-240MHz之间?

另外,GCLK使用PLL1倍频的话,用96MHz,对于EMI应该有好处。

int main(void)
{
  volatile avr32_pm_t* pm = &AVR32_PM;
  pm_enable_osc0_crystal(pm,12000000);
  pm_enable_clk0(pm,3);

  pm_pll_setup
  (
           pm,
           1,
           7,  //
           1,
           0,
           16
  );
  pm_pll_set_option
  (
                pm,
                1,
                1,
                0,
                0
        );
  pm_pll_enable(pm,1);
  pm_wait_for_pll1_locked(pm);

  pm_gc_setup
  (
                  pm,
                  0,
                  1,
                  1,
                  1,
                  5  //GCLK0 输出8MHz方波
        );
  pm_gc_enable(pm,0);
pm_gc_setup
  (
                  pm,
                  4,
                  1,
                  1,
                  1,
                  0  //USB GCLK 输出48MHz时钟

        );

  pm_gc_enable(pm,4);

  gpio_enable_module_pin(3, 1);

  while(1);
}

出0入0汤圆

发表于 2009-5-13 11:22:38 | 显示全部楼层
请教傻孩子一个问题;

USBB的普通时钟通道编号是3还是4?

出0入296汤圆

 楼主| 发表于 2009-5-13 12:31:38 | 显示全部楼层
这具体要看数据手册,在数据手册Power manager 的Generic clock implementation章节
有一张表叫做Generic clock allocation。

出0入0汤圆

发表于 2009-5-13 16:57:37 | 显示全部楼层
谢谢,我就是确认数据手册Power manager 的Generic clock implementation章节
表Generic clock allocation。是3才提出这个问题.用的是AT32B0256.

B系列的USBB的普通时钟通道编号是3,
A系列的USBB的普通时钟通道编号是4.

问题问得有问题哈......再次谢过!

出0入0汤圆

发表于 2009-6-1 11:17:36 | 显示全部楼层
还真玩不转这个PM  晕~~~

出0入296汤圆

 楼主| 发表于 2009-6-1 13:31:22 | 显示全部楼层
具体遇到什么问题了呢?

出0入0汤圆

发表于 2009-6-1 20:09:05 | 显示全部楼层
TO:傻孩子
    具体问题是示波器有故障,一直测不准~~~晕死我了~~~
换了个示波器,问题已经解决~~~内容整理的很全面,爱死你了呵呵~~~

出0入0汤圆

发表于 2009-10-10 22:18:18 | 显示全部楼层
请问傻孩子  我的程序原先没有更改任何与PM有关的寄存器(根据数据手册上理解应该是接到内部低速RC震荡),但是我在程序中加了   
    volatile avr32_pm_t* pm = &AVR32_PM;
    //使用外部的12M晶振
    pm_enable_osc0_crystal(pm,12000000);            
    //使能Oscillator,并设置startup time为18ms
    pm_enable_clk0(pm,3);   

后,感觉运行速度和原来的一样(通过流水灯观察),时钟不是转换到外部的12M晶振了么(我使用的是ourdev的小板)这是什么原因呢?

出0入296汤圆

 楼主| 发表于 2009-10-11 18:59:45 | 显示全部楼层
pm_enable_osc0_crystal(pm,12000000);
的作用只是使能osc0,但是你并没有指定系统使用osc0作为系统时钟啊。相关内容,请参考
四大时钟域章节。

出0入0汤圆

发表于 2009-10-12 16:25:38 | 显示全部楼层
恩恩。。。不好意思,太急了没有看完就。。。。

出0入0汤圆

发表于 2009-11-25 20:54:24 | 显示全部楼层
好帖子 顶起来~

出0入0汤圆

发表于 2009-11-25 22:04:30 | 显示全部楼层
为什么傻孩子不把 ID为Gorgon的帖子删除了?

我看这么一大串本来就头疼了

还给我搞重复 更晕~~~~~~~~

出0入0汤圆

发表于 2009-11-25 22:40:38 | 显示全部楼层
看起来和freescale的比较相似

出0入0汤圆

发表于 2009-11-27 20:16:47 | 显示全部楼层
TO  Mr 傻孩子:

  第三楼的Framwork应用中  有两个地方参数写错了   &AVR_PM应该是&AVR32_PM 吧?



(原文件名:mmmm.jpg)

出0入0汤圆

发表于 2009-12-15 16:19:02 | 显示全部楼层
呵呵,顶起来

出0入0汤圆

发表于 2010-3-5 21:00:42 | 显示全部楼层
傻孩子,看了你的PM讲解后请教你一个问题。

UC3B0XXX不知道你有没有碰到过OSC1上11.2896MHz的晶振,乘以10以后,给PLL0不工作。

不知道你有没有做这方面的测试,我的EVK1101上面的是芯片ES版的,换了芯片后,用11.2896M的OSC1倍频到PLL0会死掉。

不知道是我的倍数关系设置不合理,还是板子问题。

ouravr的板子ok,osc1使用11.2896Mhz时钟正常。

出0入296汤圆

 楼主| 发表于 2010-3-5 23:42:43 | 显示全部楼层
可能和ES有关系……
当然,你检查过设置么?

ES和普通芯片的Framework很多地方不是通用的……

出0入0汤圆

发表于 2010-3-8 14:30:59 | 显示全部楼层
EVK1101自带是ES的芯片,换了非ES的芯片,依旧有这个问题,现在怀疑是板子的问题。在ouravr的板子上跑起来以后就没有理这个啦。
就怕后续自己做板的时候又遇到这个问题。

出0入296汤圆

 楼主| 发表于 2010-3-8 14:55:11 | 显示全部楼层
嗯……你可以发一个邮件到avr32.cn@atmel.com
仔细问问AVR32芯片时钟电路的注意事项。

他们会很快回复你的。可以用中文哈。

出0入0汤圆

发表于 2010-6-30 16:42:00 | 显示全部楼层
好贴,顶起来!这样程序看起来就快多了!
  为什么傻孩子不叫啊莫把ID为Gorgon的帖子全部删除?这么一大串重复确实是很头疼了!
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-8 05:16

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表