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

Reply via email to