16回答

0收藏

【SAMV71精讲精练系列】1、时钟配置

 

其他 其他 8948 人阅读 | 16 人回复 | 2015-11-14

本帖最后由 _烟酒僧_ 于 2015-11-14 01:37 编辑

拿到ARM7这块开发板有些日子了。因为公务繁忙,加之手头项目,以及替网站写些评测文章之类,
有些耽搁。后续的时间会陆续补充上来;

ARM7是爱特梅尔的新品,手头这块开发板也是市面上的稀有物,首先得感谢一下爱板网!
市面上,拿这个芯片来做产品的估计还不多,但是相信关注它的人却不在少数。

首先,谈谈自己的一点心得。对搞电子的来说,无论你的理论多么的深厚,最终还是需要
要以尽快地做出好的产品为最终的目的。
因此对一个新片子的学习,有时候不必纠结于某个细节而惶惶不可终日,否则,只能是
信心受挫,而学习进展缓慢。
因此,大可没必要对手册逐字翻译,死磨烂泡(重要细节需要反复研读),以免事倍功半。

以上是个人一些浅见,与君共勉。

开始步入正题,首先解析如下函数
static inline uint32_t sysclk_get_main_hz(void)
{
#if (defined CONFIG_SYSCLK_DEFAULT_RETURNS_SLOW_OSC)
        if (!sysclk_initialized ) {
                return OSC_MAINCK_4M_RC_HZ;
        }
#endif

        /* Config system clock setting */
        if (CONFIG_SYSCLK_SOURCE == SYSCLK_SRC_SLCK_RC) {
                return OSC_SLCK_32K_RC_HZ;
        } else if (CONFIG_SYSCLK_SOURCE == SYSCLK_SRC_SLCK_XTAL) {
                return OSC_SLCK_32K_XTAL_HZ;
        } else if (CONFIG_SYSCLK_SOURCE == SYSCLK_SRC_SLCK_BYPASS) {
                return OSC_SLCK_32K_BYPASS_HZ;
        } else if (CONFIG_SYSCLK_SOURCE == SYSCLK_SRC_MAINCK_4M_RC) {
                return OSC_MAINCK_4M_RC_HZ;
        } else if (CONFIG_SYSCLK_SOURCE == SYSCLK_SRC_MAINCK_8M_RC) {
                return OSC_MAINCK_8M_RC_HZ;
        } else if (CONFIG_SYSCLK_SOURCE == SYSCLK_SRC_MAINCK_12M_RC) {
                return OSC_MAINCK_12M_RC_HZ;
        } else if (CONFIG_SYSCLK_SOURCE == SYSCLK_SRC_MAINCK_XTAL) {
                return OSC_MAINCK_XTAL_HZ;
        } else if (CONFIG_SYSCLK_SOURCE == SYSCLK_SRC_MAINCK_BYPASS) {
                return OSC_MAINCK_BYPASS_HZ;
        }
#ifdef CONFIG_PLL0_SOURCE
        else if (CONFIG_SYSCLK_SOURCE == SYSCLK_SRC_PLLACK) {
                return pll_get_default_rate(0);
        }
#endif

#ifdef CONFIG_PLL1_SOURCE
        else if (CONFIG_SYSCLK_SOURCE == SYSCLK_SRC_UPLLCK) {
                return PLL_UPLL_HZ;
        }
#endif
        else {
                /* unhandled_case(CONFIG_SYSCLK_SOURCE); */
                return 0;
        }
}
static inline uint32_t sysclk_get_cpu_hz(void)
{
        /* CONFIG_SYSCLK_PRES is the register value for setting the expected */
        /* prescaler, not an immediate value. */
        return sysclk_get_main_hz() /
                ((CONFIG_SYSCLK_PRES == SYSCLK_PRES_3) ? 3 :
                        (1 << (CONFIG_SYSCLK_PRES >> PMC_MCKR_PRES_Pos)));
}
代码的风格非常不错,结构清晰,可谓是一目了然。

阅读程序可以清晰地发现,CPU时钟是由主时钟,通过寄存器设置分频过来的,
其实还有一个概念,叫外设时钟,三者的关系是,
主时钟>=CPU时钟>=外设时钟

下面我们通过程序仿真来测试上面的结论,


仿真的结果完全符合我在配置文件中,所做的时钟配置,也符合上面阐述的结论!


在程序中,我设置了3个全局变量,分别用来获取主时钟、CPU时钟和外设时钟
的频率,另外,自定义的延时程序,也可以测试,实际的频率值是否符合预期。


下面,贴出来全部的测试程序,供大家参考
游客,如果您要查看本帖隐藏内容请回复



总结一下,使用官方库函数,不是死板地机械套用,我们可以通过查看函数体
来详细了解其中的细节,知其然也知其所以然。阅读代码,是一种重要的能力,
通过阅读官方库代码,可以学习高手的长处和优良风格,以及环环相扣的缜密
思维。






















































































-认真做事的人最可爱-
-想学习和交流技术的同行可以进我的群-
-单片机嵌入式技术群 162388414-
分享到:
回复

使用道具 举报

回答|共 16 个

倒序浏览

沙发

wfnic

发表于 2015-11-14 07:48:04 | 只看该作者

_烟酒僧_出品必须精品
板凳

_烟酒僧_

发表于 2015-11-14 08:20:35 | 只看该作者

wfnic 发表于 2015-11-14 07:48
_烟酒僧_出品必须精品

真心抬爱了  ,只是督促自己学习学习

-认真做事的人最可爱-
-想学习和交流技术的同行可以进我的群-
-单片机嵌入式技术群 162388414-
地板

_LX_

发表于 2016-5-12 13:22:40 | 只看该作者

谢谢分享,我也在学习这款芯片
5#

hellome11

发表于 2016-5-21 20:45:51 | 只看该作者

very thanks! thanks!
6#

bigbig

发表于 2016-7-31 15:54:56 | 只看该作者

楼主你好,我最近在学习Atmel SAME70开发板,写了一个程序发现延时函数不好用,显示错误       
recipe for target 'src/ASF/common/services/delay/sam/cycle_counter.o' failed
。开始以为是自己的错误,但是打开一个ASF例子还是会出现这个错误,可以帮我看一下么
7#

chaoying

发表于 2016-9-13 23:04:23 | 只看该作者

最讨厌回复可见。僧僧
8#

kunchen

发表于 2017-1-6 09:23:19 | 只看该作者

前来学习学习!
9#

at89c51cc01

发表于 2017-5-12 15:58:40 | 只看该作者

时钟是cpu运行的根本
您需要登录后才可以回帖 注册/登录

本版积分规则

关闭

站长推荐上一条 /3 下一条