历史上的今天
返回首页

历史上的今天

今天是:2025年02月22日(星期六)

2020年02月22日 | 如何使用 MSP430 内部频率 VLO 以及如何校正频率

2020-02-22 来源:eefocus

1、需求定义


有时候为了节省成本,会尽量减少外部器件的花费,MSP430有一个内部 12KHz 的 VLO 频率,虽然有较大温飘和压飘,通过校正也是可以满足需求的。


2、什么是 VLO


 Very-Low-Power Low-FrequencyOscillator (VLO),也就是超低功耗低频振荡器;


 输出频率:标称 12KHz,3V 下最小 4KHz,最大 20KHz;


 功耗: 2.2V 下最大只有 0.7uA,比32K768的手表晶振 1.5uA 还低很多,这已经是 LPM3 模式下功耗最低的时钟源了;


 用途:可以用作 MSP430 的 ACLK,MCLK,SMCLK 时钟源;


3、如何使用 VLO


//******************************************************************************

//  Description; Pulse P1.0 with a 1/100 active duty cycle using software.

//  Ultra-low frequency ~ 1.5kHz, ultra-low power active mode demonstrated.

//  ACLK = VL0, MCLK = VLO/8 ~1.5kHz, SMCLK = n/a

//

//                MSP430G2xx1

//             -----------------

//         /||              XIN|-

//          | |                 |

//          --|RST          XOUT|-

//            |                 |

//            |             P1.0|-->LED

//

//******************************************************************************


#include


int main(void)

{

  volatile unsigned int i;                                   

  WDTCTL = WDTPW + WDTHOLD; 

  BCSCTL3 |= LFXT1S_2;                      // 选择时钟源:LFXT1 = VLO

  IFG1 &= ~OFIFG;                              // Clear OSCFault flag

  __bis_SR_register(SCG1 + SCG0);    

  BCSCTL2 |= SELM_3 + DIVM_3;       // 8分频:MCLK = LFXT1/8

  P1DIR = 0xFF;                            

  P1OUT = 0;                              

  P2DIR = 0xFF;                             

  P2OUT = 0;                               


  for (;;)

  {

    P1OUT |= 0x01;        

    for (i = 10; i > 0; i--);                

    P1OUT &= ~0x01;                    

    for (i = 1000; i > 0; i--);  

  }


}


4、如何校正 VLO 频率


 


VLO 非常适合做低功耗下的待机时钟,但是不同环境频率偏差太大,在TI的应用支持中就有一种方法来校准 VLO。


VLO 本身的输出频率并不能被改变,称作校准不是很确切。我们大部分情况下使用 VLO 低频时钟只是为了将单片机从低功耗模式下唤醒,也就是需要实用它产生一个从0到几十赫兹的唤醒信号。既然不能动时钟源,那我们就想办法改变定时器的计数来获得我们想要的唤醒信号。


在 msp430G2XXX 中还有一个时钟叫 DCO,主要用于时钟倍频。TI 为 msp430G2XXX 单片机提供了至少一个用于校准 DCO 的数据存放在 FLASH 中。


这个经过校准的最小 DCO 频率为 1MHz,我们可以通过书橱在一个或 X 个 VLO 周期内的 DCO 振荡次数 Y,这样 f(VLO)=f(DCO)*X/Y。知道 VLO 的频率之后,设置好定时器便可以获得我们需要的唤醒中断信号。并且这个唤醒信号的精度不依赖于VLO(当然温度和电压不能变化)。


实际应用可以隔一段时间重新校准一次 VLO,确保在温度变化时,唤醒信号的精度不随 VLO偏移。


 


TI 官网提供了较为完整的实例:


头文件 #include "VLO_Library.h":


#ifndef VLO_Library

#define VLO_Library

extern int  TI_measureVLO( void );

extern unsigned int TI_8MHz_Counts_Per_VLO_Clock;


#endif


校正源码:


;*******************************************************************************

;   L. Westlund

;   Texas Instruments Inc.

;   March 2006

;   Built with IAR Embedded Workbench Version: 3.40A

;*******************************************************************************


#include 


 


            MODULE  VLO_Library

            ;Variables

            PUBLIC  TI_8MHz_Counts_Per_VLO_Clock

            ;Functions

            PUBLIC  TI_measureVLO

            RSEG      DATA16_I

TI_8MHz_Counts_Per_VLO_Clock  DS 2


#ifdef TACCTL2_                             ; For non-Timer_A2 devices

  #define TACCTLX  TACCTL2

  #define TACCRX TACCR2

#else

  #define TACCTLX TACCTL0

  #define TACCRX TACCR0

#endif

            RSEG    CODE                    ; Code is relocatable

;-------------------------------------------------------------------------------

TI_measureVLO

;           returns: r12

;           -An int representing the number of 8MHz clock pulses in one VLO cycle

;           -This value is identical to the number put into TI_8MHz_Counts_Per_VLO_Clock

;-------------------------------------------------------------------------------

            mov.b   &BCSCTL1,     r15       ; preserve previous settings

            mov.b   &DCOCTL,      r14

            push.b  &BCSCTL2

            push.b  &BCSCTL3

            push.b  &P2SEL

            bic.b   #0xC0,        &P2SEL    ; clear P2SEL bits to avoid XTAL interference.

            mov.b   &CALBC1_1MHZ, &BCSCTL1  ; Set range

            mov.b   &CALDCO_1MHZ, &DCOCTL   ; Set DCO step + modulation

            mov.w   #CM_1+CCIS_1+CAP,&TACCTLX ; CAP, ACLK

            mov.w   #TASSEL_2+MC_2+TACLR, &TACTL; SMCLK, cont-mode, clear

            mov.b   #LFXT1S_2,    &BCSCTL3  ; ACLK = VLO

            clr.b   &BCSCTL2

            bis.b   #DIVA_3,      &BCSCTL1  ; ACLK=VLO/8

            bic.w   #CCIFG,       &TACCTLX  ; Clear capture flag

edge_one    bit.w   #CCIFG,       &TACCTLX  ; Test capture flag to skip first signal

            jz      edge_one

            bic.w   #CCIFG,       &TACCTLX  ; Clear capture flag

edge_two    bit.w   #CCIFG,       &TACCTLX  ; Test capture flag to skip second signal

            jz      edge_two                ;

            mov.w   &TACCRX,      r13       ; save hardware captured value

            bic.w   #CCIFG,       &TACCTLX  ; Clear capture flag

edge_three  bit.w   #CCIFG,       &TACCTLX  ; Test capture flag to capture a good clock

            jz      edge_three              ;

            bic.w   #MC_3,        &TACTL    ; stop timer

            mov.w   &TACCRX,      r12

            sub.w   r13,          r12

            mov.w   r12,          &TI_8MHz_Counts_Per_VLO_Clock

            mov.b   r15,          &BCSCTL1

            mov.b   r14,          &DCOCTL

            pop.b   &P2SEL

            pop.b   &BCSCTL3

            pop.b   &BCSCTL2

            ret


            END


应用实例:


//******************************************************************************


//  Description: This example toggles P1.0 on approximately a 1 second interval

//  The DCO is set to 8MHz to demonstrate that clock settings are preserved

//  across the function call.

//  ACLK = VLO, MCLK = SMCLK = 8MHz

//

//               MSP430F2012

//             -----------------

//         /||              XIN|-

//          | |                 |

//          --|RST          XOUT|-

//            |                 |

//            |       P1.4/SMCLK|-->SMCLK = 8MHz

//            |        P1.0/ACLK|-->LED 1 second interrupt

//

//******************************************************************************


#include 

推荐阅读

史海拾趣

Essentra Components公司的发展小趣事

Essentra Components公司自创立之初,就深知技术创新在电子行业的重要性。公司通过不断投入研发资源,成功开发出了一系列具有创新性的塑料注塑成型、乙烯基浸塑成型技术,这些技术不仅提高了产品的性能和质量,还大大降低了生产成本。随着技术的不断升级和完善,Essentra Components的产品逐渐在市场上占据了重要地位,公司也因此迅速发展壮大。

Advanced Ceramic X Corporation公司的发展小趣事

面对日益激烈的市场竞争,Essentra Components公司决定实施全球化战略,以拓展更广阔的市场。公司先后在亚洲、欧洲、美洲等多个地区设立了生产基地和销售服务点,实现了产品的全球覆盖。同时,公司还积极与当地企业合作,共同开发适合当地市场需求的产品,进一步巩固了其在全球市场的地位。

DIALIGHT公司的发展小趣事

DIALIGHT公司的故事始于1938年的纽约布鲁克林,当时该公司专注于为飞机生产仪表板灯。随着技术的不断进步和市场的变化,公司在1971年,即LED推出仅一年后,推出了他们的第一个LED产品。这一举措标志着DIALIGHT正式从传统的飞机仪表板灯制造转向LED照明技术的研发和应用。从此,DIALIGHT彻底改变了LED的用途,将其广泛应用于世界各地的交通控制、指示灯、结构塔和工业场所,为全球提供了优质的照明解决方案。

台湾凯励(Carli)公司的发展小趣事

在电子行业中,品质控制和质量管理是企业生存和发展的关键。凯励公司深知这一点,建立了严格的质量管理体系和检测机制。公司从原材料采购到生产制造、产品检测等各个环节都严格把控品质,确保产品的稳定性和可靠性。此外,凯励公司还引进了先进的生产设备和检测仪器,提高了生产效率和产品质量。

芯力微(CHI Power)公司的发展小趣事

在电子行业的快速发展中,芯力微公司始终保持着敏锐的市场洞察力。2010年,随着智能手机市场的崛起,公司迅速识别到电源管理芯片的巨大潜力。通过持续的技术研发,芯力微成功推出了具有低压低功耗特点的电源管理芯片,赢得了市场的广泛认可。这一技术突破不仅帮助公司进入了新的市场领域,也为后续的发展奠定了坚实的基础。

ESPROS [Espros Photonics corp]公司的发展小趣事

ESPROS在飞行时间(Time-of-Flight,简称ToF)技术领域取得了显著突破。ToF技术是一种用于测量光在物体上反射所需时间的测距技术,它在3D视觉应用中具有广泛的应用前景。ESPROS凭借其多年的技术积累,成功开发出从单点传感器到QVGA面阵的完整ToF产品线,为客户提供了全方位的3D ToF解决方案。

问答坊 | AI 解惑

很想知道学会了单片机研发,工资一般能拿多少啊?能达到6000吗?

很想知道学会了单片机研发,工资一般能拿多少啊?能达到6000吗?…

查看全部问答>

中移动Ophone手机主界面曝光 5月底正式发布

本帖最后由 jameswangsynnex 于 2015-3-3 19:57 编辑 5月11日消息,据中国移动相关人士透露,5月中下旬中移动将正式公开发布采用OMS手机操作系统(Open mobile system)的Ophone手机。这将意味着中国自主研发的OMS手机操作系统将正式走上前台,向 ...…

查看全部问答>

【FPGA 代码】

持续赋值方式定义的2 选1 多路选择器module MUX21_1(out,a,b,sel);input a,b,sel;output out;assign out=(sel==0)?a:b;//持续赋值,如果sel 为0,则out=a ;否则out=bendmodule阻塞赋值方式定义的2 选1 多路选择器module MUX21_2(out,a,b,sel);inpu ...…

查看全部问答>

问一个笨笨的问题

请问如何在EVC build后执行某个PC上的EXE文件. 比如,我要在build aa.exe后自动调用bb.exe. 我在post-build里设置,总是不成功.…

查看全部问答>

硬件仿真

想问一下支持硬件仿真的单片机芯片都有哪些  谢谢…

查看全部问答>

WINCE6.0操作系统在三星6410开发板上完美展现!--基于立宇泰ARMSYS6410开发板

精彩测评实例图片说明:1,WINCE6.0系统启动画面(进度条动态显示内核加载进程,LOGO图片可以根据客户需要免费更换);2,WINCE6.0桌面效果;3,800x480液晶屏全屏播放H.264视频流文件(采用硬件解码)4,800x480液晶屏全屏播放MPEG4(avi后缀)音视 ...…

查看全部问答>

我UCOS项目任务优先级划分问题

我在做同步相量测量(PMU) 就是把AD采集的三项交流电压和电流值打上时标然后上传,在接收PC发送的控制命令,如控制继电器开关的命令。由于要对数据打时标(时间戳),底层的PMU采集装置散布在不同的点,每一个点(PMU)安装一个GPS 不现实 ...…

查看全部问答>

Ecan通信的中断问题

       本人在一个项目中运用Ecan进行通信,在通信过程中会碰到中断故障(具体原因说不上来)。我是将Ecan设置成中断接收的(邮箱0-15设置成接收邮箱,16邮箱设置成发送邮箱),若接收到一个合理的读写命令,则返回 ...…

查看全部问答>

g2553定时器的使用问题

#include \"msp430g2553.h\" int main( void ) {   // Stop watchdog timer to prevent time out reset     WDTCTL = WDTPW + WDTHOLD;         P1DIR |= BIT0;     P1OUT &= ~BIT0; & ...…

查看全部问答>

AVR编程软件

我的电脑是64位机,系统是win7的家庭普通版,买电脑觉得送了个win7的正版系统,就没在升旗舰了。 现在在学AVR单片机,老师需要我给编一些程序,但是下了很多相关编程软件,就是用不了(比如CVAVR,ICCAVR). 很困惑,求大神指点!!! 谢谢…

查看全部问答>