* @author R. Steve McKown <smckown@gmail.com>
*/
-#define MS430DCOSPEC_H
-#define TARGET_DCO_KHZ 8192 // the target DCO clock rate in binary kHz
-//#define TARGET_DCO_KHZ 4096 // the target DCO clock rate in binary kHz
-#define ACLK_KHZ 32 // the ACLK rate in binary kHz
-
configuration MoteClockC {
provides interface Init as MoteClockInit;
}
components Msp430ClockC;
MoteClockP.SubInit -> Msp430ClockC.Init;
- //MoteClockP.Msp430ClockInit -> Msp430ClockC;
+ MoteClockP.Msp430ClockInit -> Msp430ClockC;
}
* @author R. Steve McKown <smckown@gmail.com>
*/
+//#include "msp430hardware.h"
+#include "Msp430Timer.h"
+
+#define MS430DCOSPEC_H
+#define TARGET_DCO_KHZ 8192 // the target DCO clock rate in binary kHz
+//#define TARGET_DCO_KHZ 4096 // the target DCO clock rate in binary kHz
+#define ACLK_KHZ 32 // the ACLK rate in binary kHz
+
module MoteClockP {
provides interface Init;
- uses interface Init as SubInit;
-
+ uses {
+ interface Init as SubInit;
+ interface Msp430ClockInit;
+ }
}
implementation {
command error_t Init.init()
{
if (CALBC1_8MHZ != 0xff || CALDCO_8MHZ != 0xff) {
- /* Initialize timers */
- TACTL = TASSEL_2 | TACLR | TAIE;
- TAIV = 0;
- TBCTL = TBSSEL_1 | TBCLR | TBIE;
- TBIV = 0;
-
- /* Initialize DCO from calibrated data */
- BCSCTL1 = CALBC1_8MHZ;
- DCOCTL = CALDCO_8MHZ;
+ /* Use built-in constant */
+ atomic {
+ /* Initialize timers */
+ TACTL = TASSEL_2 | TACLR | TAIE;
+ TAIV = 0;
+ TBCTL = TBSSEL_1 | TBCLR | TBIE;
+ TBIV = 0;
- /* Turn on TimerB, aka the 32KHz clock */
- TBCTL |= MC1;
+ /* Initialize DCO from calibrated data. DCO = 8MHz. SMCLK = DCO/8 */
+ BCSCTL1 = CALBC1_8MHZ;
+ BCSCTL2 = SELM_0 | DIVM_0 | DIVS_3;
+ DCOCTL = CALDCO_8MHZ;
+ /* Turn on TimerB, aka the 32KHz clock */
+ TBCTL |= MC1;
+ }
return SUCCESS;
- } else
+ } else {
+ /* Constant not present; calibrate on the fly */
+ int i;
+
+ for (i = 0; i < 0xfffe; i++); /* ensure LFXT1 is stable */
return call SubInit.init();
+ }
+ }
+
+ event void Msp430ClockInit.setupDcoCalibrate()
+ {
+ call Msp430ClockInit.defaultSetupDcoCalibrate();
+ }
+
+ event void Msp430ClockInit.initClocks()
+ {
+ /* We run at 8MHz, so SMCLK divider needs to be /8 */
+ call Msp430ClockInit.defaultInitClocks();
+ BCSCTL2 |= DIVS_3;
+ }
+
+ event void Msp430ClockInit.initTimerA()
+ {
+ call Msp430ClockInit.defaultInitTimerA();
+ }
+
+ event void Msp430ClockInit.initTimerB()
+ {
+ call Msp430ClockInit.defaultInitTimerB();
}
}