查看: 1332|回复: 0

[评测分享] 【NXP OKdo E1双核Cortex M33开发板】试用4-时钟分析和定时器

[复制链接]
  • TA的每日心情
    无聊
    昨天 15:14
  • 签到天数: 2192 天

    连续签到: 1 天

    [LV.Master]伴坛终老

    发表于 2020-11-9 08:15:06 | 显示全部楼层 |阅读模式
    分享到:
    在上一篇中,我们创建了一个基础工程定点亮了LED灯,但是系统时钟我们并没有过多关注,这一篇中我们来研究一下系统时钟。首先了解一下LPC55S6x的最大时钟频率,在其产品手册中有相关描述。
    4001.png
    LPC55S69的器件分为两个版本,在早期的OA版本中,最高频率支持到100MHz,这也是所有早期资料中所描述的最高频率,但是在器件版本迭代到1B之后,最高频率就可以达到150MHz了。
    4002.png
    我们可以看看OKdo E1开发板上所用MCU器件的版本号,这里明显表明了为1B版本,所以开发板支持的最高频率可以达到150MHz没有问题。
    4003.png
    我们在看OKdo官网对于开发板的描述中可以了解到,使用内部PLL,可以支持到100MHz主频,如果使用外部16MHz或者32MHz晶振,可以达到全速150MHz(实际上使用内部晶振也是可以达到150MHz的),因为开发板上虽然设计了晶振,但是没有焊接,所以我们使用内部PLL来设置主频就可以了。
    4004.png
    首先我们看一下上一篇中使用的频率是多少,在主函数的BOARD_InitBootClocks函数上右击,点击Open Declaration。
    4005.png
    编译器打开了clock_config.c,里面有函数调用关系,最终调用了BOARD_BootClockRUN函数,在该函数中进行了时钟设置,最后一行代码系统时钟被设置为12MHz,也就是说我们上一篇的工程使用的是12MHz的系统时钟。
    4006.png
    接下来我们把主频设置到96MHz。点击配置工具下拉菜单,打开时钟。
    4007.png
    点击时钟显示图标签页,可以看到LPC55S69的时钟树还是很复杂的,默认是上一次使用的12MHz频率,点击"ANACTRL"虚框,在右侧会出现组件详情,在FRO_HF下的FRO_96M默认是disable的,我们点击下拉,选择Enable,内部96MHz的时钟源被使能。
    4008.png
    沿着时钟树走向找到MAINCLKSELA,点击,在右侧属性框下拉,选择"FRO_96 MHz clock",这样在输出系统时钟之前的部分都是96MHz了,如果不是,修改设置使其都设置为96MHz即可。但是此时System clock还是12MHz,并提示设置有错误。
    4009.png
    点击System clock部分,在右侧详情窗口修改System Clock为96MHz,这样系统时钟就设置完成了。
    4010.png
    点击更新源代码。
    4011.png
    会有更新源文件提醒,我们可以从中看到那些文件被修改了。点击确定即可。
    4012.png
    此时返回代码编辑界面,我们可以看到clock_config.c文件中时钟初始化时都是按照96MHz进行配置了,并且最终的系统时钟变量被赋值为96M.
    4013.gif
    此时我们重新编译并下载程序到开发板,可以看到开发板的灯亮灭交替的速度快了很多,理论上应该是8倍左右,因为我们把主频从12MHz更改到了96MHz,主频增高到原来的8倍,LED灯的交替速度也应该增加到8倍。
    4014.png
    此时我们返回源代码,把if语句中的100000修改为800000,再次下载程序到开发板,会发现LED的闪烁速度恢复到了之前12MHz时的速度了。
    在Arm的Cortex M系列内核中,都会有一个SysTick定时器,一般用来给OS提供时基,这里我们使用该定时器实现一个可以自定义的延时,这样我们就可以让LED灯按照我们自定义的要求实现任意频率的翻转了。
    该定时器实现起来非常简单。主要是通过代码来实现。
    4015.png
    其实现原理也比较简单,主要是设置一个全局变量,在调用延时函数的时候给全局变量一个数值,设置systick为1ms产生一次中断,在中断处理函数中去累减全局变量,延时函数则等待全局变量累减到0,延时结束。这里设置延时0.1秒进行LED的翻转。
    4016.gif
    下载到开发板上后可以发现,led大致是按照每秒五次亮灭进行翻转的。
    在笔者写完此文后,又抽时间研究了一下时钟树,发现使用内部晶振也是可以达到150MHz主频的。
    4017.png
    在时钟显示图中的PLL0 Mode下拉框选择Normal,在PLLCLKSEL处单击鼠标选中,右侧PLL0 clock select 处选择 FRO 12 MHz clock。
    4018.png
    在PLL0框中设置频率系数为“/4*100”,在PLL0_PDEC处设置系数为"/2",这样PLL0就达到150MHz了。然后在MAINCLKSELB设置主时钟为PLL0_clock即可是的系统时钟达到150MHz。
    4019.png
    此时更新完代码后返回clock_config.c中,可以看到系统时钟被初始化为150MHz了。


    回复

    使用道具 举报

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

    本版积分规则

    关闭

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

    手机版|小黑屋|与非网

    GMT+8, 2024-11-23 17:02 , Processed in 0.122291 second(s), 17 queries , MemCache On.

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

    苏公网安备 32059002001037号

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.