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
> [email protected]
> https://lists.sourceforge.net/lists/listinfo/mspgcc-users