// erase flash, make sure pointer is in the segment you wish to erase, otherwise you may erase you program or some data void CCFlashClass::erase(unsigned char *flash) { disableWatchDog(); // Disable WDT FCTL3 = FWKEY; // Clear LOCK FCTL1 = FWKEY+ERASE; //Enable segment erase *flash = 0; // Dummy write, erase Segment FCTL3 = FWKEY+LOCK; // Done, set LOCK enableWatchDog(); // Enable WDT }
// save in to flash (at segment boundary) void CCFlashClass::write(unsigned char *flash, unsigned char *src, int len) { disableWatchDog(); // Disable WDT FCTL3 = FWKEY; // Clear LOCK FCTL1 = FWKEY+WRT; // Enable write while(len--) // Copy data *(flash++) = *(src++); FCTL1 = FWKEY; //Done. Clear WRT FCTL3 = FWKEY+LOCK; // Set LOCK enableWatchDog(); // Enable WDT }
/* * setNormalMode * * Revert from low power mode */ void CC430CORE::setNormalMode(void) { // Configure PMM and SCLK for RF operation _SET_VCORE_8MHZ(1); // Enable WDT again enableWatchDog(); // Recover old port selections P1SEL = portSelection[0]; P2SEL = portSelection[1]; P3SEL = portSelection[2]; }
/** * sleepUntil * * Put panStamp into Power-down state until the RTC alarm is triggered * Here the RTC module is used in calendar mode and hexadecimal format * This function uses RTC connected to an external 32.768KHz crystal * in order to exit (interrupt) from the power-down state * * @param day Day of month (1 to 31) * @param dow Day of week (0 to 6) * @param hour Hour (0 to 23) * @param min Minutes day (0 to 59) */ void CC430RTC::sleepUntil(char day, char dow, char hour, char min) { if ((day < 0) && (dow < 0) && (hour < 0) && (min < 0)) return; RTC_SET_ACLK_XT1(); // Connect ACLK to 32.768 KHz crystal disableWatchDog(); // Stop WDT if (day > 0) { RTC_SET_DAY_ALARM(day); RTC_ENABLE_DAY_ALARM(); } else if (dow > 0) { RTC_SET_DOW_ALARM(dow); RTC_ENABLE_DOW_ALARM(); } if (hour > 0) { RTC_SET_HOUR_ALARM(hour); RTC_ENABLE_HOUR_ALARM(); } if (min > 0) { RTC_SET_MIN_ALARM(min); RTC_ENABLE_MIN_ALARM(); } RTC_SET_CALENDAR_MODE(); // RTC set to calendar mode RTC_ENABLE_ALARM(); // Enable RTC alarm RTC_ISR_ENABLE(); // Enable RTC interrupt __bis_SR_register(LPM3_bits + GIE); // Enter LPM3 with interrupts enableWatchDog(); // Enable WDT again }