历史上的今天
返回首页

历史上的今天

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

正在发生

2020年04月07日 | MSP430G2553与MSP430F5336系列单片机总结[1]

2020-04-07 来源:eefocus

在进行MSP430单片机的编程时,时钟的运用很重要,MSP430一共有5个时钟源,分别是外接的XT1和XT2时钟源,介绍如下:


1.XT1CLK:低频/高频振荡器,我的MSP430F5336使用的就是32768HZ的晶振


2.VLOCLK:内部超低功耗低低频振荡器,典型频率是12khz;


3.REFOCLK:内部调整低频参考振荡器,典型值为32768hz;


4.DCOCLK:内部数字时钟振荡器,可由FLL稳定后得到;


5.XT2CLK:高频外界振荡器,我F5336接的是20MHZ晶振;


以上五个时钟大家可以理解为晶振,有的是内部自带的,如2,3,4,这三个,有的是外接自己设计的,如XT1和XT2,当我们需要用单片机处理一些高速计算时,例如做图像处理或者一些迭代计算,此时要求计算速度比较高,所以可以选用外界的XT2或者DCOCLK调整后得到。如果你需要精确定时或者计时,可以使用REFOCLK或者VLOCLK,因为他们频率较为稳定,计时精确。用的比较多的是32768HZ的频率。DCOCLK的调整比较灵活,有专门的锁频环公式,在datasheet上可以找到DCO频率的设置条件表格,可以根据它直接调整出适合的频率。


但是MSP430的时钟调用却没有那么简单,你可以想象时钟设计为做菜,上面的五个时钟只是五种最基本的食材,通过寄存器的一些特殊调用,可以利用上面的时钟源做出三道菜,分别是ACLK辅助时钟,MCLK主时钟,SMCLK子系统时钟,而我们编程所用的时钟源(也就是我们要吃的菜),是这三种时钟提供的。所以举个栗子说,我需要一个32768hz的时钟来精确定时,同时需要一个1.2M或者的时钟来控制串口通信的波特率,同时我希望我的MCU频率可以到20M,这样我恶意设置MCLK=20Mhz(MCLK时钟是系统时钟),设置ACLK时钟为32768HZ,时钟计时是我选用ACLK为时钟源,设置SMCLK时钟为1.2Mhz,串口通信时选择时钟源为SMCLK,但是我们如何使ACLK为32768hz,使MCLK为20Mhz,使SMCLK为1.2M呢,这就是通过调配这三个时钟的原料为上面的五种不同晶振。所以实际上我们在程序中一旦定下了ACLK,MCLK,SMCLK的频率,之后基本都不用管之前的5个晶振,因为都是和这三个时钟打交道。而时钟的控制一般写成一个初始化函数,在程序中调用一次就可以了。刚刚开始接触时很容易搞不清楚时钟,觉得很复杂,其实弄清楚原理还是很简单的。


现在我用一些程序来说明时钟的用法,以下我看到的一份MSP430G2553的时钟程序库,进行了一些修改,其中的函数功能等均有注释,至于那样设置的原理可以看UserGuide的寄存器说明,里面一些特定的寄存器的位代表了一些信息,例如分频系数,时钟源等等,大家可以自己参考用户手册一句一句翻译对照,相信很快能弄懂时钟的设定原理:

/*******************************************************************************************


**********************************************************************************************/

#include 

                         /*DCOCTL 寄存器*/

    /********************************************************************************

    * bit7     bit6     bit5     bit4     bit3     bit2     bit1     bit0

    * DCO.2    CCO.1    DCO.0    MOD.4    MOD.3    MOD.2    MOD.1    MOD.0

    * DCO.0——DCO.2定义8种频率之一,可分段调节DCOCLK频率,相邻两种频率相差10%。

    * 而频率由注入直流发生器的电流定义。

    * MOD.O——MOD.4定义在32个DCO周期中插入的fdco+l周期个数,而在余下的DCO周期

    * 中为fDco周期,控制切换DCO和DCO+1选择的两种频率。如果DCO常数为7,表示已

    * 经选择最高颂率,此时不能利用MOD.O-MOD.4进行频率调整。

    * ********************************************************************************/

/*BCSCTL1 寄存器*/

 /**********************************************************************************

    * bit7      bit6      bit5      bit4     bit3     bit2   bit1   bit0

    * XT2OFF   XTS       DIVA.1    DIVA.0  XT5V    Rse1.2  Rse1.1   Rse1.0

    *XT2OFF控制 XT2 振荡器的开启与关闭。

    *XT2OFF=0,XT2振荡器开启;

    *XT2OFF=1,XT2振疡器关闭(默认XT2关闭)。

    *XTS控制 LFXTl 工作模武,选择需结合实际晶体振荡器连接情况。

    *XTS=0,LFXTl工作在低频模式 (默认低频模式);

    *XTS=1,LFXTl工作在高频模式(必须连接有相应高频时钟源)。

    *DIVA.0,DIVA.l控制ACLK分频。

    *0  不分频(默认不分频);

    *1  2分频;

    *2  4分频;

    *3  8分频。

    *XT5V此位设置为0。

    *Rse1.0,Rsel.l,Rse1.2三位控制某个内部电阻以决定标称频率。

    *Rse1=0,选择最低的频率;

    *Rse1=7,选择最低的标称频率;

    ***********************************************************************************/

/*BCSCTL2 寄存器*/ /***********************************************************************************

    * bit7     bit6     bit5     bit4     bit3     bit2     bit1     bit0

    *SELM.1   SELM.0   DIVM.1   DIVM.0   SELS     DIVS.1   DIVS.0   DCOR

    *SELM.1,SELM.0选择 MCLK 时钟源。

    *0  时钟源为 DCOLCK(默认时钟源);

    *1  时钟源为DCOCLK ;

    *2  时钟源为LFXTlCLK;

    *3     时钟源为 LFXT1CLK 。

    *DIVM.1,DlVM.0选择 MCLK 分频。

    *0  1分频(默认MCLK=DCOCLK);

    *1  2分频;

    *2  4分频;

    *3  8分频。

    *DIVS.1,DIVS.0选择 SMCLK 分频。

    *0  1分频(默认 SMCLK=MCLK);

    *1  2分频;

    *2  4分频;

    *3  8分频。

    ************************************************************************************/


/*BCSCTL3 寄存器*/

    /************************************************************************************

     * bit7     bit6     bit5     bit4     bit3     bit2     bit1     bit0

     * XT2S1   XT2S0  LFXT1S1  LFXT1S0  XCAP1   XCAP0  XT2OF   LFXT1OF

     * XT2S1和XT2S0(2553不支持)

     * LFXT1S1和LFXT1S0选择LFXT1的范围。

     * XCAP1和XCAP0选择LFXT1的匹配电容

     * 00  1pf

     * 01  6pf

     * 10  10pf

     * 11  12.5pf

     ************************************************************************************/


/****************************************************************************************

* 静态函数声明

********************************************************************/

static void DcoClkSet(unsigned char x,unsigned char y); //msp430g2553datasheet P30

static void MClkSet(unsigned char Div);

static void SMClkSet(unsigned char Div);

static void AClkSet(unsigned char Div);

/************************************************************************

* 函数名    :  DcoClkSet

* 函数功能  :  对时钟DCOCLK进行配置

* 函数形参  :  传入的形参为x和y,其值参考2553datsheet第28页中DCO频率表

* 函数返回值 :  无

************************************************************************/

void DcoClkSet(unsigned char x,unsigned char y)  // msp430g2553datasheet P30

{

    DCOCTL &=~( 0xFF);

    BCSCTL1 &=~( 0xFF);

    unsigned char temp=(x<<4)+y;

    switch(temp){

       case 0x00: {

           DCOCTL  &=~( DCO0 + DCO1 + DCO2);

           BCSCTL1 &=~( RSEL0 + RSEL1 + RSEL2 + RSEL3);

           break;

       }

       case 0x03: {

           DCOCTL  |= ( DCO0 + DCO1 );

           BCSCTL1 &=~( RSEL0 + RSEL1 + RSEL2 + RSEL3);

           break;

       }

       case 0x13: {

           DCOCTL  |= ( DCO0 + DCO1 );

           BCSCTL1 |= ( RSEL0 );

           break;

       }

       case 0x23: {

           DCOCTL  |= ( DCO0 + DCO1 );

           BCSCTL1 |= ( RSEL1 );

           break;

       }

       case 0x33: {

           DCOCTL  |=  ( DCO0 + DCO1  );

           BCSCTL1 |= ( RSEL0 + RSEL1 );

           break;

       }

       case 0x43: {

           DCOCTL  |= ( DCO0 + DCO1  );

           BCSCTL1 |= ( RSEL2);

           break;

       }

       case 0x53: {

           DCOCTL  |= ( DCO0 + DCO1  );

           BCSCTL1 |= ( RSEL0 + RSEL2 );

           break;

       }

       case 0x63: {

           DCOCTL  |= ( DCO0 + DCO1  );

           BCSCTL1 |= ( RSEL1 + RSEL2 );

           break;

       }

       case 0x73: {

           DCOCTL  |= ( DCO0 + DCO1  );

           BCSCTL1 |= ( RSEL0 + RSEL1 + RSEL2 );

           break;

       }

       case 0x83: {

           DCOCTL  |= ( DCO0 + DCO1  );

           BCSCTL1 |= ( RSEL3);

           break;

       }

       case 0x93: {

           DCOCTL  |= ( DCO0 + DCO1  );

           BCSCTL1 |= ( RSEL0+ RSEL3);

           break;

       }

       case 0xA3: {

           DCOCTL  |= ( DCO0 + DCO1  );

           BCSCTL1 |= ( RSEL1 + RSEL3);

           break;

       }

       case 0xB3: {

           DCOCTL  |= ( DCO0 + DCO1 );

           BCSCTL1 |= ( RSEL0 + RSEL1 + RSEL3);

           break;

       }

       case 0xC3: {

           DCOCTL  |= ( DCO0 + DCO1 );

           BCSCTL1 |= ( RSEL2 + RSEL3);

           break;

       }

       case 0xD3: {

           DCOCTL  |= ( DCO0 + DCO1 );

           DCOCTL  |= ( MOD4 + MOD3 + MOD2 + MOD1 + MOD0 );//微调DCOCLK

推荐阅读

史海拾趣

Crystal Semiconductor Corp公司的发展小趣事

随着市场竞争的加剧,Crystal Semiconductor Corp意识到只有不断创新才能在行业中立足。于是,公司加大了对研发的投入,引进了一批高端人才。经过数年的努力,公司成功开发出了一种新型的半导体制程工艺,大幅提高了晶体管的性能和可靠性。这一创新不仅为公司带来了丰厚的利润,也为整个半导体行业树立了新的标杆。

智烽维(CDA)公司的发展小趣事

随着市场需求的不断增长和公司业务的不断拓展,智烽维在2021年进行了工厂的扩建。扩建后的工厂不仅提升了产能和效率,也进一步提高了产品的质量和可靠性。此外,公司还加强了与上下游企业的合作和资源整合,形成了更加完善的产业链和供应链体系。这一举措不仅为公司的未来发展提供了强有力的支撑,也为公司在电子行业中的竞争地位奠定了坚实的基础。

E-CMOS(飞虹高科)公司的发展小趣事

随着电子行业的快速发展,市场对CMOS图像传感器的需求日益增长。飞虹高科公司意识到,要想在市场中保持领先地位,必须不断进行技术创新。因此,公司加大了研发投入,引进了一批高端研发设备,并与国内外知名高校和研究机构建立了紧密的合作关系。经过数年的努力,公司成功开发出了多款具有自主知识产权的CMOS图像传感器产品,其中一款产品以其高灵敏度、低功耗和低噪声等优异性能,赢得了客户的广泛赞誉。

Cliff Electronic Components公司的发展小趣事

在技术创新的同时,飞虹高科公司也积极拓展市场。然而,市场拓展的过程并非一帆风顺。公司面临着来自国内外众多竞争对手的激烈竞争,同时还要应对客户不断变化的需求。为了应对这些挑战,公司制定了一套完善的市场营销策略,积极参加国内外各类电子展会和技术交流活动,与客户建立了长期稳定的合作关系。同时,公司还不断优化产品性能和服务质量,提高客户满意度。通过这些努力,公司逐渐在市场上树立了良好的品牌形象。

ENSIGN公司的发展小趣事

ENSIGN的前身Skylight于1998年在上海成立,专注于商业照明领域。随着市场需求的增长,公司于2003年正式更名为ENSIGN,并开始为零售店铺提供全面的商业照明解决方案。ENSIGN凭借其创新的设计和高质量的产品,逐渐在市场中树立了良好的口碑。

High Voltage Semiconductor Inc公司的发展小趣事

进入21世纪,美高测持续加大在技术研发上的投入,成功研发出具有自主知识产权的VLF(超低频)测试技术,并应用于变电站设备、中高压电力电缆等关键领域的测试。这项技术不仅提高了测试的准确性和效率,还降低了操作风险,迅速获得了市场的广泛认可。公司借此机会,在全球范围内建立了多个销售和服务中心,进一步巩固了其在高压半导体测试市场的领先地位。

问答坊 | AI 解惑

ARM入门最好的文章

1.抓住51开发ARM 这几个月来我一直都爬在51的问题,自己都有一点笑自己了,用了4个月的时间,来巩固51的原理和程序,还好我自己算是走过来了,自己笨,身边的高才生又看不上51的原理,他们都比较“牛”,说51过时了,你问那个做什么???我比较 ...…

查看全部问答>

在WINCE系统下,对话框最多能同时层叠多少个?

最近做一个项目,感觉同时存在了5个以上对话框,机子就会挂掉,怀疑是对话框开太多! 死机之前,串口打印出“stack fault……”等错误信息。请问是因为对话框层叠太多的原因吗?…

查看全部问答>

各位大侠帮帮小妹!

本人最近想在无字库的lcd通过调用字库显示汉字,但不知道如何取得区位码。请各位大侠指教一二!不胜感激!…

查看全部问答>

WINCE下自带的数据库问题?

怎么在CE下数据库的.DB文件中加入数据? …

查看全部问答>

嵌入式还是单片机?

各位大虾。小弟我刚学单片机不到一个月,就有好几个老师说单片机不必太深入,建议我直接上ARM。他们说单片机学的人多,而相反嵌入式的就业前景比单片机好多了。。我现在就是非常犹豫啊。都不知道怎么办。到底该学什么好啊?。 请各位大虾帮我分析 ...…

查看全部问答>

2602新型测试仪器如何缩短测试时间?

Andrew Armutat 产品市场部 吉时利仪器公司 2602型双通道系统源表[1]   可降低测试成本的重要参数 在本文的前面,介绍过四个降低测试成本的关键因素:缩短测试时间、缩短开发时间、减少测试设备所占的面积和机架的空间大小以及降 ...…

查看全部问答>

IP核问题

从网上下载了个开源串口IP核,包含四个VHDL文件,如何在QUARTUS中生成一个串口核呢。难道是一个VHDL文件生成一个SYMBOL,然后四个SYMBOL再合并成一个SYMBOL是这样操作吗…

查看全部问答>

上海新进半导体公司诚聘!2012年2月份最新职位空缺!

上海新进半导体公司(BCD公司)由于生产线扩建,招聘design engineer,system engineer,设备维护工程师,等若干名,power management (AC/DC, DC/DC, LDO) 方向。工作地点在上海紫竹科技园区。待遇面议。注意公司暂不招聘实习生及应届毕业生,请见 ...…

查看全部问答>

本人出售笔记本14寸LED的触摸屏加控制器一套

这里说下,我买的这个触摸屏是按照LED显示屏用的, 不适合液晶背光的显示器,请大家明白,我的电脑是神舟A420用的。   联系方式qq344864311 [ 本帖最后由 zhang1234bbcc 于 2012-6-29 13:05 编辑 ]…

查看全部问答>

用progisp 拷程序时出现“chip signature doesn't match target”怎么解决。

之前焊完最小系统时考程序是可以的 有知道的吗…

查看全部问答>