[牛人杂谈] 时钟控制器

[复制链接]
 楼主| wahahaheihei 发表于 2016-7-7 21:59 | 显示全部楼层 |阅读模式
概述
时钟控制器为整个芯片提供时钟, 包括系统时钟和所有外设时钟。时钟控制器还利用独立的时钟
ON/OFF 控 制 、 时 钟 源 选 择 和 时 钟 分 频 器 , 实 现 电 源 控 制 功 能 。 在 CPU 置 位 掉 电 使 能 位
PWR_DOWN_EN (PWRCON[7])和PD_WAIT_CPU (PWRCON[8])且Cortex-M0执行WFI指令之后,芯
片会进入掉电模式,在那之后,芯片等待唤醒中断源被触发以离开掉电模式。 在掉电模式下, 时钟控制
器关闭外部4~24 MHz高速晶振(HXT)和内部22.1184MHz高速振荡器(HIRC),以降低整个系统的功耗。
下图显示时钟发生器和时钟源控制。
时钟发生器由如下4个时钟源组成:
 一个外部 4~24 MHz 高速晶振(HXT)
 一个内部 22.1184 MHz RC高速振荡器(HIRC)
 一个可编程的 PLL FOUT(PLL时钟源可以选择外部4~24MHz高速晶振(HXT)或者内部
22.1184MHz (HIRC)高速振荡器) (PLL FOUT)
 一个内部 10KHz 低速振荡器(LIRC)

QQ截图20160707215723.png
 楼主| wahahaheihei 发表于 2016-7-7 22:00 | 显示全部楼层
根据上面的时钟发生器图,我们可以知道如何生成时钟信号。这是信号源的问题,那么这些信号发生器一共可以输出思路时钟源,分别的频率是可以不同的。后面怎么用呢?
 楼主| wahahaheihei 发表于 2016-7-7 22:01 | 显示全部楼层
 楼主| wahahaheihei 发表于 2016-7-7 22:04 | 显示全部楼层
我们根据上图,可知道,时钟源发生器输出的时钟源信号是多路的,且同时经过一个选择器输送给各个模块,我们可以通过控制选择器来达到给每个模块驱动时钟信号的选择问题。
 楼主| wahahaheihei 发表于 2016-7-7 22:22 | 显示全部楼层
我们就看看时钟的配置,对照上面的图形很容易理解了。
  1. /*---------------------------------------------------------------------------------------------------------*/
  2.     /* Init System Clock                                                                                       */
  3.     /*---------------------------------------------------------------------------------------------------------*/

  4.     /* Enable Internal RC 22.1184MHz clock */
  5.     CLK_EnableXtalRC(CLK_PWRCON_OSC22M_EN_Msk);

  6.     /* Waiting for Internal RC clock ready */
  7.     CLK_WaitClockReady(CLK_CLKSTATUS_OSC22M_STB_Msk);

  8.     /* Switch HCLK clock source to Internal RC and HCLK source divide 1 */
  9.     CLK_SetHCLK(CLK_CLKSEL0_HCLK_S_HIRC, CLK_CLKDIV_HCLK(1));

  10.     /* Enable external XTAL 12MHz clock */
  11.     CLK_EnableXtalRC(CLK_PWRCON_XTL12M_EN_Msk);

  12.     /* Waiting for external XTAL clock ready */
  13.     CLK_WaitClockReady(CLK_CLKSTATUS_XTL12M_STB_Msk);

  14.     /* Set core clock as PLL_CLOCK from PLL */
  15.     CLK_SetCoreClock(PLL_CLOCK);

  16.     /* Enable UART module clock */
  17.     CLK_EnableModuleClock(UART0_MODULE);

  18.     /* Enable ADC module clock */
  19.     CLK_EnableModuleClock(ADC_MODULE);

  20.     /* Select UART module clock source */
  21.     CLK_SetModuleClock(UART0_MODULE, CLK_CLKSEL1_UART_S_PLL, CLK_CLKDIV_UART(1));

  22.     /* ADC clock source is 22.1184MHz, set divider to 7, ADC clock is 22.1184/7 MHz */
  23.     CLK_SetModuleClock(ADC_MODULE, CLK_CLKSEL1_ADC_S_HIRC, CLK_CLKDIV_ADC(7));


643757107 发表于 2016-7-9 12:13 | 显示全部楼层
新唐的时钟系统比STM32的清晰明了多了,很容易使用
Roderman_z 发表于 2016-7-9 20:43 | 显示全部楼层
能详细介绍下用usb,用spi等外设的时候,如何分频呢
 楼主| wahahaheihei 发表于 2016-7-9 22:25 | 显示全部楼层
Roderman_z 发表于 2016-7-9 20:43
能详细介绍下用usb,用spi等外设的时候,如何分频呢

你想知道怎么用,需要倒推,
这里以SPI的为例,我们从图上可以看到
SPI可以由PLL提供时钟也可以由HCLK提供
如果以HCLK提供,则选择器CLKSEL1对应位==1
而HCLK由HCLK_N来分频。
 楼主| wahahaheihei 发表于 2016-7-9 23:06 | 显示全部楼层

/* Switch HCLK clock source to HXT and HCLK source divide 1,这里是配置HCLK的分频,其实就在这里间接完成的SPI时钟源分频 */
    CLK_SetHCLK(CLK_CLKSEL0_HCLK_S_HXT, CLK_CLKDIV_HCLK(1));
/* Select HCLK as the clock source of SPI0,抓哟看这里,这里选择的就是HCLK */
    CLK_SetModuleClock(SPI0_MODULE, CLK_CLKSEL1_SPI0_S_HCLK, MODULE_NoMsk);


    /* Enable SPI0 peripheral clock */
    CLK_EnableModuleClock(SPI0_MODULE);

而下面的就是使用刚才配置好的时钟来初始化SPI的功能了,使用哪个接口,SPI0还是SPI1,什么形式,主机还是从级,还有时钟频率。

void SPI_Init(void)
{
    /*---------------------------------------------------------------------------------------------------------*/
    /* Init SPI                                                                                                */
    /*---------------------------------------------------------------------------------------------------------*/
    /* Configure as a master, clock idle low, 32-bit transaction, drive output on falling clock edge and latch input on rising edge. */
    /* Set IP clock divider. SPI clock rate = 2MHz */
    SPI_Open(SPI0, SPI_MASTER, SPI_MODE_0, 32, 2000000);

    /* Enable the automatic hardware slave select function. Select the SS pin and configure as low-active. */
    SPI_EnableAutoSS(SPI0, SPI_SS, SPI_SS_ACTIVE_LOW);
}

ccw1986 发表于 2016-7-11 12:52 | 显示全部楼层
时钟控制器就是用来进行倍频分频的吧
天灵灵地灵灵 发表于 2016-7-12 11:28 | 显示全部楼层
结构比STM32简单多了,应该很好用。
天灵灵地灵灵 发表于 2016-7-12 11:29 | 显示全部楼层
ccw1986 发表于 2016-7-11 12:52
时钟控制器就是用来进行倍频分频的吧

应该是选择时钟源、分频用的。倍频好像是时钟发生器的事情,PLL嘛
 楼主| wahahaheihei 发表于 2016-7-13 19:11 | 显示全部楼层
如果不懂的可以对照图和头文件来比对比对。
yyglucky 发表于 2017-7-11 13:45 | 显示全部楼层
 楼主| wahahaheihei 发表于 2017-7-13 19:00 | 显示全部楼层
都说难啊,实际上看着这个图,再去弄,就简单了。
天灵灵地灵灵 发表于 2017-7-13 22:51 | 显示全部楼层
其实就是很多开关的配置。
huangcunxiake 发表于 2017-7-15 22:11 | 显示全部楼层
优先使用内部的振荡电路
zhuomuniao110 发表于 2017-7-17 20:01 | 显示全部楼层
关闭外部4~24 MHz高速晶振(HXT)和内部22.1184MHz高速振荡器(HIRC),以降低整个系统的功耗。
zhuomuniao110 发表于 2017-7-17 20:26 | 显示全部楼层
关闭外部4~24 MHz高速晶振(HXT)和内部22.1184MHz高速振荡器(HIRC),以降低整个系统的功耗。
 楼主| wahahaheihei 发表于 2017-7-18 11:50 | 显示全部楼层
学习这个系统,要懂得顺藤摸瓜的道理。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

231

主题

3196

帖子

12

粉丝
快速回复 在线客服 返回列表 返回顶部