历史上的今天
今天是:2025年02月17日(星期一)
2020年02月17日 | MSP430入门-----总算读懂例程中的用调节DCO频率
2020-02-17 来源:eefocus
//******************************************************************************
// MSP-FET430P140 Demo - Basic Clock, Implement Auto RSEL SW FLL
//
// Description: Set DCO clock to (Delta)*(4096) using software FLL. DCO clock
// is output on P5.5 as SMCLK. DCO clock, which is the selected SMCLK source
// for timer_A is integrated over LFXT1/8 (4096) until SMCLK is is equal
// to Delta. CCR2 captures ACLK. To use Set_DCO Timer_A must be
// operating in continous mode. Watch crystal for ACLK is required for
// this example. Delta must be kept in a range that allows possible
// DCO speeds. Minimum Delta must ensure that Set_DCO loop
// can complete within capture interval. Maximum delta can be calculated be
// f(DCOx7) / 4096. f(DCOx7) can be found in device specific datasheet.
// ACLK = LFXT1/8 = 32768/8, MCLK = SMCLK = target DCO
// //* External watch crystal installed on XIN XOUT is required for ACLK *//
//
// MSP430F149
// ---------------
// /|| XIN|-
// | | | 32kHz
// --|RST XOUT|-
// | |
// | P5.5|--> SMLCK = target DCO
// | P5.6|--> ALCK = 4096
//
//
// M. Buccini
// Texas Instruments Inc.
// Feb 2005
// Built with IAR Embedded Workbench Version: 3.21A
//******************************************************************************
#include void Set_DCO (void); void main(void) { WDTCTL = WDTPW + WDTHOLD; // Stop WDT P5DIR |= 0x60; // P5.5,6 output P5SEL |= 0x60; // P5.5,6 SMCLK, ACLK output Set_DCO(); // Set DCO while (1); } //------------------------------------------------------------------------------ void Set_DCO (void) // Set DCO to selected frequency //------------------------------------------------------------------------------ { //#define DELTA 900 // target DCO = DELTA*(4096) = 3686400 #define DELTA 256 // target DCO = DELTA*(4096) = 1048576//DCO频率 //#define DELTA 70 // target DCO = DELTA*(4096) = 286720 unsigned int Compare, Oldcapture = 0; BCSCTL1 |= DIVA_3; // ACLK= LFXT1CLK/8 CCTL2 = CM_1 + CCIS_1 + CAP; // CAP, ACLK TACTL = TASSEL_2 + MC_2 + TACLR; // SMCLK, cont-mode, clear while (1) { while (!(CCIFG & CCTL2)); // Wait until capture occured CCTL2 &= ~CCIFG; // Capture occured, clear flag Compare = CCR2; // Get current captured SMCLK Compare = Compare - Oldcapture; // SMCLK difference Oldcapture = CCR2; // Save current captured SMCLK if (DELTA == Compare) break; // If equal, leave "while(1)" else if (DELTA < Compare) // DCO is too fast, slow it down { DCOCTL--; if (DCOCTL == 0xFF) { if (!(BCSCTL1 == (XT2OFF + DIVA_3)))//这儿用实际的数值表示可能更明确点!!//减的极限 BCSCTL1--; // Did DCO roll under?, Sel lower RSEL } } else { DCOCTL++; if (DCOCTL == 0x00) { if (!(BCSCTL1 == (XT2OFF + DIVA_3 + 0x07)))//加的极限。 BCSCTL1++; // Did DCO roll over? Sel higher RSEL } } } CCTL2 = 0; // Stop CCR2 TACTL = 0; // Stop Timer_A } 其中DCOCTL,BCSCTL1的加减需要结合寄存器看。 如果直接写成数值的形式,理解好点。 调节频率,有点类似万用表的电压,先选好档位,再调节。其中BCSCTL1就是档位,而DCOCTL就是说的具体调节。 在每个加减都有溢出情况对于DCOCTL; BCSCTL1,res0~7,分成八个档位。
史海拾趣
|
先说明一点,希望有知道的给小弟一点建议,不知道的不要说,就说自己不清楚或者是知道一点,就行,这样我能准确的判断问题,不要担心分值的问题,只要回复我就给分,24小时之内结贴,说到做到,看我的结帖率就知道了! 小弟想问一个问题,我想上北 ...… 查看全部问答> |
|
是这样的,我做了打印机的驱动,然后在“画笔”中打印,发现DrvEnablePDEV进去了,可是立马又调用了DrvDisablePDEV,连DrvStartDoc都没有进去,是不是因为没有AddForm导致的,还会不会有其它的问题导致这种现象?我非常渴望大家的意见。… 查看全部问答> |
|
430做的保护器,可以控制SIM300模块发送接收短信,现在有的问题,当设备运行久了,就会出现死机,或不响应命令即不接收短信,刚开始一切正常,过差不多一天多点就出现问题了,请高人指点… 查看全部问答> |
|
老师给的一个任务,开始就遇到麻烦了,请教大家如何解决呢?关于ceconfig.h的 老师拿来一个程序让我修改,是用在手机上一个软件的算法,我在编译原代码的时候发现VC++6.0出错,提示没有cecongfig.h的头文件。小弟没有搞过嵌入式开发,上网一搜才知道是windous ce 下设置环境变量的头文件。 现在问题是,我的机子又不是用windo ...… 查看全部问答> |
|
我用的是4系列的,问个关于内部RTC写入的问题。 当RTC配置好启动后。如果用户需要通过按键修改时间的话,修改RTCHOUR和RTCMIN的时候,需要事先关闭RTC模块吗?还是直接改写就可以呢?怎样做是安全的,不会出错的? 430的内部RTC还有什么其它的注 ...… 查看全部问答> |
|
【连载】【ALIENTEK 战舰STM32开发板】STM32开发指南--第三十五章 DS18B20数字温度... 第三十五章 DS18B20数字温度传感器实验 STM32虽然内部自带了温度传感器,但是因为芯片温升较大等问题,与实际温度差别较大,所以,本章我们将向大家介绍如何通过STM32来读取外部数字温度传感器的温度,来得到较为准确的环 ...… 查看全部问答> |




