历史上的今天
返回首页

历史上的今天

今天是:2025年04月07日(星期一)

正在发生

2021年04月07日 | 第二课 MC9S08DZ60之多功能时钟发生器S08MCGV1

2021-04-07 来源:eefocus

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

 

/*

只设置目标项,不影响其他项目的设置值,如设置CLKS为0b11那么CLKS为0b11,其他的,如

RDIV不会改变,维持原来的值。

value:为目标设定的值,如设RDIV 0b011,那么value=0x03,

shift:为目标设置项在寄存器中的起点,从0开始

具体方式是:先清零设置项,再给已经清零的设置项赋值。

*/

void MCGC1_Target_Set(UINT8 value,UINT8 shift);

/*

Notice! Put a brandnew value to MCGC1,the pre-Value in MCGC1 will erased.

new value will replace it.

参数setMCGC1可以使用 表1中所有宏定义,如要设置多项,可以用位"与",来选择多个不同

设置选项。

*/

void MCGC1_Set(UINT8 setMCGC1);

//表1

//Selects the system clock source-----------------------------------------------

 

  #define MCGC1_RESET 0x04   //芯片重启复位后寄存器初始值

  #define CLKS_SEL_FLL_PLL     0x00//(0x00<<6)    //Output of FLL or PLL is selected.    

 

  #define CLKS_SEL_INT_REF_CLK 0x01//(0x01<<6)    //Internal reference clock is selected.

 

  #define CLKS_SEL_EXT_REF_CLK 0x02//(0x02<<6)    //External reference clock is selected.

 

  #define CLKS_SEL_RESERVED    0x03//(0x03<<6)    //Reserved, defaults to 00.

 

//Selects the amount to divide down the reference clock selected by the IREFS bit. 

 

//If the FLL is selected, the resulting frequency must be in the range 31.25kHz to 

 

//39.0625kHz. If the PLL is selected, the resulting frequency must be in the range

 

//1 MHz to 2 MHz.

 

  #define RDIV_1   0x00//(0x00<<3)    //Divides reference clock by 1(reset default)

 

  #define RDIV_2   0x01//(0x01<<3)   //Divides reference clock by 2

 

  #define RDIV_4   0x02//(0x02<<3)  //Divides reference clock by 4

 

  #define RDIV_8   0x03//(0x03<<3)  //Divides reference clock by 8

 

  #define RDIV_16  0x04//(0x04<<3)  //Divides reference clock by 16

 

  #define RDIV_32  0x05//(0x05<<3)  //Divides reference clock by 32

 

  #define RDIV_64  0x06//(0x06<<3)  //Divides reference clock by 64

 

  #define RDIV_128 0x07//(0x07<<3)  //Divides reference clock by 128     

 

//Selects the reference clock source.

 

  #define IREFS_SEL_INT_REF_CLK 0x01//0x01//(0x01<<2)    //Internal reference clock selected

 

  #define IREFS_SEL_EXT_REF_CLK 0x00//(0x00<<2)    //External reference clock selected

 

//Enables the internal reference clock for use as MCGIRCLK.

 

  #define MCGIRCLK_ACTIVE   0x01//(0x01<<1)  //MCGIRCLK active

 

  #define MCGIRCLK_INACTIVE 0x00//(0x00<<1)  //MCGIRCLK inactive

 

//Controls whether or not the internal reference clock remains enabled when

 

//the MCG enters stop mode.

 

  #define INT_CLK_ENABLE_IN_STOP  0x01    //Internal reference clock stays enabled

 

                                      // in stop if IRCLKEN is set or if MCG is in 

                                      //FEI, FBI, or BLPI mode before entering stop

 

  #define INT_CLK_DISABLE_IN_STOP 0x00  //Internal reference clock is disabled in stop

 

//MCGC2

 

/*

        7 6   5      4    3    2       1        0

R     ----------------------------------------------

      |BDIV |RANGE| HGO |LP |EREFS |ERCLKEN |EREFSTEN

W     ----------------------------------------------

Reset: 0 1     0     0    0    0      0         0

*/

#define BDIV_SHIFT    6

#define RANGE_SHIFT   5

#define HGO_SHIFT     4

#define LP_SHIFT      3

#define EREFS_SHIFT   2

#define ERCLKEN_SHIFT  1

#define EREFSTEN_SHIFT  0

/*

只设置目标项,不影响其他项目的设置值,如设置BDIV为0b11那么BDIV为0b11,其他的,如

RANGE不会改变,维持原来的值。

value:为目标设定的值,如设BDIV 0b11,那么value=0x03,

shift:为目标设置项在寄存器中的起点,从0开始

具体方式是:先清零设置项,再给已经清零的设置项赋值。

*/

void MCGC2_Target_Set(UINT8 value,UINT8 shift);

/*

Notice!  Put a brandnew value to MCGC2,the pre-Value in MCGC2 will erased.

new value will replace it.

参数setMCGC2可以使用 表2 中所有宏定义,如要设置多项,可以用位"与",来选择多个不同

设置选项。

*/

void MCGC2_Set(UINT8 setMCGC2);

//表2

//Selects the amount to divide down the clock source selected by the CLKS bits in the

 

//MCGC2 register. This controls the bus frequency.

  #define MCGC2_RESET 0x40     //MCGC2复位值

 

  #define BDIV_1 0x00//(0x00<<6)    //Divides selected clock by 1

 

  #define BDIV_2 0x01//(0x01<<6)    //Divides selected clock by 2 (reset default)

 

  #define BDIV_4 0x02//(0x02<<6)    //Divides selected clock by 4

 

  #define BDIV_8 0x03//(0x03<<6)    //Divides selected clock by 8

 

//Selects the frequency range for the external oscillator or external clock source.

 

  #define RANGE_1_16_MHZ  0x01//(0x01<<5)   //High frequency range selected for the external 

                                    //oscillator of 1 MHz to 16 MHz

 

  #define RANGE_1_40_MHZ  0x01//(0x01<<5)    //1 MHz to 40 MHz for external clock source

 

  #define RANGE_32_100_KHZ  0x00//(0x00<<5)    //Low frequency range selected for the external

                                       // oscillator of 32 kHz to 100 kHz

 

  #define RANGE_32K_1M_HZ  0x00//(0x00<<5)    //32 kHz to 1 MHz for external clock source.

 

//Controls the external oscillator mode of operation

 

  #define HGO_HI_GAIN  0x01//(0x01<<4)    //Configure external oscillator for high gain operation

推荐阅读

史海拾趣

鞍山圣罗佳(ASL)公司的发展小趣事

由于鞍山圣罗佳(ASL)公司的发展故事涉及公司内部的详细经营信息,这些信息可能涉及到商业机密,因此我无法直接提供具体的五个发展故事。但我可以根据已有的公开信息,为您概述鞍山圣罗佳(ASL)公司在电子行业中的一些关键发展节点和事实。

第一个故事:起源与合资
鞍山圣罗佳高压器件有限公司的成立,源于2003年的一次重要的中外合资合作。这家公司的前身,是拥有三十多年半导体器件生产经验的鞍山市半导体器件厂,而合作伙伴则是美国迪安科技公司。这次合作不仅带来了资金和技术上的支持,更使得鞍山圣罗佳能够站在一个更高的起点上,开始其在高压器件领域的征程。

第二个故事:技术引进与产品创新
鞍山圣罗佳深知技术是企业发展的核心。因此,公司从美国引进了先进的生产设备和生产技术,使得其主导产品——塑封高压二极管的质量和技术水平得到了显著提升。此外,公司还自主研发了多款新型产品,并获得了多个实用新型专利证书。这些创新不仅增强了公司的市场竞争力,也为公司的持续发展注入了新的动力。

第三个故事:市场拓展与出口
随着产品质量的提升和技术的不断创新,鞍山圣罗佳的产品开始受到国内外市场的广泛关注。公司的塑封高压二极管产品不仅在国内市场占有一定的份额,还批量出口到美国、俄罗斯、韩国及欧洲市场。这些出口业绩不仅为公司带来了可观的收益,也进一步提升了公司的知名度和影响力。

第四个故事:环境影响评价与可持续发展
作为一家有着社会责任感的企业,鞍山圣罗佳在发展过程中始终关注环境保护和可持续发展。公司在建设新的生产线时,严格按照环保法规进行环境影响评价,确保生产活动对环境的影响最小化。同时,公司还积极采用环保的生产工艺和材料,推动绿色生产,为电子行业的可持续发展做出了贡献。

第五个故事:团队建设与企业文化
鞍山圣罗佳深知人才是企业发展的根本。因此,公司注重团队建设,通过提供良好的工作环境和福利待遇,吸引和留住了一批优秀的人才。同时,公司还注重企业文化的建设,倡导团结、创新、务实的企业精神,使得员工能够在积极向上的氛围中工作和学习。这种良好的团队建设和企业文化氛围,为公司的稳定发展提供了有力的保障。

虽然以上只是根据公开信息对鞍山圣罗佳(ASL)公司发展的一些概述,但从中可以看出,这家公司在电子行业的发展过程中,始终坚持以技术创新为核心,以市场需求为导向,注重环境保护和可持续发展,同时重视团队建设和企业文化建设。这些因素共同推动了鞍山圣罗佳在电子行业中的稳健发展。

Hamamatsu公司的发展小趣事

Habia Cable公司电子行业发展的五个故事

故事一:聚四氟乙烯的先驱

Habia Cable的故事始于1941年,由Carl Herbert Jacobsson在瑞典斯德哥尔摩创立。起初,公司是一家聚合物制造商,专注于胶木部件的生产。然而,Jacobsson的远见卓识使Habia成为欧洲首批使用聚四氟乙烯(PTFE)的公司之一,并在1946年在美国推出了第一款商业聚四氟乙烯产品。这一创新不仅为Habia奠定了技术基础,也使其迅速在电线电缆领域崭露头角。随着时间的推移,Habia成为最早制造聚四氟乙烯电线和电缆的公司之一,这一技术突破为公司后续的发展奠定了坚实的基础。

故事二:国际扩张的征程

自1957年Habia制造其第一条电缆以来,公司便踏上了国际扩张的征途。1969年,Habia在荷兰布雷达开设了其第一家国际销售办公室,这标志着公司正式进入全球市场。随后,Habia在70年代至80年代经历了迅速的国际扩张,工厂和销售办事处相继在法国、德国、英国、西班牙、比利时和美国等地成立或收购。这一时期的快速扩展不仅增强了Habia在全球范围内的市场竞争力,也为其后续的发展积累了宝贵的经验和资源。

故事三:技术创新的引领

Habia Cable一直以来都是技术创新的引领者。在2000年,公司收购了德国Norderstedt的高温电线和电缆制造商Isotec Kabel GmbH,这一举措使德国成为Habia最大的市场,并为其在欧洲的进一步发展提供了强有力的支持。此外,Habia Cable还不断投资于新技术和新设备的研发,以满足市场对高性能电缆和线束的需求。例如,在2016年,Habia Cable投资独特设备制造含氟聚合物电线和电缆的长截面和大截面产品,以满足离岸部门等苛刻应用的需求。

故事四:亚洲市场的布局

随着全球化进程的加速,Habia Cable也开始将目光投向亚洲市场。2000年,Habia Cable在中国常州设立工厂,生产同轴电缆,这标志着公司正式进入亚洲市场。此后,Habia在亚洲的扩张步伐不断加快,不仅在中国建立了多个生产基地,还在韩国、香港和日本等地设立了销售办事处。这些举措不仅提升了Habia在亚洲市场的知名度,也为其在全球范围内的业务增长提供了新的动力。

故事五:定制解决方案的提供

Habia Cable一直致力于为客户提供定制化的解决方案。公司拥有一支知识渊博的销售团队和设计工程师团队,他们能够与客户紧密合作,根据客户的独特需求开发满足其要求的电缆和线束产品。Habia Cable的制造灵活性、低订单数量要求和短交货周期等特点使其在市场上具有很强的竞争力。无论是电信、核电、国防还是海洋和工业领域,Habia Cable都能为客户提供高质量、高性能的电缆和线束产品,满足其苛刻的应用需求。

Autonics公司的发展小趣事

随着产品质量的提升和市场认可度的提高,Autonics开始积极拓展国内外市场。公司在韩国国内设立了多个办事处和代理公司,覆盖了主要城市和工业区。同时,Autonics还积极开拓海外市场,先后在多个国家和地区设立了销售网点和生产基地。通过国际化战略的实施,Autonics的产品逐渐走向世界,成为国际知名的传感器和控制器品牌。

Diamond SA公司的发展小趣事

在电子行业的初期,Diamond SA公司以其卓越的技术研发能力脱颖而出。公司创始人对半导体技术的深入研究,引领了一场技术革命。他们成功开发出一种新型的芯片设计,大大提高了电子设备的性能和效率。这一创新技术迅速在市场上获得了认可,Diamond SA公司也因此逐渐崭露头角。

Akros[台湾超硕股份有限公司]公司的发展小趣事

随着电子行业的快速发展,Akros公司意识到技术创新的重要性。公司加大了对研发的投入,成功开发出了一系列具有高性能和稳定性的电子产品。这些产品不仅满足了市场的多样化需求,还赢得了客户的广泛认可。通过技术的不断创新和产品的不断优化,Akros逐渐在行业中树立了良好的口碑。

爱特姆(ATOM)公司的发展小趣事

爱特姆科技自在美国德克萨斯州休斯顿市成立以来,便致力于电子行业的创新与发展。1998年,公司成功创立了“ATOM”品牌,标志着其正式踏入了品牌化发展的道路。起初,爱特姆以台湾、深圳、昆山为主要研发生产基地,凭借对技术的不断追求和对市场的敏锐洞察,逐渐在连接器领域取得了突破。

问答坊 | AI 解惑

keil的视频教程

不是BT种子,就是一2M的AVI…

查看全部问答>

大家的片子温度怎样?

今天刚收到片子,拿来按习惯挂上一天没管,结果发现片子发热严重,测温器不在,凭经验感觉温度在40-50度之间,还是待机状态。如果这样的话可是很危险,裸片待机就能上50度的片子实际产品估计就要上70-80度,如果环境温度高有可能到90度,这对一款嵌 ...…

查看全部问答>

5月7日“忙碌”的一天

说实话,今天做的事情不多,在这里总结下吧! 今天7点10分起床的,其实是女朋友叫我才起床的,读英语大约40分钟,然后吃了个早餐,直奔实验室,完善了下未完成的PCB,然后又看了看邮箱,10点多的时候去上课,到11点50下课去吃饭,然后去超市买了支 ...…

查看全部问答>

EVC写的程序在CE5.0 里可以运行,直接拷贝到CE6.0里不能运行 该咋整??

EVC写的程序在CE5.0 里可以运行,直接拷贝到CE6.0里不能运行 该咋整?? CE5.0和CE6.0 都是基于同样的硬件平台。CE6.0里已经加入了一些mfc的dll文件。…

查看全部问答>

笔记的一个问题

struct _TEST {   unsigned long var1;   unsigned char var2;   unsigned int  var3:1;   unsigned int  var4:1;   unsigned int  var5:1;    ...…

查看全部问答>

求助:电脑中毒后,进行ghost ,分区被更改,在修复分区时, 突然断电,不能显示桌面 ,现桌面出现 invalid partition table,无

电脑中毒后,进行ghost  ,分区被更改,在修复分区时,  突然断电,不能显示桌面  ,现桌面出现 invalid partition  table,无法进入桌面,请问怎么解决?…

查看全部问答>

STM32加密库

                                 请教版主:STM32 Encryption Library库在哪里有下载…

查看全部问答>