вариант f2013 работает также, владельцы eZ430-f2013 могут проверить, код ниже.. работает оно так, если запись прошла успешно, то загорится светодиод, иначе он будет мигать (периодический перезагруз контроллера)
кста есть небольшой прогресс, если
BCSCTL2 |= SELM_3 + DIVM_3; // MCLK = LFXT1/8
заменить на
BCSCTL2 |= SELM_3 + DIVM_2; // MCLK = LFXT1/4
то запись проходит успешно...
#include <msp430x20x3.h>
void wr_flash(unsigned addr, char data)
{
while (FCTL3 & BUSY);
if (FCTL3 & LOCKA) FCTL3 = FWKEY + LOCKA; // Unlock SegmentA
FCTL3 = FWKEY; // Clear Lock bit
FCTL1 = FWKEY + WRT; // Set WRT bit for write operation
*(char*)addr = data; // Write a data
while (FCTL3 & BUSY);
FCTL1 = FWKEY; // Clear WRT bit
FCTL3 = FWKEY + LOCK + LOCKA; // Set LOCK bit, and Lock SegmentA
}
void main(void)
{
volatile unsigned int i; // Volatile to prevent removal
WDTCTL = WDTPW + WDTHOLD; // Stop watchdog timer
BCSCTL1 = CALBC1_1MHZ; // Set DCO to calibrated 1MHz, ACLK = LFXT1
DCOCTL = CALDCO_1MHZ;
BCSCTL3 |= LFXT1S_2; // LFXT1 = VLO
IFG1 &= ~OFIFG; // Clear OSCFault flag
BCSCTL2 |= SELM_3 + DIVM_3; // MCLK = LFXT1/8
P1DIR = 0xFF; // All P1.x outputs
P1OUT = 0; // All P1.x reset
P2DIR = 0xFF; // All P2.x outputs
P2OUT = 0; // All P2.x reset
FCTL2 = FWKEY + FSSEL_2 + FN1; // SMCLK 1:3 (1MHz/3=333kHz)
P1OUT = BIT0;
i = 100; while(i--);
P1OUT &= ~BIT0;
i = 100; while(i--);
wr_flash(0x1000, 0);
P1OUT = BIT0;
while(1);
}