0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

敏矽微电子Cortex-M0学习笔记03——时钟系统设计例程

jf_pJlTbmA9 来源:敏矽MCU 作者:敏矽MCU 2023-09-26 17:06 次阅读

1.1. ME32F030R8T6的时钟

时钟是MCU运行的基础,时钟信号推动单片机内各个部分执行相应的指令。时钟系统就是CPU的脉搏,决定cpu速率,像人的心跳一样 只有有了心跳,人才能做其他的事情,而MCU有了时钟,才能够运行执行指令,才能够做准确、稳定的进行一系列的操作 (例如:串口通信、PWM信号、ADC采样等等),因此时钟的重要性不言而喻。

ME32F030系列 具有非常灵活的时钟控制系统。用户可根据不同应用需求来配置时钟,从而取得最高的性能及优化的能耗管理。下图为 ME32F030R8T6 的时钟系统概要图:

wKgaomUD06mAcAziAAEXKNnAWDU432.png

从图中可以看出,MCU的时钟源有内部高速的IRC_OSC 和 低速的 WDT_OSC 时钟可供选择。

IRC_OSC:它属于高速时钟,可以由内部晶体振荡器控制寄存器(IRCCTRL)配置为 40/48MHz的主频, 缺省值是40MHz 频率,由工厂出厂预设并由引导程序写入。一般作为系统主时钟的时钟源。

WDT_OSC:它属于低速时钟,由看门狗振荡器控制寄存器控制。振荡器包含模拟和数字两部分。振荡器的模拟部分用于产生模拟时钟(Fclkana)。在振荡器数字部分,模拟时钟(Fclkana)输出一个32KHz 频率时钟。然后再被DIVSEL 控制的分频器分频输出到 WDT_CLK,作为看门狗时钟源。

看门狗振荡器输出频率可用下列公式推算:

WDT_CLK = Fclkana/(4 ×DIVSEL) = 8K Hz ~ 250 Hz (标称值)

1.2. ME32F030R8T6时钟源的应用控制

介绍完系统的时钟源,接下来说说时钟源主要运用到了哪些方面。

ME32F030R8T6的外设非常多,但我们实际使用的时候只会用到有限的几个外设,使用任何外设都需要时钟才能启动,但并不是所有的外设都需要系统时钟那么高的频率,为了兼容不同速度的设备,有些高速,有些低速,如果都用高速时钟,势必造成浪费。并且,同一个电路,时钟越快功耗越快,同时抗电磁干扰能力也就越弱,所以较为复杂的MCU都是采用多时钟源的方法来解决这些问题。

WDT_CLK:由看门狗振荡器控制寄存器来选择输入时钟,作为看门狗的工作时钟。

wKgZomUD06qAJ_kgAAC-9ZumIY4585.png

MAIN_CLK:由MAINCLK_SEL选择输入时钟源,上电默认选择IRC_OSC_CLK作为时钟源,也可以通过置位来选择WDT_OSC_CLK。

wKgaomUD06yARBUwAACTQd_G8Kk955.png

SYSTEM_CLK:由MAINCLK通过AHB 接口时钟分频器寄存器(SYSAHBCLKDIV)分频而来,默认不分频。SYSTEM_CLK时钟供内核、外设和存储器使用。其中外设通过 AHB 接口时钟控制寄存器(SYSAHBCLKCTRL)来控制外设的时钟使能,上电默认外设的时钟都是打开的。

wKgZomUD062ALSUfAACjtWFaiTo401.png

UART:UART0/1有自己独立的时钟分频器从MAIN_CLK分频后取得UART时钟。

wKgZomUD06-AfXu1AACisfjldBk872.png

CLK_OUT:MCU的内部晶振器(IRC_OSC_CLK)、看门狗振荡器(WDT_OSC_CLK),主时钟(MAIN_CLK),系统时钟(SYSTEM_CLK)都可以通过CLK_OUT作为输出时钟。

使用前需要通过 CLKOUT 输出时钟源选择寄存器 (CLKOUTCLKSEL)来确定想要输出的时钟源,再经过 CLKOUT 输出时钟分频器寄存器 (CLKOUTDIV)分频后输出,该寄存器初始值默认为0,即不输出时钟。需要输出的话,设置好分频系数(1-255)便可以输出了。

wKgaomUD07CABbg8AAChsqqvEV4946.png

wKgaomUD07GAU3zkAACcDCPHWII991.png

2、ME32F030R8T6的时钟系统函数简介

为了便于开发者快速上手,敏矽微电子为开发者提供了丰富的库函数和开发例程。

借助于库函数,可以不用像普通单片机那样去配置繁多的寄存器,从而加快开发进程。

借助于例程中,可以更深入理解寄存器配置及功能实现。

本例中,我们就借助于敏矽微电子提供的例程来简单介绍它的时钟系统的跨函数。在sys.c文件中,包含了切换系统时钟,配置时钟主频等函数,供开发者直接使用。

1.3. 主频配置函数

①、配置IRC_CLK为40M主频

voidSYS_IRCTrimto40M(void){volatileuint32_ti=0xFFFF;if(DIA->IRCTRIM!=0xFFFFFFFF)

{

SYSCON->IRCCTRL=DIA->IRCTRIM;while(i--==0);

FMC->FLASH_RDCYC=1;

SYSCON->SYSAHBCLKDIV=1;

SystemCoreClockUpdate();

}return;

}

②、配置IRC_CLK为48M主频

voidSYS_IRCTrimto48M(void){volatileuint32_ti=0xFFFF;if(DIA->IRCTRIM48!=0xFFFFFFFF)

{

SYSCON->IRCCTRL=DIA->IRCTRIM48;while(i--==0);

FMC->FLASH_RDCYC=1;


SYSCON->SYSAHBCLKDIV=1;//coreclockto48M

SystemCoreClockUpdate();

}

return;

}

1.4. 时钟源选择函数

③、选择MAIN_CLK的时钟源,可以选择IRC_CLK 或者 WATCHDOG_CLK。

voidSYS_SelectMainClkSrc(uint8_tsrc)


{

//switchmainclksource

SYSCON->MAINCLKUEN_b.ENA=1;//disablemainclkupdate

//switchmainclksourcetoSpecifyedsource

if(src==IRC_CLK)

SYSCON->MAINCLKSEL_b.SEL=0;elseif(src==WATCHDOG_CLK)

SYSCON->MAINCLKSEL_b.SEL=2;


SYSCON->MAINCLKUEN_b.ENA=0;//enablemainclkupdate

SystemCoreClockUpdate();

return;

}

④、设置AHB 接口时钟分频器的分频系数,在这里请注意,函数如果检查到当前时钟为IR_CLK且分频系数小于2,这样系统时钟SYSTEM_CLK的主频肯定大于30M, 而FLASH的擦写速度最高支持到30MHz。此时CPU时钟超过Flash的最大读取速度,这就需要插入延迟时钟,延迟时钟由 RDCYC 寄存器控制。

voidSYS_SetAHBClkDivider(uint8_tdiv)

{

//setupflashaccessspeedifSystemCoreClockisgoingtomorethan30MHz

if((SYSCON->MAINCLKSEL_b.SEL==0)  (div<2))  

 FMC->FLASH_RDCYC=1;

SYSCON->SYSAHBCLKDIV_b.DIV=div;//setupahbclockdivider

SystemCoreClockUpdate();//updateMainClockandSystemCoreClock

return;
}

//⑤、设置WDT_CLK的时钟源,可以选择IRC_CLK 或者 WATCHDOG_CLK。

voidSYS_SelectWDTClkSrc(uint8_tsrc){if(src==IRC_CLK)



SYSCON->WDTOSCCTRL_b.WDTCLKSRC=0;

elseif(src==WATCHDOG_CLK)

SYSCON->WDTOSCCTRL_b.WDTCLKSRC=1;

return;

}

//⑥、设置CLK_OUT的时钟源,可以选择IRC_CLK 、SYS_CLK、 WATCHDOG_CLK、MAIN_CLK中的一个。

voidSYS_SelectClkOutSrc(uint8_tsrc)

{switch(src)


{

caseIRC_CLK:

src=0;break;caseSYS_CLK:

src=1;break;caseWATCHDOG_CLK:

src=2;break;caseMAIN_CLK:

src=3;break;

default:return;

}

//switchclock

SYSCON->CLKOUTUEN_b.ENA=1;

SYSCON->CLKOUTCLKSEL_b.SEL=src;//selectclkoutsource

SYSCON->CLKOUTUEN_b.ENA=0;

return;

}

//⑦、设置CLK_OUT时钟的输出分频系数。

voidSYS_SetClkOutDivider(uint8_tdiv)

{

SYSCON->CLKOUTDIV_b.DIV=div;

return;}

3、ME32F030R8T6时钟系统例程

上面介绍了sys.c中关于系统时钟的部分函数,下面我们来编写一个关于时钟配置的例程。使大家能够对时钟配置有一个简单的了解。

本例实现的功能是:将AHB 接口时钟进行2分频,IRC时钟切换到48M主频,最后将系统时钟进行分频输出。

intmain(void)

{

SYS_SetAHBClkDivider(2);//AHB接口时钟进行2分频

SYS_IRCTrimto48M();//IRC时钟切换到48M主频

SYS_SelectClkOutSrc(SYS_CLK);//选择SYS_CLK作为OUT_CLK输出时钟

SYS_SetClkOutDivider(10);//对OUT_CLK时钟进行10分频

SYS_EnableClkOut();//使能OUT_CLK输出端口

}

来源:敏矽MCU

审核编辑:汤梓红
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • mcu
    mcu
    +关注

    关注

    146

    文章

    16017

    浏览量

    343627
  • adc
    adc
    +关注

    关注

    95

    文章

    5651

    浏览量

    539471
  • Cortex-M0
    +关注

    关注

    4

    文章

    122

    浏览量

    38353
  • 时钟树
    +关注

    关注

    0

    文章

    51

    浏览量

    10661
  • 时钟系统
    +关注

    关注

    1

    文章

    83

    浏览量

    11388
收藏 人收藏

    评论

    相关推荐

    cortex-M0的中文资料

    谁有cortex-M0的中文资料啊,分享一下吧,谢谢啦!!
    发表于 06-02 16:16

    ARM Cortex-M0Cortex-M0+到底有什么区别呢

    ARM Cortex-M0Cortex-M0+到底有什么区别呢
    发表于 01-04 23:15

    cortex-m0学习资料

    本帖最后由 jheng 于 2015-4-9 21:54 编辑 cortex-m0学习
    发表于 04-09 21:48

    ARM Cortex-M0权威指南(英文版)

    , 153, 153) !important]2016-2-3 13:41 上传本书是全球首本系统论述ARM Cortex-M0处理器及其编程的图书。本书既有ARM Cortex-M0处理器内核、体系结构及其
    发表于 10-08 16:46

    灵动微电子获得ARM® Cortex® -M0Cortex® -M3无限次授权

    次使用ARM® Cortex®-M0Cortex®-M3 CPU内核及IP工具包。基于该协议,灵动微电子可以在协议范围内不受授权次数限制的
    发表于 10-18 14:20

    Cortex-M0~M4的优势是什么啊?

    简述Cortex-M0~M4的各个优势
    发表于 02-22 06:57

    ARM Cortex M0的相关资料分享

    MCU学习笔记ARM Cortex M01. RM的CPU core 的基本概念2. ARM Cortex
    发表于 11-03 09:02

    ARM Cortex-M0设计启动评估用户指南

    Cortex-M0 DesignStart Eval为开发人员提供了一种简单的方法来模拟基于Cortex-M0处理器的SoC设计。 它允许系统设计人员在模拟器上进行设计和测试,然后使用FPGA进行
    发表于 08-18 07:58

    敏矽微电子Cortex-M0学习笔记08——基本定时器详解

    敏矽微电子Cortex-M0学习笔记08——基本定时器详解
    的头像 发表于 09-26 17:13 569次阅读
    敏矽<b class='flag-5'>微电子</b><b class='flag-5'>Cortex-M0</b><b class='flag-5'>学习</b><b class='flag-5'>笔记</b>08——基本定时器详解

    敏矽微电子Cortex-M0学习笔记07——串口通信详解

    敏矽微电子Cortex-M0学习笔记07——串口通信详解
    的头像 发表于 09-26 17:11 749次阅读
    敏矽<b class='flag-5'>微电子</b><b class='flag-5'>Cortex-M0</b><b class='flag-5'>学习</b><b class='flag-5'>笔记</b>07——串口通信详解

    敏矽微电子Cortex-M0学习笔记06——段式LCD液晶实例

    敏矽微电子Cortex-M0学习笔记06——段式LCD液晶实例
    的头像 发表于 09-26 17:10 458次阅读
    敏矽<b class='flag-5'>微电子</b><b class='flag-5'>Cortex-M0</b><b class='flag-5'>学习</b><b class='flag-5'>笔记</b>06——段式LCD液晶实例

    敏矽微电子Cortex-M0学习笔记05——端口外部中断实例

    敏矽微电子Cortex-M0学习笔记05——端口外部中断实例
    的头像 发表于 09-26 17:10 447次阅读
    敏矽<b class='flag-5'>微电子</b><b class='flag-5'>Cortex-M0</b><b class='flag-5'>学习</b><b class='flag-5'>笔记</b>05——端口外部中断实例

    敏矽微电子Cortex-M0学习笔记04——GPIO详解及应用实例

    敏矽微电子Cortex-M0学习笔记04——GPIO详解及应用实例
    的头像 发表于 09-26 17:07 600次阅读
    敏矽<b class='flag-5'>微电子</b><b class='flag-5'>Cortex-M0</b><b class='flag-5'>学习</b><b class='flag-5'>笔记</b>04——GPIO详解及应用实例

    敏矽微电子Cortex-M0学习笔记02——Cortex-M0开发环境的建立及调试

    敏矽微电子Cortex-M0学习笔记02——Cortex-M0开发环境的建立及调试
    的头像 发表于 09-26 17:05 1139次阅读
    敏矽<b class='flag-5'>微电子</b><b class='flag-5'>Cortex-M0</b><b class='flag-5'>学习</b><b class='flag-5'>笔记</b>02——<b class='flag-5'>Cortex-M0</b>开发环境的建立及调试

    敏矽微电子Cortex-M0学习笔记01——芯片简介

    敏矽微电子Cortex-M0学习笔记01——芯片简介
    的头像 发表于 09-26 17:03 528次阅读
    敏矽<b class='flag-5'>微电子</b><b class='flag-5'>Cortex-M0</b><b class='flag-5'>学习</b><b class='flag-5'>笔记</b>01——芯片简介