查看: 7613|回复: 16

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

  [复制链接]
  • TA的每日心情
    开心
    2016-3-22 09:25
  • 签到天数: 115 天

    连续签到: 1 天

    [LV.6]常住居民II

    发表于 2015-11-14 00:19:55 | 显示全部楼层 |阅读模式
    分享到:
    本帖最后由 _烟酒僧_ 于 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时钟>=外设时钟

    下面我们通过程序仿真来测试上面的结论,
    QQ截图20151114011437.png

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


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


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



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





















































































    回复

    使用道具 举报

  • TA的每日心情
    擦汗
    2015-11-14 06:57
  • 签到天数: 382 天

    连续签到: 1 天

    [LV.9]以坛为家II

    发表于 2015-11-14 07:48:04 | 显示全部楼层
    _烟酒僧_出品必须精品
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2016-3-22 09:25
  • 签到天数: 115 天

    连续签到: 1 天

    [LV.6]常住居民II

     楼主| 发表于 2015-11-14 08:20:35 | 显示全部楼层
    wfnic 发表于 2015-11-14 07:48
    _烟酒僧_出品必须精品

    真心抬爱了  ,只是督促自己学习学习
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    发表于 2016-5-12 13:22:40 | 显示全部楼层
    谢谢分享,我也在学习这款芯片
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    发表于 2016-5-21 20:45:51 | 显示全部楼层
    very thanks! thanks!
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    发表于 2016-7-31 15:54:56 | 显示全部楼层
    楼主你好,我最近在学习Atmel SAME70开发板,写了一个程序发现延时函数不好用,显示错误       
    recipe for target 'src/ASF/common/services/delay/sam/cycle_counter.o' failed
    。开始以为是自己的错误,但是打开一个ASF例子还是会出现这个错误,可以帮我看一下么
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    无聊
    2016-2-16 22:03
  • 签到天数: 6 天

    连续签到: 1 天

    [LV.2]偶尔看看I

    发表于 2016-9-13 23:04:23 | 显示全部楼层
    最讨厌回复可见。僧僧
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2022-6-30 09:25
  • 签到天数: 199 天

    连续签到: 1 天

    [LV.7]常住居民III

    发表于 2017-1-6 09:23:19 | 显示全部楼层
    前来学习学习!
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    发表于 2017-5-12 15:58:40 | 显示全部楼层
    时钟是cpu运行的根本
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

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

    手机版|小黑屋|与非网

    GMT+8, 2024-12-20 00:53 , Processed in 0.208234 second(s), 33 queries , MemCache On.

    ICP经营许可证 苏B2-20140176  苏ICP备14012660号-2   苏州灵动帧格网络科技有限公司 版权所有.

    苏公网安备 32059002001037号

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.