历史上的今天
返回首页

历史上的今天

今天是:2024年10月23日(星期三)

正在发生

2019年10月23日 | msp430的DCO校准值被清除后该如何处理

2019-10-23 来源:eefocus

起因

在调试MSP430G系列的单片机的过程,发现不怎么的,时钟频率发生了变化,时间一下都对不上了。查收些资料说,DCO的值有可能被擦除了导致时钟不对的。细想一下,好像是在调试的过程中,出现调试不了的现象就在IAR里点击的“Erase memory”。把查找的资料记录下来,所以就有这篇文章。


问题描述

因为DCO校准值在MCU出厂时保存于信息段A,一般是不允许清除信息段A的。


且示例代码中,有如下语句:


if (CALBC1_1MHZ ==0xFF || CALDCO_1MHZ == 0xFF)     

    while(1);// If calibration constants erased

    // do not load, trap CPU!!

}

BCSCTL1 = CALBC1_1MHZ; // Set range

DCOCTL = CALDCO_1MHZ; // Set DCO step + modulation 


可以看出在启动时都先检查DCO1MHZ的校准值是否为0xFF,是则进入while(1)死循环。 

正常情况下因为信息段A不清除没问题的,但是我测试BSL下载时,故意给错误的BSL密码,导致FLASH都被擦除,发现转载DCO校准值的信息段A也被清掉了,于是程序运行到上面的代码时即进入死循环。


解决办法

针对于这种DCO数据被擦除的情况,一般的解决办法是,通过利用Timer捕捉外部的32.768K晶振或是时钟源,然后得到1M,8M或是12Mhz之类的DCO的数值,然后在直接写入segment flashA里面。 

有两个解决方案供选择:


1、外接晶体,用晶体配合timer校正DCO,TI的msp4300ware有源代码。如下:

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

 * 

 *                       MSP430 CODE EXAMPLE DISCLAIMER

 *

 * MSP430 code examples are self-contained low-level programs that typically

 * demonstrate a single peripheral function or device feature in a highly

 * concise manner. For this the code may rely on the device's power-on default

 * register values and settings such as the clock configuration and care must

 * be taken when combining code from several examples to avoid potential side

 * effects. Also see www.ti.com/grace for a GUI- and www.ti.com/msp430ware

 * for an API functional library-approach to peripheral configuration.

 *

 * --/COPYRIGHT--

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

//  MSP430G2xx1 Demo - DCO Calibration Constants Programmer

//

//  NOTE: THIS CODE REPLACES THE TI FACTORY-PROGRAMMED DCO CALIBRATION

//  CONSTANTS LOCATED IN INFOA WITH NEW VALUES. USE ONLY IF THE ORIGINAL

//  CONSTANTS ACCIDENTALLY GOT CORRUPTED OR ERASED.

//

//  Description: This code re-programs the G2xx1 DCO calibration constants.

//  A software FLL mechanism is used to set the DCO based on an external

//  32kHz reference clock. After each calibration, the values from the

//  clock system are read out and stored in a temporary variable. The final

//  frequency the DCO is set to is 1MHz, and this frequency is also used

//  during Flash programming of the constants. The program end is indicated

//  by the blinking LED.

//  ACLK = LFXT1/8 = 32768/8, MCLK = SMCLK = target DCO

//  //* External watch crystal installed on XIN XOUT is required for ACLK *//

//

//           MSP430G2xx1

//         ---------------

//     /||            XIN|-

//      | |               | 32kHz

//      --|RST        XOUT|-

//        |               |

//        |           P1.0|--> LED

//        |           P1.4|--> SMLCK = target DCO

//

//  A. Dannenberg

//  Texas Instruments Inc.

//  May 2010

//  Built with CCS Version 4.2.0 and IAR Embedded Workbench Version: 3.42A

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

#include


#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

推荐阅读

史海拾趣

安纳森(AnaSem)公司的发展小趣事

在电子行业中,晶振模组是众多电子设备不可或缺的核心组件。安纳森(AnaSem)公司自创立之初,便致力于研发创新的晶振模组技术。面对市场上多数厂家仍依赖传统晶体制作方法的现状,安纳森凭借其深厚的研发实力和前瞻性的技术视野,成功研发出以单体式集成电路为核心的晶振模组制作技术。这一技术的突破不仅大幅提升了晶振模组的性能与稳定性,更使得安纳森在激烈的市场竞争中脱颖而出,迅速占据了行业的一席之地。

Headland Technology Product Group公司的发展小趣事

在电子行业中,产品质量是企业生存和发展的基石。HBControls深知这一点,因此始终将品质管理放在首位。公司建立了完善的质量管理体系,从原材料采购、生产加工到成品检验,每一个环节都严格把关。此外,HBControls还定期对员工进行质量意识培训,确保每一位员工都能将品质理念融入到日常工作中。正是凭借卓越的产品质量和优质的服务,HBControls赢得了众多客户的信赖和好评。

E-San Electronic Co Ltd公司的发展小趣事

E-San Electronic Co Ltd的创始人李明,在电子科技行业摸爬滚打多年后,决定创立自己的公司。创业初期,公司面临着资金短缺、技术瓶颈和市场竞争激烈的挑战。李明凭借对电子技术的深刻理解和敏锐的市场洞察力,带领团队成功研发出了一款具有创新性的电子产品,并成功打入市场。这款产品以其高性价比和稳定的性能赢得了消费者的青睐,为公司带来了第一笔可观的收入,也为后续的发展奠定了坚实的基础。

Entegris公司的发展小趣事

在半导体材料领域,对纯度的要求越来越高。Entegris通过不断的技术创新,提升材料的纯度,以满足晶圆厂对材料的高要求。同时,随着制程工艺的步骤增多,控制污染的环节也随之增加,Entegris在微尘控制方面也面临着巨大的挑战。

Capax Technologies Inc公司的发展小趣事

Capax Technologies Inc的成功还得益于与各大企业的紧密合作。公司与多家知名的电子设备制造商建立了长期稳定的合作关系,为其提供高品质的组件和技术支持。通过与合作伙伴的共同努力,Capax Technologies Inc的产品得以广泛应用在各类电子设备中,进一步提升了公司的知名度和市场份额。

GREEGOO公司的发展小趣事
在需要时钟分路的地方,使用专用的时钟分路、放大、整形的芯片,以确保时钟信号的无衰减传输。

问答坊 | AI 解惑

Protel 99从入门到精通教程(上)

送给大家一本比较完美的99教程 中册:https://bbs.eeworld.com.cn/thread-52306-1-4.html 下册:https://bbs.eeworld.com.cn/thread-52318-1-8.html …

查看全部问答>

中国将于2010年推出千万亿次超级计算机

本帖最后由 jameswangsynnex 于 2015-3-3 20:00 编辑 曙光信息产业有限公司总裁历军日前在曙光天津产业基地接受新华社记者采访时表示,2010年,曙光将推出基于“龙芯四号”处理器的千万亿次高性能服务器“曙光6000”超级计算机。   200 ...…

查看全部问答>

【藏书阁】谐波抑制和无功功率补偿

     抑制谐波和提高功率因数是涉及电力电子技术、电气自动化技术和电力系统的一个重大课题。随着电力电子技术的不断进步,新型有源谐波抑制技术和无功补偿技术得到了迅速的发展。本书主要介绍有源电力滤波器、混合型电力滤波器 ...…

查看全部问答>

各种复位IC的介绍及复位电路的设计(周工强悍资料)

对于单片机系统来说,复位电路应该是最为最要的一个环节。往往被很多人忽略,因为一般简单的复位电路在开发试验阶段是没有问题的,只有在工作环境中才容易出现问题。所以在此推荐这份资料希望大家重视,复位IC并不会增加太多成本,但是更有保障。 ...…

查看全部问答>

控制2440的GPIO,遇到一个特别奇怪的问题:

EBOOT中,遇到一个特别奇怪的问题: GPG11是一个控制脚位,控制一个三极管,来控制电源。 volatile S3C2440A_IOPORT_REG *s2440IOP = (S3C2440A_IOPORT_REG *)OALPAtoVA(S3C2440A_BASE_REG_PA_IOPORT, FALSE); s2440IOP->GPGCON = ((s2440IOP->G ...…

查看全部问答>

外包:在WCE平台中做boot logo !!

平台:intel pxa255, wince4.2,屏幕 320*240 有成功做过的朋友联系我,待遇面议,新手勿扰,谢谢 010-82867177-220  王先生…

查看全部问答>

CE4.2 ,5.0,数据库,自启动,快捷方式,就这些关键词了,在线的进来看看!

先描述下基本情况: 硬件平台:270   系统版本:4.2&5.0 问题:通过创建快捷方式实现自动注册数据库 现在5.0下已经做好了,在4.2下用同样的方式出现了一些意外,搞了两天也没弄明白该怎么解决,过来看看有做过的没 问题主要出现在把 ...…

查看全部问答>

晶震频率从哪可以看到?

请问在keil c的\"Option for target\"选项中的\"taget选项卡\",有项叫xtal(晶震频率)的,我在教程中看到,编译代码前我们要在这里改成跟我们单片机相同的效率才行,但是我怎么知道我的51板子的晶震频率是多少呢?可以从板子或芯片中的某个地方看到吗?…

查看全部问答>

程序烧入FLASH 复位不能运行的问题?

本帖最后由 dontium 于 2015-1-23 13:31 编辑 看看论坛,好象很多战友都遇到了这个问题,不知道大家是怎么解决的, 我遇到的问题是这样的,我用汇编编写了一个小程序,小于1K,作用是把GPIO拉高, 在调试时候运行正确,烧入FLASH中的数据,对应 ...…

查看全部问答>