SP430系列MCU的卖点是超低功耗,除了端口的低漏电流之最之外,我认为和低功耗关系最大的莫过于他的时钟模块了。典型的430CPU一般可以在3个震荡器之中选取时钟源:低频晶体(LFXT)、高频晶体(XT)和内部的数控RC振荡器(DCO)。
前几周使用MSP430F449做产品,因为之前成功地使用过MSP430F149做过东西,心想449也是一个模子出来的换汤不换药,遂成竹在胸,殊不知,险些栽了跟头,就在这个多时钟源的时钟模块上。
449和149的时钟模块的最大区别在于449的时钟包含了可编程FLL模块,打开449的头文件,连寄存器的名字都和149完全不一样,一切均以“FLL”开头。少顷,但见其内容大同小异,遂把以前的写的149的时钟初始化代码中的寄存器改了名号,直接用在了449上。但是马上就出现了问题:在测试IFG1中的时钟失效标志位OFIFG之时,会不定期地出现OFIFG始终不复位的情况,程序就这样在这里止步不前(OFIFG置位表示至少有一个时钟源实效,如果置之不理,强行运行下面的代码的话,CPU有可能会强制使用DCO作为MCLK时钟源,这样就会使定时操作出现错误)。我的板子上接了32K的LFXT和8M的XT2,遂怀疑匹配负载电容有问题,因为低速晶体振荡器LFXT提供了内置的匹配电容。但是不管如何搭配内部与外部电容,始终不得解。
这之后的某日,我借出恭之便仔细研读了449文档里的时钟模块相关内容,发现OFIFG竟然是时钟模块控制寄存器FLL_CTL0中XT1OF、XT2OF、LFOF、DCOF这4的状态位相或的结果,顿时灵光一现,遂编写代码将相关状态位于几个管脚上LED关联,察看其状态,结果令我大吃一惊:我一直认为有重大嫌疑的LFXT和XT并没有任何问题,LFOF与XT2OF都会在上电后瞬间复位,而我一直觉得绝对不会有问题的DCOF却一直置位!
接下来,我仔细查阅了文档,原来在SCFI1中有5位设置了DCO tap数值,这个数值若这个数值设置的过高或过低都会使DCOF置位,从而使OFIFG置位,而PUC后这五位都是复位的,就是说,DCO tap值在PUC后被设置为最低值0,所以有可能会使DCOF置位。
上网搜了一下,其实这个DCO还是蛮强大的,虽说其频率会受到温度与电压的影响,通过调整也能到达相当的精度。因为我已经把LFXT和XT都备全了,这个应用也不需要节电,所以没有再太多的研究这个DCO到底怎么用,在程序里做了个计数,把DCO tap所有的可能数值都试了一下,以保证时钟初始化的顺利。
我最后时钟初始化代码如下,以供和我遇到同样问题的朋友参考。
/******************************************************/
//初始化系统时钟
void SysClkInit(void)
{
unsigned int i;
unsigned char DCOtap = 0x01;
SCFQCTL |= SCFQ_M;
FLL_CTL0 &= XCAP18PF;
_BIS_SR(OSCOFF);
FLL_CTL1 &= ~XT2OFF;
IFG1 &= ~OFIFG; // Clear oscillator fault flag
do
{
IFG1 &= ~OFIFG;
for (i = 5000; i; i--); // Delay
SCFI1 |= ((DCOtap++) & 0x0f) << 3;
} while (IFG1 & OFIFG); // Test osc fault flag
FLL_CTL1 = (SELM1 + SELS); // Select SMCLK source as XT2CLK
return;
}
/******************************************************/
这段代码已经经过反复测试,再也没有遇到时钟初始化通不过的情况了。
关键字:MSP430F449 时钟
引用地址:
关于MSP430F449时钟
推荐阅读最新更新时间:2024-03-16 15:06
STM32的系统时钟的配置的代码的讲解
ST公司默认是将系统时钟配置到72MHZ。 以下的七个步奏是设置系统时钟的函数,该函数截取自库文件system_stm32f10x.c。 将互联型相关的代码删掉便于分析,并标上了序号,总共七个步奏,这个顺序也是系统时钟配置的 的步奏,通过直接操作寄存器,主要相关的寄存器,主要是时钟配置寄存器RCC_CFGR,具体位的设置 和bit的含义,参考STM32参考手册 static void SetSysClockTo72(void) { __IO uint32_t StartUpCounter = 0, HSEStatus = 0; // SYSCLK, HCLK, PCLK2 and PCLK1 配置过程的顺序 //(1
[单片机]
基于门控时钟的低功耗电路实现方案
摘 要:研究了门控时钟技术在130 nm工艺、基于高阈值标准单元库下的低功耗物理实现方法。详细阐述了多级门控时钟技术的作用机制和参数的设置方法,给出了基于门控时钟的后端实现流程,着重分析了插入门控时钟对时钟偏移的影响并提出解决方案。在中芯国际130 nm工艺下用synop sys公司的DC, IC Comp iler, PT,VCS等工具完成物理实现。在10 M时钟下,总功耗降低22. 6 % ,面积也有所减小。 集成电路工艺节点的提升带来了芯片集成度的极大提高,同时也导致了功耗的急速增加。另外,市场对电子设备的大量需求使得系统功耗成为系统性能的一个重要指标,功耗的高低成了芯片厂商竞争力的焦点之一,功耗控制与管理已成为绝大多数
[工业控制]
AVR单片机做的电子时钟
#include avr/signal.h #include avr/interrupt.h #include avr/delay.h #include avr/wdt.h #include avr/eeprom.h #include math.h #include stdlib.h #include string.h #define uchar unsigned char #define uint unsigned int #define xtal 8 #define CS PA5 #define SID PA6 #define SCLK PA7 #define Set_CS() DDRA |= (
[单片机]
外部异步时钟的操作
#include iom16v.h #define uchar unsigned char #define uint unsigned int #define OUT PORTA uchar Da ta ;//={0,0,0,0}; uchar CNT;//定义中断次数 void DelayMs(uint i) //0.25ms {uchar j; for(;i!=0;i--) {for(j=250;j!=0;j--) {;}} } /************以下为显示*************************/ void Display(uchar *p) //适当地调节延时,可以改变其亮度 { OUT=0
[单片机]
STM32系统学习——RCC(使用HSE/HSI配置时钟)
** STM32系统学习——RCC(使用HSE/HSI配置时钟) ** RCC :reset clock control 复位和时钟控制器。主要讲解时钟部分,特别是要着重理解时钟树,理解了时钟树,STM32 的一切时钟的来龙去脉都会了如指掌。 一、RCC主要作用——时钟部分 设置系统时钟SYSCLK、设置AHB分频因子(决定HCLK是多少)、设置APB2分频因子(设定PCLK2等于多少)、设置APB1分频因子(决定PCLK1等于多少);控制AHB/APB2/APB1这3条总线开启,控制每个外设时钟的开启。 对于SYSCLK、HCLK、PCLK2、PCLK1这4个时钟的配置一般是:PCLK2=HCLK=SYSCLK=PLLC
[单片机]
单片机编程技巧-时钟中断
功能强大的时钟中断 在单片机程序设计中,设置一个好的时钟中断,将能使一个CPU发挥两个CPU的功效,大大方便和简化程序的编制,提高系统的效率与可操作性。我们可以把一些例行的及需要定时执行的程序放在时钟中断中,还可以利用时钟中断协助主程序完成定时、延时等操作。 下面以6MHz时钟的AT89C51系统为例,说明时钟中断的应用。 定时器初值与中断周期 时钟中断无需过于频繁,一般取20mS(50Hz)即可。如需要百分之一秒的时基信号,可取10mS(100Hz)。这里取20mS,用定时器T0工作于16位定时器方式(方式1)。T0的工作方式为:每过一个机器周期自动加1,当计满0FFFFh,要溢出时,便会产生中断,并由硬件设置相应的
[单片机]
单片机电子秒表时钟 数码管显示
电子秒表时钟 数码管显示 可设置时间 可用于秒表暂停、清零蜂鸣器按键音 单片机源程序如下: #include reg51.h #include delay.h #include intrins.h unsigned char code LED ={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40}; //定义共阴极LED7段显示码 unsigned char dispbit ={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; //定义数码管位码 unsigned char hour=23,min=58,sec=52,
[单片机]
stm32时钟设置函数
这里涉及到一个很重要的寄存器,时钟配置寄存器:RCC_CFGR 1 #if defined (STM32F10X_LD_VL) || (defined STM32F10X_MD_VL) || (defined STM32F10X_HD_VL) 2 /* #define SYSCLK_FREQ_HSE HSE_VALUE */ 3 #define SYSCLK_FREQ_24MHz 24000000 4 #else 5 /* #define SYSCLK_FREQ_HSE HSE_VALUE */ 6 /* #define SYSCLK_FREQ_24MHz 24000000 */ 7 /* #define SY
[单片机]