Thanks Bill, the problem is that it does not work eather. The question is: is it possible to program individual byte/word of information memory without masserase of it?
Cheers, ~d On Tuesday 04 May 2004 15:51, Bill Knight wrote: > Was the flash erased beforehand? > > Here is the code I've used for programming flash. It is > in use in the field in a very large number of installations. > It is in IAR format but the conversion should be easy. > > Regards > -Bill Knight > R O SOftWare > > > > flash.h > ------ > #ifndef INC_FLASH_H > #define INC_FLASH_H > > #include "typedefs.h" > > void flashEraseSector(void *addr); > void flashProgramBlock(void *addr, void *data, uint16 count); > > #define flashProgramMemory(addr, data) flashProgramBlock(addr, data, sizeof > (data)); > > #endif > > flash.c > ------- > #define FCLK_FREQ (450e3) // flash programming clock > frequency #define FCLK_DIVIDER (MCLK / FCLK_FREQ) // good from 1 to 64 > > /************************************************************************** >**** * > * Function Name: void _flashControl() > * > * Description: > * This low level function checks the value of 'count' and if > * non-zero writes the referenced data to flash. If it is zero, it > * erases the flash sector containing the address. > * > * Calling Sequence: > * uint8 *addr destination address in flash > * uint8 *data pointer to data to write > * uint16 count number of bytes to write > * > * Returns: > * void > * > * NOTE: this function is marked 'monitor' so the compiler will save > * the current interrupt state on entry and restore it on exit. > > *************************************************************************** >**/ static monitor void _flashControl(uint8 *addr, uint8 *data, uint16 > count) { > uint8 ie1; > > ie1 = IE1; // get current interrupt enables > IE1 &= ~(NMIIE | ACCVIE | OFIE); // disable enabled interrupts > FCTL2 = FWKEY + // key > FSSEL_1 + // use MCLK > FCLK_DIVIDER; // setup divider - 1..64 > FCTL3 = FWKEY; // LOCK = 0 > > if (count) > { > FCTL1 = FWKEY | WRT; // set WRITE bit > > do // loop through, writing the data > *addr++ = *data++; > while (--count); > } > else > { > FCTL1 = FWKEY | ERASE; // set ERASE bit > *addr = 0; // write to address in sector to > start erase } > > FCTL1 = FWKEY; // clear WRITE/ERASE bit > FCTL3 = FWKEY | LOCK; // LOCK = 1 > IE1 = ie1; // restore interrupt enables > } > > /************************************************************************** >**** * > * Function Name: void flashEraseSector() > * > * Description: > * Erase one flash sector > * > * Calling Sequence: > * void *addr address within sector to be erased > * > * Returns: > * void > * > > *************************************************************************** >**/ void flashEraseSector(void *addr) > { > _flashControl(addr, NULL, 0); > } > > > /************************************************************************** >**** * > * Function Name: void flashProgramBlock() > * > * Description: > * Program a block of data in flash > * > * Calling Sequence: > * void *addr destination address in flash > * void *data pointer to data to write > * uint16 count number of bytes to write > * > * Returns: > * void > * > > *************************************************************************** >**/ void flashProgramBlock(void *addr, void *data, uint16 count) > { > _flashControl(addr, data, count); > } > > > > > > ------------------------------------------------------- > This SF.Net email is sponsored by: Oracle 10g > Get certified on the hottest thing ever to hit the market... Oracle 10g. > Take an Oracle 10g class now, and we'll give you the exam FREE. > http://ads.osdn.com/?ad_id=3149&alloc_id=8166&op=click > _______________________________________________ > Mspgcc-users mailing list > Mspgcc-users@lists.sourceforge.net > https://lists.sourceforge.net/lists/listinfo/mspgcc-users