起因
在調(diào)試MSP430G系列的單片機(jī)的過(guò)程,發(fā)現(xiàn)不怎么的,時(shí)鐘頻率發(fā)生了變化,時(shí)間一下都對(duì)不上了。查收些資料說(shuō),DCO的值有可能被擦除了導(dǎo)致時(shí)鐘不對(duì)的。細(xì)想一下,好像是在調(diào)試的過(guò)程中,出現(xiàn)調(diào)試不了的現(xiàn)象就在IAR里點(diǎn)擊的“Erase memory”。把查找的資料記錄下來(lái),所以就有這篇文章。
問(wèn)題描述
因?yàn)镈CO校準(zhǔn)值在MCU出廠時(shí)保存于信息段A,一般是不允許清除信息段A的。
且示例代碼中,有如下語(yǔ)句:
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
可以看出在啟動(dòng)時(shí)都先檢查DCO1MHZ的校準(zhǔn)值是否為0xFF,是則進(jìn)入while(1)死循環(huán)。
正常情況下因?yàn)樾畔⒍蜛不清除沒(méi)問(wèn)題的,但是我測(cè)試BSL下載時(shí),故意給錯(cuò)誤的BSL密碼,導(dǎo)致FLASH都被擦除,發(fā)現(xiàn)轉(zhuǎn)載DCO校準(zhǔn)值的信息段A也被清掉了,于是程序運(yùn)行到上面的代碼時(shí)即進(jìn)入死循環(huán)。
解決辦法
針對(duì)于這種DCO數(shù)據(jù)被擦除的情況,一般的解決辦法是,通過(guò)利用Timer捕捉外部的32.768K晶振或是時(shí)鐘源,然后得到1M,8M或是12Mhz之類的DCO的數(shù)值,然后在直接寫(xiě)入segment flashA里面。
有兩個(gè)解決方案供選擇:
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
上一篇:使用Energia開(kāi)發(fā)MSP430 LAUNCHPAD學(xué)習(xí)筆記2--串口通信
下一篇:MSP430如何使用energia
推薦閱讀最新更新時(shí)間:2025-07-02 21:45





- 熱門(mén)資源推薦
- 熱門(mén)放大器推薦
設(shè)計(jì)資源 培訓(xùn) 開(kāi)發(fā)板 精華推薦
- Microchip 升級(jí)數(shù)字信號(hào)控制器(DSC)產(chǎn)品線 推出PWM 分辨率和 ADC 速度業(yè)界領(lǐng)先的新器件
- 意法半導(dǎo)體STM32MP23x:突破成本限制的工業(yè)AI應(yīng)用核心
- 意法半導(dǎo)體推出用于匹配遠(yuǎn)距離無(wú)線微控制器STM32WL33的集成的匹配濾波芯片
- ESP32開(kāi)發(fā)板連接TFT顯示屏ST7789跳坑記
- 如何讓ESP32支持analogWrite函數(shù)
- LGVL配合FreeType為可變字體設(shè)置字重-ESP32篇
- 使用樹(shù)莓派進(jìn)行 ESP32 Jtag 調(diào)試
- ESP32怎么在SPIFFS里面存儲(chǔ)html,css,js文件,以及網(wǎng)頁(yè)和arduino的通訊
- ESP32 freeRTOS使用測(cè)試
- 使用 ROHM Semiconductor 的 BU4228 的參考設(shè)計(jì)
- ADR530A 3V 輸出高精度并聯(lián)模式電壓基準(zhǔn)的典型應(yīng)用
- 使用 Microchip Technology 的 MIC2829-B0YAB 的參考設(shè)計(jì)
- LT3580、3V-10V 至 12V、300mA 升壓轉(zhuǎn)換器
- 使用 LT1054CSW 應(yīng)變計(jì)電橋信號(hào)調(diào)節(jié)器的典型應(yīng)用
- 使用 STMicroelectronics 的 R5974D 的參考設(shè)計(jì)
- LTC2351HUH 6 通道、14 位、1.5Msps 關(guān)斷同步采樣 ADC 的典型應(yīng)用
- 用于確定 L6566B SMPS 電源多模式控制器的 OVP 和 OCP 上的 IC 行為的典型外部電路
- SY58021U-EVAL,用于 GB 以太網(wǎng)交換機(jī)的 SY58021U 4000-MHz 時(shí)鐘緩沖器的評(píng)估板
- DC2076A-B,基于 LTC6430-20 優(yōu)化的 300MHz 至 1000MHz 差分 ADC 驅(qū)動(dòng)器、IF/RF 放大器的演示板
- 關(guān)于示波器的底噪
- 防爆電機(jī)進(jìn)水原因_防爆電機(jī)進(jìn)水怎么處理
- 絕緣電阻測(cè)試儀使用指導(dǎo)
- 伏達(dá)半導(dǎo)體推出50W車載無(wú)線充解決方案,充電效率高達(dá)77%
- STM8S自學(xué)筆記-002 STM8初上手和開(kāi)發(fā)環(huán)境的建立
- 微軟留下特別通道 讓不支持的硬件上用鏡像安裝了Windows 11
- 早高FENG:iOS/iPadOS 15.3首個(gè)公測(cè)發(fā)布/Safari技術(shù)預(yù)覽版更新了
- 基于AT89C51單片機(jī)的雨量數(shù)碼管顯示設(shè)計(jì)
- STM32比較常見(jiàn)的BUG總結(jié)
- 研華新品搭載最新 AMD Ryzen 嵌入式 8000 系列處理器,驅(qū)動(dòng)AI 智能新篇章
- 美國(guó)EDA恢復(fù)供應(yīng)?
- 從追趕到超越:的盧深視的“AI +三維機(jī)器視覺(jué)“破局之戰(zhàn)
- 常用的音頻處理器有哪些應(yīng)用場(chǎng)景
- 研究顯示2035年全球酒店服務(wù)機(jī)器人市場(chǎng)規(guī)模有望達(dá)125億美元
- i9-14900HX對(duì)比一款換湯不換藥的馬甲老U R9-8945HX
- 納祥科技2W 24位數(shù)字功放NX4920,可用于AI語(yǔ)音播報(bào)、WIFI播放器
- 常用解調(diào)器的定義和工作原理
- 從性能與網(wǎng)絡(luò)傳輸出發(fā),講講鐵威馬MAX系列為什么一騎絕塵
- 惠普選中Hailo下一代人工智能加速器,革新零售業(yè)與酒店業(yè)運(yùn)營(yíng)模式
- 對(duì)于豐田的核心產(chǎn)品E-CVT變速箱你又了解多少?
- Waymo的自動(dòng)駕駛汽車還有哪些不足之處?
- 4D成像雷達(dá)或成就自動(dòng)駕駛關(guān)鍵技術(shù)
- 索尼新推可可穿戴空調(diào),內(nèi)置運(yùn)動(dòng)傳感器冬暖夏涼
- 資本圈地加速,智慧泊車戰(zhàn)火越燒越旺
- 89C52和HD7279A的接口與編程
- 工業(yè)物聯(lián)網(wǎng)安全換一個(gè)思路破局
- 恩智浦與Kontron即將開(kāi)展合作 滿足下一代工業(yè)物聯(lián)網(wǎng)需求
- AI機(jī)器人的工作邊界在哪?
- 解密讓服務(wù)機(jī)器人自由移動(dòng)的技術(shù)