第二课 MC9S08DZ60之多功能时钟发生器S08MCGV1

1.MC9S08DZ60系统时钟分配(System Clock Distribution)

    在使用多用能时钟发生器(MCG)之前,先来了解下这款单片机的系统时钟。

    单片机的各个功能器件对命令的执行都是一步一步的进行的,每个步骤的执行都需要一个激励,这个激励就是时钟,在一定的时钟内完成给定的指令,这既是MCU工作的基本原理。可以打个不恰当的比方,MCU的时钟就如人的心脏,心脏的每一跳动,都在给全身各个功能器官输送血液养分和能量。MCU的时钟也是如此,每一个时钟跳动(震荡周期)片上资源(如ALG、SPI、IIC等)都会得到一个指令去执行。也即心脏如时钟发生器,人体器官如MCU上的片上资源,血液养分和能量就如单片机的指令和数据。

    大家可以到我的百度盘下载该芯片的中英文的资料https://pan.baidu.com/s/1dgVbkE https://pan.baidu.com/s/1o9qFU5c,进入1.3 System Clock Distribution章节,建议读者先阅读一遍该章节,可以说确实不难,很快就可以知道这个芯片的时钟从产生到送到各个片上资源的路径,以及有几种时钟可以选择。这里我把芯片资料中的系统时钟图Figure 1-2. MC9S08DZ60 System Clock Distribution Diagram 粘贴上来做一个简单的说明,重点是如何为这款单片机配置系统时钟,那就是写代码!其他的多看看。


    A.首先从图Figure 1-2 中要能知道这款单片机的片上资源有哪些,它们分别是RTC、COP、TPM1、TPM2、IIC、SCI1、SCI2、SPI、CPU、BDC、ADC、MSCAN、FLASH、EEPROM、LPO、MCG、XOSC。

    B.这么多的片上资源咱们如果是一头蒙,不知道他们是干什么的话,那就不要管它们是什么。这课主题是MCG,也就是比拟的心脏,其他的,如CPU就理解为人的大脑,MSCAN就理解为人的嘴巴用来沟通的,FLASH/EEPROM就理解为人的记忆器官, 反正总之这些片上资源它们是能各自完成各自的功能的,如果读者是位初学者且之前没有接触过单片机,那么也没关系,这些器件都会慢慢讲解。

    C.看图的左边,MCG这个心脏为MCU片上资源提供了MCGERCLK、MCGIRCLK、MCGFFCLK、MCGOUT、MCGLCLK,并且知道MCG还控制一个(XOSC)外部振荡器以便把晶体或共鸣器用作外部参考时钟。除了MCG外这款单片机内部还有一个LPO 1KHZ的频率发生器只用来给RTC、COP这两个器件工作用。

    D.另外右下角有一段英文:The fixed frequency clock(FFCLK) is internally synchronized to the bus clock and must not exceed one half of the bus clock frequency 就是FFCLK这个时钟频率不要大于总线的2倍就可以,其实也不用担心,因为从时钟系统图,看到硬件已经做了÷2的设定.

2.接下来就是看芯片资料的Chapter8 Multi-Purpose Clock Generator(S08MCGV1)来了解这个MCG和怎样去用这个MCG来真正是的单片机工作起来。

    很显然,如果读者是第一次接触单片机,你肯定很头痛看这个芯片资料,或许看完之后也不知道怎么去操作这个MCG。即使真是这样,也没关系。不过建议多看看芯片资料,真的会有进步,个人经验,多看几遍就懂了。因为这里面涉及到很多理论概念加之读者的学识以及时间的限制,不啰嗦介绍这个MCG,读者自己看看咯。

3.现在来驱动这个MCG,让它工作起来。

    看芯片资料的‘8.3 Register Definition',一共看到5个寄存器(register),分别是MCGC1、MCGC2、MCGTRM、MCGSC、MCGC3。这里给这些寄存器分类为:MCGC1、MCGC2、MCGC3为控制类,MCGTRM为功能类、MCGSC为状态类。好那就建立三个函数,分别来操作这个三类寄存器吧。这三个函数名就分别取MCG_Control,MCG_Function和MCG_Status。

     另外看到每个寄存器中有多个设置项,看下图


      每个设置项又有多个选择项,看下图


     作者在这里采用没个设置项“位与”“异或非”:的方式来最终组成8字节的寄存器内容和判断寄存器中的值,也就是需要为每一个设置项定义多个define宏,如:#define CLKS_FLL_PLL 00 ;其实code warrior 工程文件加入芯片头文件后 有类似的定义,也无需自己定义的,但是为了自己使用,还是自己写了,俗话说看十遍,不如写一遍--不要笑话哈。

另外还要理解芯片资料的介绍的“8.4.1 Operational Mode”。其中FEI(FLL Engaged Internal)是复位芯片的默认模式,如果要用其他模式,比如FBE(FLL Bypassed External),直接设置到FBE模式,一步即可,但是要想用PBE(PLL Bypassed External),那么就要根据(双向)箭头的指示,找最短路线,先设置为FBE,然后在设置为PBE。怎么去切换时钟模式,在8.4.1节下面小节的每个模式说明中都有介绍,这个读者自己去看了,我只把模式切换(Clock Switch Modes)图贴过来:


    最后,读者要了解下,MCG内部的机制,建议读者通过一边浏览代码一边看MCG block diagram。通过这种方式,深入了解MCG提供的寄存器中各个设置项所做的事情,具体到MCG内部的详细情况。不同模式对输入的频率都有限制,这在芯片资料中8.5.2 MCG Mode Switching及相关对CLOCK mode说明章节中都有说明,设置的时钟分频一定要符合要求。


4.不善言表,废话也也多,上代码。

变量的重定义

#ifndef _DATA_TYPE_H_H
#define _DATA_TYPE_H_H

typedef char            INT8;
typedef unsigned char   UINT8;
typedef unsigned short  USHORT16;
typedef unsigned int    UNIT16;
typedef unsigned long   ULONG32;
typedef short           SHORT16;
typedef long            LONG32;
typedef unsigned char   BOOL;
#endif

   头文件MCG.h

#ifndef _MCG_H_H
#define _MCG_H_H

#ifdef CRYSTAL2M
#define RDIV_PARAM 0x00  //2Mhz的外部时钟频率除16
#else
#ifdef CRYSTAL4M
#define RDIV_PARAM 0x08  //4Mhz的外部时钟频率除32
#else
#ifdef CRYSTAL8M
#define RDIV_PARAM 0x10  //8Mhz的外部时钟频率除64
#else
#define RDIV_PARAM 0x18  //其他频率除128
#endif
#endif
#endif
//MCGC1
/*
         7     6   5 4 3      2       1           0
    R  |---------------------------------------------
       | CLKS    |RDIV   | IREFS | IRCLKEN | IREFSTEN
    W  |---------|-----------------------------------
Reset:  0      0   0 0 0     1        0           0
*/
#define CLKS_SHIFT   6
#define RDIV_SHIFT   3
#define IREFS_SHIFT  2
#define IRCLKEN_SHIFT 1
#define IREFSTEN_SHIFT 0

/*
只设置目标项,不影响其他项目的设置值,如设置CLK
  • 5
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值