起因

在调试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 <msp430.h>#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.99MHzunsigned 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 WDTfor (i = 0; i < 0xfffe; i++);             // Delay for XTAL stabilizationP1OUT = 0x00;                             // Clear P1 output latchesP1SEL = 0x10;                             // P1.4 SMCLK outputP1DIR = 0x11;                             // P1.0,4 outputj = 0;                                    // Reset pointerSet_DCO(DELTA_16MHZ);                     // Set DCO and obtain constantsCAL_DATA[j++] = DCOCTL;CAL_DATA[j++] = BCSCTL1;Set_DCO(DELTA_12MHZ);                     // Set DCO and obtain constantsCAL_DATA[j++] = DCOCTL;CAL_DATA[j++] = BCSCTL1;Set_DCO(DELTA_8MHZ);                      // Set DCO and obtain constantsCAL_DATA[j++] = DCOCTL;CAL_DATA[j++] = BCSCTL1;Set_DCO(DELTA_1MHZ);                      // Set DCO and obtain constantsCAL_DATA[j++] = DCOCTL;CAL_DATA[j++] = BCSCTL1;Flash_ptrA = (char *)0x10C0;              // Point to beginning of seg AFCTL2 = FWKEY + FSSEL0 + FN1;             // MCLK/3 for Flash Timing GeneratorFCTL1 = FWKEY + ERASE;                    // Set Erase bitFCTL3 = FWKEY + LOCKA;                    // Clear LOCK & LOCKA bits*Flash_ptrA = 0x00;                       // Dummy write to erase Flash seg AFCTL1 = FWKEY + WRT;                      // Set WRT bit for write operationFlash_ptrA = (char *)0x10F8;              // Point to beginning of cal constsfor (j = 0; j < 8; j++)*Flash_ptrA++ = CAL_DATA[j];            // re-flash DCO calibration dataFCTL1 = FWKEY;                            // Clear WRT bitFCTL3 = FWKEY + LOCKA + LOCK;             // Set LOCK & LOCKA bitwhile (1){P1OUT ^= 0x01;                          // Toggle LEDfor (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/8TACCTL0 = CM_1 + CCIS_1 + CAP;            // CAP, ACLKTACTL = TASSEL_2 + MC_2 + TACLR;          // SMCLK, cont-mode, clearwhile (1){while (!(CCIFG & TACCTL0));             // Wait until capture occuredTACCTL0 &= ~CCIFG;                      // Capture occured, clear flagCompare = TACCR0;                       // Get current captured SMCLKCompare = Compare - Oldcapture;         // SMCLK differenceOldcapture = TACCR0;                    // Save current captured SMCLKif (Delta == Compare)break;                                // If equal, leave "while(1)"else if (Delta < Compare){DCOCTL--;                             // DCO is too fast, slow it downif (DCOCTL == 0xFF)                   // Did DCO roll under?if (BCSCTL1 & 0x0f)BCSCTL1--;                        // Select lower RSEL}else{DCOCTL++;                             // DCO is too slow, speed it upif (DCOCTL == 0x00)                   // Did DCO roll over?if ((BCSCTL1 & 0x0f) != 0x0f)BCSCTL1++;                        // Sel higher RSEL}}TACCTL0 = 0;                              // Stop TACCR0TACTL = 0;                                // Stop Timer_ABCSCTL1 &= ~DIVA_3;                       // ACLK = LFXT1CLK
}
  • 第二个办法是,http://www.elprotronic.com/ , Elprotronic新版MSP430下载工具带有DCO校正功能。也可以使用MSP-GANG烧录工具来恢复,该工具支持重新效验DCO校准数据,然后写入information memory。

下次也记得个教训,在做BSL的时候,事先把DCO数据读出,做好备份工作。

参考

  • http://www.deyisupport.com/question_answer/microcontrollers/msp430/f/55/t/62646.aspx

  • http://download.csdn.net/download/xumiaofeng1982/5699199

msp430的DCO校准值被清除后该如何处理相关推荐

  1. mysql 值到99999后不增值了_MySQL数据库之更新语句精解(一)

    用于操作数据库的SQL一般分为两种,一种是查询语句,也就是我们所说的SELECT语句,另外一种就是更新语句,也叫做数据操作语句.言外之意,就是对数据进行修改.在标准的SQL中有3个语句,它们是INSE ...

  2. mysql 值到99999后不增值了_MySQL必知必会3

    创建和操纵表 创建表 输入 CREATE TABLE customers ( cust_id int NOT NULL AUTO_INCREMENT, cust_name char(50) NOT N ...

  3. 加速度传感器芯片MMA8451Q初步——倾角计算与校准值

    MMA845xQ系列是飞思卡公司出品的一系列加速度传感器芯片,通过测量XYZ三轴的加速度可以检测倾角,自由落体,翻转,脉冲,振动等一系列运动状态. 我用的是14位精度的MMA8451Q.单片机型号为S ...

  4. redis查询所有key值,redis清除所有key值

    redis查询所有key值 keys * redis清除所有key值 flushall

  5. html清除文本框储存记录值,如何清除edge浏览器中已保存的表单数据

    如何清除edge浏览器中已保存的表单数据 我们使用的edge浏览器,默认保存表单数据,想要进行清除,该怎么操作呢?今天就跟大家介绍一下如何清除edge浏览器中已保存的表单数据的具体操作步骤. 1. 首 ...

  6. 如何清除SQL数据库日志,清除后对数据库有什么影响

    1.打开查询分析器,输入命令 DUMP TRANSACTION 数据库名 WITH NO_LOG 2.再打开企业管理器--右键你要压缩的数据库--所有任务--收缩数据库--收缩文件--选择日志文件-- ...

  7. mysql 值到99999后不增值了_Mysql 增加新数据,若存在则更新的问题

    P.S. 基于mysql 5.6,数据库引擎是 InnoDB 解决方案: 1 .使用INSERT ... ON DUPLICATE KEY UPDATE Statement 语法:官网手册地址 2. ...

  8. blender2.8 bpy.data.images.new创建的图片返回值撤回操作后丢失

    解决办法来源 文档解释 报错内容 ReferenceError: StructRNA of type Image has been removed 情况 在使用image = bpy.data.ima ...

  9. 畅捷通T+密码清除后,空密码无法登录账套解决办法

    由于T+高版本设置了默认密码规则导致清除密码工具清除空密码无法显示登录账套 系统库和账套库中eap_user,找到账套主管,把password字段修改为(密码是abc.1234) +QtbwGjupS ...

最新文章

  1. 7 php程序的调试方法_PHP程序错误调试方法 让php显示错误提示
  2. 使用ping命令查看网络延迟--用Enki学Linux系列(7)
  3. Nebula:Slack 的覆盖全球性的开源网络
  4. Hibernate---对象的三种状态
  5. thinkcmf ajax,thinkcmfx 中如何用jquery ajax提交数据,自己尝试去做之后,还是没法提交,求助!...
  6. 初识二进制2:指令系统
  7. pytorch ocr_使用PyTorch解决CAPTCHA(不使用OCR)
  8. php 判断是不是gbk,PHP 正则判断中文UTF-8或GBK的思路及具体实现_PHP教程
  9. andorid 查看 Activity任务栈
  10. IC、FPGA验证学习
  11. p1904 p1903
  12. Vue.js 入门 :去哪儿网APP案例 学习记录
  13. FFT(快速傅里叶变化)学习
  14. 【工具】1063- 前端40+精选VSCode插件,总有几个你未拥有!
  15. mysql-8.0.21-winx64 安装
  16. (转)coures包下载和安装 可解决报错ImportError: No module named '_curses'
  17. 怎么确定步进电机的步距角
  18. java三大特征之封装,继承,多态浅析
  19. 当 SSR 遇上 Serverless,轻松实现页面瞬开
  20. Cisco系列路由器密码恢复研究与实践

热门文章

  1. 2013年9月4日第一篇CSDN个人博客
  2. [原创]jQuery推箱子小游戏(100关且可扩展可选关),休闲,对战,娱乐,小游戏,下载即用,兼容iPad移动端,代码注释全(附源码)
  3. 图片批量处理-图片批量处理软件
  4. 马甲包4.3混淆方案
  5. 安谋科技四周年献礼,提前完成五年规划目标
  6. 音频播放系列:测试用免费音乐链接
  7. 如何使用WPS在服务器端WORD文件转PDF
  8. 心田花开:三年级语文期末复习资料
  9. jelly 博客_Android –使用Jelly Bean通知
  10. android Pc端截屏方法