国产精品久久久久影院,成人午夜福利视频,国产精品久久久久高潮,国产精品 欧美 亚洲 制服,国产精品白浆无码流出

msp430的DCO校準(zhǔn)值被清除后該如何處理

發(fā)布者:760802csy最新更新時間:2019-10-23 來源: eefocus關(guān)鍵字:msp430  DCO  校準(zhǔn)值 手機看文章 掃描二維碼
隨時隨地手機看文章

起因

在調(diào)試MSP430G系列的單片機的過程,發(fā)現(xiàn)不怎么的,時鐘頻率發(fā)生了變化,時間一下都對不上了。查收些資料說,DCO的值有可能被擦除了導(dǎo)致時鐘不對的。細(xì)想一下,好像是在調(diào)試的過程中,出現(xiàn)調(diào)試不了的現(xiàn)象就在IAR里點擊的“Erase memory”。把查找的資料記錄下來,所以就有這篇文章。


問題描述

因為DCO校準(zhǔn)值在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的校準(zhǔn)值是否為0xFF,是則進(jìn)入while(1)死循環(huán)。 

正常情況下因為信息段A不清除沒問題的,但是我測試BSL下載時,故意給錯誤的BSL密碼,導(dǎo)致FLASH都被擦除,發(fā)現(xiàn)轉(zhuǎn)載DCO校準(zhǔn)值的信息段A也被清掉了,于是程序運行到上面的代碼時即進(jìn)入死循環(huán)。


解決辦法

針對于這種DCO數(shù)據(jù)被擦除的情況,一般的解決辦法是,通過利用Timer捕捉外部的32.768K晶振或是時鐘源,然后得到1M,8M或是12Mhz之類的DCO的數(shù)值,然后在直接寫入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

[1] [2]
關(guān)鍵字:msp430  DCO  校準(zhǔn)值 引用地址:msp430的DCO校準(zhǔn)值被清除后該如何處理

上一篇:使用Energia開發(fā)MSP430 LAUNCHPAD學(xué)習(xí)筆記2--串口通信
下一篇:MSP430如何使用energia

推薦閱讀最新更新時間:2025-07-02 21:45

MSP430初學(xué):MSP430單片機C語言基礎(chǔ)(一)
1.1標(biāo)識符與 關(guān)鍵字 標(biāo)識符用來標(biāo)識程序中某個對象的名字,這些對象可以是語句、數(shù)據(jù)類型、函數(shù)、變量、常量、數(shù)組等。標(biāo)識符由字母,數(shù)字或下畫線構(gòu)成,其第一個字符必須是字母或下畫線。 例如,count_data,text2 是正確形式,而 2count 是錯誤形式。 哈哈,c語言有關(guān)的知識我就不記錄那么多了,大家都會 1.2變量 在定義變量時,變量的類型必須與其被儲存的數(shù)據(jù)類型相匹配,以保證程序中變量能夠被正確地使用。當(dāng)指定了變量的數(shù)據(jù)類型時,系統(tǒng)將為它分配若干相應(yīng)字節(jié)的內(nèi)存空間。 C430中變量類型以及描述如下: 這篇博客里,說明了一些其它的數(shù)據(jù)類型,在使用430的時候,會用到: c++ 基礎(chǔ)數(shù)據(jù)類型 與
[單片機]
<font color='red'>MSP430</font>初學(xué):<font color='red'>MSP430</font>單片機C語言基礎(chǔ)(一)
msp430的中斷|中斷優(yōu)先級|中斷嵌套
MSP430的中斷優(yōu)先級按所在的向量的大小排列,中斷向量地址越高優(yōu)先級就越大,但是默認(rèn)的MSP430是不能中斷嵌套的,要想在執(zhí)行某一中斷時能夠響應(yīng)更高優(yōu)先級的中斷,需要在低優(yōu)先級的中斷程序中手動打開全局中斷便能位,因為在進(jìn)入中斷服務(wù)子程序時全局中斷便能位被清零,即禁止響應(yīng)其它中斷。 msp430的指令中,DINT和EINT分別指關(guān)和開所有中斷,也就是包涵P1IE、P2IE、WDTIE、TAIE、TBIE、ADC12IE、串口中斷允許的所有中斷允許位為“0”和為“1”。 當(dāng)同時有多個中斷來的時候才有優(yōu)先級的考慮(優(yōu)先級順序可查看向量表) 有中斷響應(yīng)以后自動關(guān)閉總中斷,這個時候即使來更高優(yōu)先級的中斷都不會響應(yīng) 要中斷嵌套的話,
[單片機]
MSP430F169(二)——UART中斷(論下)
1. UART中斷工作的機制 UART只有一個發(fā)送中斷向量和一個接收中斷向量,通過判斷中斷向量的標(biāo)志來控制數(shù)據(jù)的收發(fā) 1.1 發(fā)送機制 當(dāng)用戶想發(fā)送數(shù)據(jù)時,UxIFG產(chǎn)生一個中斷,表明UxTXBUF已經(jīng)準(zhǔn)備好接收數(shù)據(jù)。當(dāng)UxTXBUF接收字符后或中斷被執(zhí)行,URXIFG將會復(fù)位。 SWRST = 1或PUC會置位UxIFG (SWRST: 系統(tǒng)復(fù)位) SWRST = 1或PUC會復(fù)位UxIE 1.2接收機制 UxRXBUF每次接收一個字符并加載時,URXIFGx會產(chǎn)生一個中斷標(biāo)記 UxRXBUF被讀取時或中斷被執(zhí)行時,URXIFG被自動復(fù)位 當(dāng)PUC或SWRST = 1時UxRXIE 復(fù)位 建議接收中斷函數(shù)的代碼要精簡,執(zhí)
[單片機]
基于MSP430F149單片機的實時多任務(wù)操作系統(tǒng)
1 RTOS的基本概念 實時多任務(wù)操作系統(tǒng)(RTOS-Real Time Operating System)是根據(jù)操作系統(tǒng)的工作特性而言的。實時是指物理進(jìn)程的真實時間。實時操作系統(tǒng)是指具有實時性,能支持實時控制系 統(tǒng)工作的操作系統(tǒng)。首要任務(wù)是調(diào)度一切可利用的資源完成實時控制任務(wù),重要特點是要滿足對時間的限制和要求。 實時操作系統(tǒng)中的任務(wù)(Task)有四種狀態(tài):運行(Executing),就緒(Ready),掛起(Suspended),休眠(Dormant)。 運行:獲得CPU控制權(quán)。 就緒:進(jìn)入任務(wù)等待隊列。通過調(diào)度轉(zhuǎn)為運行狀態(tài)。 掛起:任務(wù)發(fā)生阻塞,移出任務(wù)等待隊列,等待系統(tǒng)實時事件的發(fā)生而喚醒。從而轉(zhuǎn)為就
[單片機]
MSP430硬件I2C使用方法——以BH1710和AT24C02為例
硬件的I2C控制器終于調(diào)出來了,這些天一直在鉆死胡同,其實最好的參考資料還是TI官方提供的。代碼參考了MSP430的User’s Guide和Application Note,下面提供IAR工程并做簡要解釋: 采用的芯片:MSP430F1611(USART0 Master方式) 設(shè)備地址:BH1710(寫地址0x46,讀地址0x47),AT24C02(寫地址0xA0,讀地址0xA1) 接口電路: 一般情況下,大家在調(diào)試I2C設(shè)備時會首先考慮采用IO口模擬I2C總線的方法,這樣的方法思路簡單,只需要給出正確的時序即可。但是這樣也有意想不到的問題,比如時序的嚴(yán)格性:同樣的時序,在BH1710上就能跑通而AT24C02上就時
[單片機]
<font color='red'>MSP430</font>硬件I2C使用方法——以BH1710和AT24C02為例
基于uC/OS與MSP430的手持?jǐn)?shù)據(jù)采集系統(tǒng)
摘要:本文介紹了使用TI公司的超低功耗MSP430單片機與uC/OS相結(jié)合設(shè)計數(shù)據(jù)采集系統(tǒng)的方法,采用了uC/OS的多任務(wù)的軟件設(shè)計方式代替了傳統(tǒng)的前后臺式的嵌入式軟件設(shè)計方法,使得軟件系統(tǒng)模塊化,并且克服了前后臺式軟件設(shè)計的弊端,增前了系統(tǒng)的實時性。 1前言 近年來隨著IC設(shè)備功耗和體積的不斷減小,手持設(shè)備的應(yīng)用領(lǐng)域變的越來越廣泛。但是另一方面,傳統(tǒng)的前后臺式的軟件設(shè)計方法卻限制了硬件系統(tǒng)功能的充分發(fā)揮,影響了系統(tǒng)的實時性與穩(wěn)定性。本文介紹了一種基于嵌入式操作系統(tǒng)uC/OS上設(shè)計系統(tǒng)軟件的方法,即克服了原有前后臺式軟件設(shè)計的一些弊端,又充分發(fā)揮了硬件特性,增強了系統(tǒng)穩(wěn)定性,很好的解決了手持?jǐn)?shù)據(jù)采集設(shè)備多任務(wù)軟件系統(tǒng)實時性不強
[單片機]
基于uC/OS與<font color='red'>MSP430</font>的手持?jǐn)?shù)據(jù)采集系統(tǒng)
MSP430數(shù)字濾波器設(shè)計分享
大家一直有在討論使用TI內(nèi)部的數(shù)字濾波器,但是由于其調(diào)用的麻煩,以及匯編代碼看的累,所以經(jīng)常會碰到各式各樣的問題,我以前也有幫工程師解惑,現(xiàn)在做個分享帖給大家,希望大家多多支持,讓MSP430的作用更為廣泛。 1.軟件介紹:Filter solution 2.軟件界面介紹: 該軟件不僅能設(shè)計數(shù)字濾波器,模擬濾波器一樣可以搞定。 3.開始設(shè)計數(shù)字濾波器: 4.頻響測試: 5.代碼生成:
[單片機]
<font color='red'>MSP430</font>數(shù)字濾波器設(shè)計分享
基于MSP430的高精度低功耗數(shù)字多功能表設(shè)計2
2.2.4 電容的測量 頻率法測電容,選用NE555與待測電容形成諧振電路,諧振頻率與電容值之間存在f=1.49/(Ra+2Rb)Cx的關(guān)系,通過對電路頻率的測量就可以得到電容值。 2.2.5 晶體三極管β值測量 根據(jù)三極管電流IC=βIB的關(guān)系,當(dāng)IB為固定值時,IC反映了β的變化,所以可以將變化的β值轉(zhuǎn)化為與之成正比變化的電流量。采用鏡像恒流源為基極提供10μA的穩(wěn)定電流,控制基極的電流恒定,通過運放將集電極電流信號轉(zhuǎn)換為電壓信號,輸出電壓等于電阻R19的分壓,進(jìn)而計算出IC,進(jìn)而通過公式β=Ic/Ib計算出結(jié)果。電路如圖5。通過S1控制可分別是對NPN型和PNP型三極管的β值測量。 2.2.6 顯示電路設(shè)計
[單片機]
基于<font color='red'>MSP430</font>的高精度低功耗數(shù)字多功能表設(shè)計2
小廣播
設(shè)計資源 培訓(xùn) 開發(fā)板 精華推薦

最新單片機文章
隨便看看

 
EEWorld訂閱號

 
EEWorld服務(wù)號

 
汽車開發(fā)圈

 
機器人開發(fā)圈

電子工程世界版權(quán)所有 京B2-20211791 京ICP備10001474號-1 電信業(yè)務(wù)審批[2006]字第258號函 京公網(wǎng)安備 11010802033920號 Copyright ? 2005-2025 EEWORLD.com.cn, Inc. All rights reserved