历史上的今天
返回首页

历史上的今天

今天是:2024年10月19日(星期六)

正在发生

2019年10月19日 | TI MSP430 如何使用 DCO 倍频

2019-10-19 来源:eefocus

1、背景:


许久未更新博客,最近由于项目需求,简单使用430做接口,但由于内部默认可使用1MHz的频率无法满足需求;


2、功能:


经查阅手册发现片子支持DCO倍频,频率可以高达16M,经验证满足需求;


3、前提:


需要外接32K晶振作为校正频率;


4、参阅代码如下:


#include


 


// 32KHz/8=4096Hz,由此计算倍频


#define DELTA_1MHZ    244                     // 244 x 4096Hz = 999.4Hz

#define DELTA_8MHZ    1953                   // 1953 x 4096Hz = 7.99MHz

#define DELTA_12MHZ   2930                  // 2930 x 4096Hz = 12.00MHz

#define DELTA_16MHZ   3906                  // 3906 x 4096Hz = 15.99MHz


unsigned char CAL_DATA[8];                  // Temp. storage for constants

volatile unsigned int i;

int j;

char *Flash_ptrA;                           // Segment A pointer

void Set_DCO(unsigned int Delta);


int main(void)

{

  WDTCTL = WDTPW + WDTHOLD;                 // Stop WDT

  for (i = 0; i < 0xfffe; i++);             // Delay for XTAL stabilization

  P1OUT = 0x00;                             // Clear P1 output latches

  P1SEL = 0x10;                             // P1.4 SMCLK output

  P1DIR = 0x11;                             // P1.0,4 output


  j = 0;                                    // Reset pointer


  Set_DCO(DELTA_16MHZ);                     // Set DCO and obtain constants

  CAL_DATA[j++] = DCOCTL;

  CAL_DATA[j++] = BCSCTL1;



  Set_DCO(DELTA_12MHZ);                     // Set DCO and obtain constants

  CAL_DATA[j++] = DCOCTL;

  CAL_DATA[j++] = BCSCTL1;



  Set_DCO(DELTA_8MHZ);                      // Set DCO and obtain constants

  CAL_DATA[j++] = DCOCTL;

  CAL_DATA[j++] = BCSCTL1;



  Set_DCO(DELTA_1MHZ);                      // Set DCO and obtain constants

  CAL_DATA[j++] = DCOCTL;

  CAL_DATA[j++] = BCSCTL1;



  Flash_ptrA = (char *)0x10C0;              // Point to beginning of seg A

  FCTL2 = FWKEY + FSSEL0 + FN1;             // MCLK/3 for Flash Timing Generator

  FCTL1 = FWKEY + ERASE;                    // Set Erase bit

  FCTL3 = FWKEY + LOCKA;                    // Clear LOCK & LOCKA bits

  *Flash_ptrA = 0x00;                       // Dummy write to erase Flash seg A

  FCTL1 = FWKEY + WRT;                      // Set WRT bit for write operation

  Flash_ptrA = (char *)0x10F8;              // Point to beginning of cal consts

  for (j = 0; j < 8; j++)

    *Flash_ptrA++ = CAL_DATA[j];            // re-flash DCO calibration data

  FCTL1 = FWKEY;                            // Clear WRT bit

  FCTL3 = FWKEY + LOCKA + LOCK;             // Set LOCK & LOCKA bit



  while (1)

  {

    P1OUT ^= 0x01;                          // Toggle LED

    for (i = 0; i < 0x4000; i++);           // SW Delay

  }

}


// 计算倍频

void Set_DCO(unsigned int Delta)            // Set DCO to selected frequency

{

  unsigned int Compare, Oldcapture = 0;



  BCSCTL1 |= DIVA_3;                        // ACLK = LFXT1CLK/8

  TACCTL0 = CM_1 + CCIS_1 + CAP;            // CAP, ACLK

  TACTL = TASSEL_2 + MC_2 + TACLR;          // SMCLK, cont-mode, clear



  while (1)

  {

    while (!(CCIFG & TACCTL0));             // Wait until capture occured

    TACCTL0 &= ~CCIFG;                      // Capture occured, clear flag

    Compare = TACCR0;                       // Get current captured SMCLK

    Compare = Compare - Oldcapture;         // SMCLK difference

    Oldcapture = TACCR0;                    // Save current captured SMCLK



    if (Delta == Compare)

      break;                                // If equal, leave "while(1)"

    else if (Delta < Compare)

    {

      DCOCTL--;                             // DCO is too fast, slow it down

      if (DCOCTL == 0xFF)                   // Did DCO roll under?

        if (BCSCTL1 & 0x0f)

          BCSCTL1--;                        // Select lower RSEL

    }

    else

    {

      DCOCTL++;                             // DCO is too slow, speed it up

      if (DCOCTL == 0x00)                   // Did DCO roll over?

        if ((BCSCTL1 & 0x0f) != 0x0f)

          BCSCTL1++;                        // Sel higher RSEL

    }

  }

  TACCTL0 = 0;                              // Stop TACCR0

  TACTL = 0;                                // Stop Timer_A

  BCSCTL1 &= ~DIVA_3;                       // ACLK = LFXT1CLK


}


推荐阅读

史海拾趣

长运通(CYT)公司的发展小趣事

作为一家高新技术企业,长运通深知技术创新的重要性。公司投入大量资源用于研发,不断推出具有竞争力的新产品。例如,在电源管理IC领域,长运通成功研发出多款高性能、低功耗的产品,满足了客户对于高效、稳定电源管理的需求。在LED光源方面,公司也取得了多项技术突破,推出了多款高效、环保的LED照明产品。这些技术突破和创新不仅提升了公司的市场竞争力,也为公司赢得了更多的客户信任。

Horizon Electronics Enterprises Group公司的发展小趣事

在21世纪初,随着数字技术的兴起,Horizon Electronics Enterprises Group(以下简称“Horizon”)由一群对电子技术充满热情的工程师创立。公司初期专注于研发高性能的半导体芯片,以解决当时市场上对高速、低功耗芯片的迫切需求。通过不懈努力,Horizon成功研发出了一款具有突破性的芯片产品,该产品在数据处理速度和能效比上远超同类产品,迅速获得了市场的认可。这一技术创新不仅为公司赢得了首批客户,也为后续发展奠定了坚实的技术基础。

Globaltech Semiconductor Co Ltd公司的发展小趣事

随着技术的不断成熟,Globaltech开始积极拓展国际市场。公司通过与国内外多家系统厂商建立紧密的合作关系,共同开发新产品,进一步提升了其市场竞争力。特别是在亚洲市场,Globaltech凭借其高性价比的产品和快速的响应能力,迅速占据了大量市场份额。同时,公司还积极参与国际展会,与全球客户面对面交流,进一步提升了品牌知名度和影响力。

思瑞浦微电子科技(3PEAK INCORPORATED)公司的发展小趣事

近年来,全球半导体行业面临了诸多挑战,包括供应链紧张、技术迭代加速等。面对这些挑战,Globaltech积极调整战略,加强与上游供应商和下游客户的沟通与合作,确保供应链的稳定。同时,公司还加大了对新技术和新产品的研发投入,以应对行业变化带来的挑战。通过这些努力,Globaltech不仅成功应对了行业挑战,还实现了业务的持续增长。

Aptos Technology公司的发展小趣事

Aptos Technology成立于2006年,正值电子科技行业蓬勃发展的时期。初创时期的Aptos面临着资金短缺、技术积累不足以及市场竞争激烈等多重挑战。然而,凭借其独特的SiP-System in Package技术,公司成功在微电子封装领域获得了一席之地。通过不断的研发和创新,Aptos逐渐在行业内崭露头角。

AUREL公司的发展小趣事

在国内市场站稳脚跟后,AUREL公司开始积极拓展国际市场。公司积极参加国际电子展会和技术交流活动,与海外企业建立了广泛的合作关系。同时,公司还针对不同国家和地区的市场需求,推出了定制化的产品和服务。这些举措使得AUREL公司的品牌影响力逐渐扩大,国际市场份额不断攀升。

问答坊 | AI 解惑

关于组成原理中跳转指令的问题

请问大家,为什么跳转指令像JC、JZ、JMP的微程序相同,计算机却可以判断出执行哪一个指令呢? 我查过,说是微程序是入口地址,指令的判断是通过硬件实现~~ 但是还是不明白,是怎么判断的? 难道对指令寄存器中IR有要求吗?…

查看全部问答>

心电图机串口传输到电脑的文件怎样才能转换为可读文件???急!!!

心电图机串口传输到电脑的文件怎样才能转换为可读文件(可读文件包括ECG格式\\DICOM格式\\BMP格式都可以)???急!!!…

查看全部问答>

谁推介一下比较好的嵌入式论坛

大家推介一下比较好的嵌入式论坛…

查看全部问答>

关于ucos的一个问题

本人初学嵌入式系统 对于ucos尚留几个关于任务调度的问题,急需解惑, (1)当前运行的任务是不是还在就绪表中:         1.假设是,那么调度到新任务不都是当前任务么,也就是说实际上不会有任务切换了?(假设不会 ...…

查看全部问答>

wince自动拨号调用哪个dll文件

     我想用vs2005做一个wince下的自动拨号程序,不知该调用哪个dll文件。XP系统下应该用rasapi32.dll,可是wince下该调用哪个dll呢? …

查看全部问答>

单片机smbus总线通讯,数据只能确认0?

大家好,我现在用smbus(I2C)总线进行两个C8051F系列单片机的通讯。单片机中有控制逻辑模块,不需要自己写驱动程序。 我设置的模式是主器件发送,从器件接受。 我现在的问题是,发送数据只能对0确认,其他的数,字符一概不确认,不知是什么原因啊 ...…

查看全部问答>

用VB2005在CE5.0下模拟按键

在CE5.0下使用VB2005模拟按键时: keybd_event   、sendinput、sendkeys   等函数均不可以 RegisterHotKey   没有使用成功 请求帮助!…

查看全部问答>

ISA的总线标准资料

我要对ISA接口的采集卡开发驱动程序,谁有免费ISA的总线标准资料提供吗?谢谢.我的邮箱是:                gaoyuehong2008@163.com …

查看全部问答>

想问几个有关路由器嵌入的问题

cisco 华为 juniper 阿尔卡特的操作系统是什么啊?他们还有没有后台架构,例如VxWorks。有哪些路由器是用linux unix uclinux VxWorks或psos作为操作系统的啊?…

查看全部问答>