16 #ifdef __MSP430_HAS_FLASH__
21 void FlashCtl_eraseSegment ( uint8_t *flash_ptr){
23 HWREG16(FLASH_BASE + OFS_FCTL3) = FWKEY;
26 HWREG16(FLASH_BASE + OFS_FCTL1) = FWKEY + ERASE;
32 while (
HWREG8(FLASH_BASE + OFS_FCTL3) & BUSY) ;
35 HWREG16(FLASH_BASE + OFS_FCTL1) = FWKEY;
38 HWREG16(FLASH_BASE + OFS_FCTL3) = FWKEY + LOCK;
41 void FlashCtl_eraseBank ( uint8_t *flash_ptr){
42 uint16_t interruptState;
45 HWREG16(FLASH_BASE + OFS_FCTL3) = FWKEY;
47 while (
HWREG8(FLASH_BASE + OFS_FCTL3) & BUSY);
50 interruptState = __get_interrupt_state();
51 __disable_interrupt();
55 HWREG16(FLASH_BASE + OFS_FCTL1) = FWKEY + MERAS;
61 while (
HWREG8(FLASH_BASE + OFS_FCTL3) & BUSY);
65 if (interruptState & GIE)
71 HWREG16(FLASH_BASE + OFS_FCTL1) = FWKEY;
74 HWREG16(FLASH_BASE + OFS_FCTL3) = FWKEY + LOCK;
77 void FlashCtl_performMassErase ( uint8_t *flash_ptr){
79 HWREG16(FLASH_BASE + OFS_FCTL3) = FWKEY;
81 while (
HWREG8(FLASH_BASE + OFS_FCTL3) & BUSY) ;
84 HWREG16(FLASH_BASE + OFS_FCTL1) = FWKEY + MERAS + ERASE;
90 while (
HWREG8(FLASH_BASE + OFS_FCTL3) & BUSY) ;
93 HWREG16(FLASH_BASE + OFS_FCTL1) = FWKEY;
96 HWREG16(FLASH_BASE + OFS_FCTL3) = FWKEY + LOCK;
99 bool FlashCtl_performEraseCheck (uint8_t *flash_ptr,
100 uint16_t numberOfBytes
105 for (
i = 0;
i < numberOfBytes;
i++)
108 if ((*(flash_ptr +
i)) != 0xFF){
115 void FlashCtl_write8 (uint8_t *data_ptr,
121 HWREG16(FLASH_BASE + OFS_FCTL3) = FWKEY;
124 HWREG16(FLASH_BASE + OFS_FCTL1) = FWKEY + WRT;
129 while (
HWREG8(FLASH_BASE + OFS_FCTL3) & BUSY) ;
132 *flash_ptr++ = *data_ptr++;
137 HWREG16(FLASH_BASE + OFS_FCTL1) = FWKEY;
140 HWREG16(FLASH_BASE + OFS_FCTL3) = FWKEY + LOCK;
143 void FlashCtl_write16 (uint16_t *data_ptr,
149 HWREG16(FLASH_BASE + OFS_FCTL3) = FWKEY;
152 HWREG16(FLASH_BASE + OFS_FCTL1) = FWKEY + WRT;
157 while (
HWREG8(FLASH_BASE + OFS_FCTL3) & BUSY) ;
160 *flash_ptr++ = *data_ptr++;
165 HWREG16(FLASH_BASE + OFS_FCTL1) = FWKEY;
168 HWREG16(FLASH_BASE + OFS_FCTL3) = FWKEY + LOCK;
171 void FlashCtl_write32 (uint32_t *data_ptr,
177 HWREG16(FLASH_BASE + OFS_FCTL3) = FWKEY;
180 HWREG16(FLASH_BASE + OFS_FCTL1) = FWKEY + BLKWRT;
185 while (
HWREG8(FLASH_BASE + OFS_FCTL3) & BUSY) ;
188 *flash_ptr++ = *data_ptr++;
194 HWREG16(FLASH_BASE + OFS_FCTL1) = FWKEY;
197 HWREG16(FLASH_BASE + OFS_FCTL3) = FWKEY + LOCK;
200 void FlashCtl_fillMemory32 (uint32_t value,
206 HWREG16(FLASH_BASE + OFS_FCTL3) = FWKEY;
209 HWREG16(FLASH_BASE + OFS_FCTL1) = FWKEY + BLKWRT;
214 while ((
HWREG8(FLASH_BASE + OFS_FCTL3)) & BUSY) ;
217 *flash_ptr++ = value;
223 HWREG16(FLASH_BASE + OFS_FCTL1) = FWKEY;
226 HWREG16(FLASH_BASE + OFS_FCTL3) = FWKEY + LOCK;
229 uint8_t FlashCtl_getStatus (uint8_t mask
232 return ((
HWREG8(FLASH_BASE + OFS_FCTL3) & mask ));
235 void FlashCtl_lockInfoA (
void)
239 gieStatus = __get_SR_register() & GIE;
240 __disable_interrupt();
246 HWREG16(FLASH_BASE + OFS_FCTL3) = FWKEY
247 + ((
HWREG16(FLASH_BASE + OFS_FCTL3) ^ LOCKA) & 0xFF);
250 __bis_SR_register(gieStatus);
253 void FlashCtl_unlockInfoA (
void)
257 gieStatus = __get_SR_register() & GIE;
258 __disable_interrupt();
263 HWREG16(FLASH_BASE + OFS_FCTL3) = FWKEY
264 + (
HWREG16(FLASH_BASE + OFS_FCTL3) & 0xFF);
267 __bis_SR_register(gieStatus);