<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:taxo="http://purl.org/rss/1.0/modules/taxonomy/" version="2.0">
  <channel>
    <title>topic Re: MCF51QE128:  Problem using Flash, errors in CodeWarrior  (long post) in ColdFire/68K Microcontrollers and Processors</title>
    <link>https://community.nxp.com/t5/ColdFire-68K-Microcontrollers/MCF51QE128-Problem-using-Flash-errors-in-CodeWarrior-long-post/m-p/177110#M6985</link>
    <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;Cool, thanks.&lt;BR /&gt;&lt;BR /&gt;So it uses like 100 bytes on the stack. Shortly, some asm birds of prey should come by and cut that down, but at least you have a known working example.&lt;BR /&gt;&lt;BR /&gt;Did you track down the source of the link error?&lt;BR /&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
    <pubDate>Fri, 01 Aug 2008 00:53:18 GMT</pubDate>
    <dc:creator>JimDon</dc:creator>
    <dc:date>2008-08-01T00:53:18Z</dc:date>
    <item>
      <title>MCF51QE128:  Problem using Flash, errors in CodeWarrior  (long post)</title>
      <link>https://community.nxp.com/t5/ColdFire-68K-Microcontrollers/MCF51QE128-Problem-using-Flash-errors-in-CodeWarrior-long-post/m-p/177105#M6980</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;DIV&gt; &lt;/DIV&gt;&lt;DIV&gt; &lt;/DIV&gt;&lt;SPAN&gt;I have been working on a medical-related project that accumulates a few hundred bytes of data from a transducer and when the data are finally accumulated, it is stored in Flash and read back at next powerup.&amp;nbsp; Or, that is at least the intent.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;I am using CodeWarrior 6.1 (the one that came with the DEMOQE128 kit), and programming the actual product board via BDM using the "USB HCS08/HCS12 Multilink Rev. C" programmer.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;Problem 1:&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;When I try to compile the code (code in question attached) I get the following error messages out of CodeWarrior.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;DIV&gt;&lt;DIV class="msg_source_code"&gt;&lt;DIV class="text_smallest"&gt;Message:&lt;/DIV&gt;&lt;PRE&gt;Link Error&amp;nbsp;&amp;nbsp; : Overflow in segment: userram from section: .bssSegment reserved size is: 0x00002000 -- Overflow of: 0x00001fe4Link Error&amp;nbsp;&amp;nbsp; : Overflow in segment: userram from section: .customSegment reserved size is: 0x00002000 -- Overflow of: 0x00001fe4Link Error&amp;nbsp;&amp;nbsp; : Overflow in segment: userram from section: .rompSegment reserved size is: 0x00002000 -- Overflow of: 0x00001ffc&lt;/PRE&gt;&lt;/DIV&gt;&lt;BR /&gt;&lt;/DIV&gt;&lt;SPAN&gt;Problem 2:&amp;nbsp;&amp;nbsp; This is weird, but it seems related, and I'm not sure I have language to describe it properly.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;When I compile &lt;/SPAN&gt;&lt;SPAN style="text-decoration: underline;"&gt;&lt;I&gt;&lt;STRONG&gt;any&lt;/STRONG&gt;&lt;/I&gt;&lt;/SPAN&gt;&lt;SPAN&gt; of the statements below into my code, the "True-Time Simulator and Real-Time Debugger" that came with CodeWarrior jams.&amp;nbsp; It doesn't seem to completely load the code, (it "hangs" at the very end) so the target CPU cannot even be reset without a power cycle to clear the blockage. All of the statements involved either read or write to Flash.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;DIV&gt;&lt;DIV class="msg_source_code"&gt;&lt;DIV class="text_smallest"&gt;Code:&lt;/DIV&gt;&lt;PRE&gt;Flash_Programme_One_Byte( i, Volume.flash_study[ i]);&amp;nbsp;&amp;nbsp; // see end of codeFlash_Programme_One_Byte( i, Extra.flash_report[ i]);Volume.flash_study[ i] = flash_rom[ i];&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // see end of codeExtra.flash_report[ i] = flash_rom[ i];&lt;/PRE&gt;&lt;/DIV&gt;&lt;BR /&gt;&amp;nbsp;These statements appear in the code presented below which contains the data definitions and the complete implementation of the Flash programming interface as needed by this project.&lt;BR /&gt;&lt;BR /&gt;&lt;DIV&gt;&lt;DIV class="msg_source_code"&gt;&lt;DIV class="text_smallest"&gt;Code:&lt;/DIV&gt;&lt;PRE&gt;/* study_data.c *//****************************************************************************&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Defines data structures for Microflo and provides a means of saving and&amp;nbsp;&amp;nbsp;&amp;nbsp; recovering a study in flash.****************************************************************************//****************************************************************************&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Assorted variable and constant declarations.****************************************************************************/// time declarations#define THIRTY_SECONDS&amp;nbsp; 30*8#define ONE_MINUTE&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 60*8#define TWO_MINUTES&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 120*8#define ONE_HALF_SECOND 4#define STARTUP_FLOW&amp;nbsp;&amp;nbsp;&amp;nbsp; 24bool collector_still_busy = TRUE;short max_flow;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // maximum flow.long autozero_total;short autozero_samples; /****************************************************************************&amp;nbsp;&amp;nbsp;&amp;nbsp; ADC variables and storage area.****************************************************************************/#define ADC_SAMPLES&amp;nbsp; 64&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // size of averagerstruct Convertor{&amp;nbsp;&amp;nbsp;&amp;nbsp; short offset15;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // weight of empty GUB.&amp;nbsp;&amp;nbsp;&amp;nbsp; short previous15;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // immediately preceding sample.&amp;nbsp;&amp;nbsp;&amp;nbsp; short raw15;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // a-&amp;gt;d reading without offsetting&amp;nbsp;&amp;nbsp;&amp;nbsp; short volume15;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // volume enhanced to 15 bits.&amp;nbsp;&amp;nbsp;&amp;nbsp; short i;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // index to adc_samples.&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; long&amp;nbsp; total;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // sum of last 64 samples.&amp;nbsp;&amp;nbsp;&amp;nbsp; short data[ ADC_SAMPLES];&amp;nbsp;&amp;nbsp; // holds last samples. } ADC;&amp;nbsp; /****************************************************************************&amp;nbsp;&amp;nbsp;&amp;nbsp; Flow averaging variables and storage area.****************************************************************************/#define FLOW_SAMPLES&amp;nbsp; 8struct FlowAverager {&amp;nbsp;&amp;nbsp;&amp;nbsp; short raw;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // calculated flow rate&amp;nbsp;&amp;nbsp;&amp;nbsp; short smoothed;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // after heavy averaging&amp;nbsp;&amp;nbsp;&amp;nbsp; short previous;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // saved flow value&amp;nbsp;&amp;nbsp;&amp;nbsp; short i;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // index to flow samples&amp;nbsp;&amp;nbsp;&amp;nbsp; short total;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // sum of last 8 flow samples&amp;nbsp;&amp;nbsp;&amp;nbsp; short data[ FLOW_SAMPLES];&amp;nbsp; // holds last 8 flow samples} Flow; /****************************************************************************&amp;nbsp;&amp;nbsp;&amp;nbsp; Volume recording variables and storage area.&amp;nbsp;&amp;nbsp;&amp;nbsp; This gets stored in flash.****************************************************************************/#define RECORD_LENGTH 3*62*8&amp;nbsp;&amp;nbsp;&amp;nbsp; struct VolumeMemory{&amp;nbsp;&amp;nbsp;&amp;nbsp; short i;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // index to recorded study&amp;nbsp;&amp;nbsp;&amp;nbsp; short stop;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // index &amp;lt; RECORD_LENGTH where record stops.&amp;nbsp;&amp;nbsp;&amp;nbsp; short final_volume;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // final value of volume&amp;nbsp;&amp;nbsp;&amp;nbsp; short recording[ RECORD_LENGTH];&amp;nbsp;&amp;nbsp;&amp;nbsp; // body of study } Study;// Determine number of long words needed to save the study in flash.#define STUDY_SIZE (sizeof( Study) + sizeof( long) / sizeof( long))// Translate between record format and linear long format for storage.union volume_union{&amp;nbsp;&amp;nbsp;&amp;nbsp; struct VolumeMemory Study;&amp;nbsp;&amp;nbsp;&amp;nbsp; long&amp;nbsp;&amp;nbsp; flash_study[ STUDY_SIZE];} Volume;/****************************************************************************&amp;nbsp;&amp;nbsp;&amp;nbsp; Patient report fields and variables.&amp;nbsp;&amp;nbsp;&amp;nbsp; This contains only "finished" values.&amp;nbsp;&amp;nbsp;&amp;nbsp; This gets stored in flash.****************************************************************************/struct PatientReport{&amp;nbsp;&amp;nbsp;&amp;nbsp; short Vvol;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // voided volume&amp;nbsp;&amp;nbsp;&amp;nbsp; short TtoMax;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // time to maximum flow.&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; short Tvoid;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // total time it took patient to piss.&amp;nbsp;&amp;nbsp;&amp;nbsp; short Tflow;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // total time patient actually spent pissing.&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; short Qmax;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // maximum flow&amp;nbsp;&amp;nbsp;&amp;nbsp; short Qavg;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // average flow&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; bool&amp;nbsp; flow_pattern;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // "CONTINUOUS" or "INTERMITTENT"} Report;// Determine number of long words needed to save the report in flash.#define REPORT_SIZE&amp;nbsp; ((sizeof( Report) + sizeof( long)) / sizeof( long))// Translate between record format and linear long format for storage.union report_union{&amp;nbsp;&amp;nbsp;&amp;nbsp; struct PatientReport&amp;nbsp; Report;&amp;nbsp;&amp;nbsp;&amp;nbsp; long&amp;nbsp;&amp;nbsp; flash_report[ REPORT_SIZE];} Extra;/****************************************************************************&amp;nbsp;&amp;nbsp;&amp;nbsp; Empty out the study area after reset or starting a new study.****************************************************************************/void Clear_Study( void){&amp;nbsp;&amp;nbsp;&amp;nbsp; short i;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; for( i = 0; i &amp;lt; RECORD_LENGTH; i++) Study.recording[ i] = 0;} /* Clear_Study *//****************************************************************************&amp;nbsp;&amp;nbsp;&amp;nbsp; Test routine to report on amount of memory allocation for the&amp;nbsp;&amp;nbsp;&amp;nbsp; study and report.&amp;nbsp; Not used in product.****************************************************************************/void Test_Show_Allocated_Data_Sizes( void){&amp;nbsp;&amp;nbsp;&amp;nbsp; Printer_Enable();&amp;nbsp;&amp;nbsp;&amp;nbsp; PrintH( "Study size&amp;nbsp; = ", STUDY_SIZE);&amp;nbsp;&amp;nbsp;&amp;nbsp; PrintH( "Report size = ", REPORT_SIZE);&amp;nbsp;&amp;nbsp;&amp;nbsp; Printer_Disable();} /* Test_Show_Allocated_Data_Sizes *//****************************************************************************&amp;nbsp;&amp;nbsp;&amp;nbsp; Test the study area and see if it is empty.&amp;nbsp;&amp;nbsp;&amp;nbsp; Return TRUE if this is the case and FALSE otherwise.****************************************************************************/bool Empty_Study( void){&amp;nbsp;&amp;nbsp;&amp;nbsp; short i;&amp;nbsp;&amp;nbsp;&amp;nbsp; short notzero = 0;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; for( i = 0; i &amp;lt; RECORD_LENGTH; i++) notzero |= Study.recording[ i];&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if(notzero)&amp;nbsp;&amp;nbsp;&amp;nbsp; {&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Message( "Study area has data.");&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Advance_For_Spacing();&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return FALSE;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&amp;nbsp;&amp;nbsp;&amp;nbsp; else&amp;nbsp;&amp;nbsp;&amp;nbsp; {&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Message( "Study area is blank.");&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Advance_For_Spacing();&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return TRUE;&amp;nbsp;&amp;nbsp;&amp;nbsp; }} /* Empty_Study *//****************************************************************************&amp;nbsp;&amp;nbsp;&amp;nbsp; Starting address of code related to flash memory.&amp;nbsp;&amp;nbsp;&amp;nbsp; Flash is organised as longwords (32-bits).&amp;nbsp;&amp;nbsp;&amp;nbsp; In this application, it is unprotected.&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Taken from pp81..86 of MCF51QE128 Reference Manual, Rev 3****************************************************************************/extern long volatile flash_rom[ REPORT_SIZE] @0x0001F000;&amp;nbsp;&amp;nbsp; // last 4 sectors./****************************************************************************&amp;nbsp;&amp;nbsp;&amp;nbsp; Flash commands****************************************************************************/#define ERASE_VERIFY&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0x25#define PROGRAM_ONE_LONG&amp;nbsp;&amp;nbsp;&amp;nbsp; 0x20#define BURST_PROGRAM&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0x25#define SECTOR_ERASE&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0x40#define MASS_ERASE&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0x41/****************************************************************&amp;nbsp;&amp;nbsp;&amp;nbsp; This is the global initialisation routine for the flash&amp;nbsp;&amp;nbsp;&amp;nbsp; memory.&amp;nbsp; It is used by all the flash commands.&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; [1] Writes the proper divisor into the FCDIV register.&amp;nbsp;&amp;nbsp;&amp;nbsp; The flash programmer requires a reference frequency in the&amp;nbsp;&amp;nbsp;&amp;nbsp; range of 195 KHz to 200 KHz.&amp;nbsp; Using a divisor of 21 gives a&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; flash reference frequency of 4194304 / 21 = 199728 Hz which&amp;nbsp;&amp;nbsp;&amp;nbsp; is within specification.&amp;nbsp; Bit 7 of FCDIV is written "1" to&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ensure future writability to this register.&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; [2] No backdoor key is used, so this is set to zero.&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; [3] All but the uppermost 4K of flash are protected against&amp;nbsp;&amp;nbsp;&amp;nbsp; inadvertent writes.****************************************************************/void Flash_Common_Code( void){&amp;nbsp;&amp;nbsp;&amp;nbsp; FCDIV = 0x80 + 21;&amp;nbsp;&amp;nbsp;&amp;nbsp; FCNFG = 0;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // interpret write commands as actual writes.&amp;nbsp;&amp;nbsp;&amp;nbsp; FPROT = 0x41;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // protect all but uppermost 4K.&amp;nbsp;&amp;nbsp;&amp;nbsp; while(!(FSTAT &amp;amp; FSTAT_FCBEF_MASK)) {};&amp;nbsp; // wait for command buffer empty&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if( FSTAT &amp;amp; (FSTAT_FACCERR_MASK | FSTAT_FPVIOL_MASK)) FSTAT = 0x30;} /* Flash_Common_Code *//****************************************************************&amp;nbsp;&amp;nbsp;&amp;nbsp; Checks a block of flash to see it if is erased:&amp;nbsp;&amp;nbsp;&amp;nbsp; Returns TRUE if operation is successful, FALSE otherwise.****************************************************************/bool Flash_Erase_Verify( short index){&amp;nbsp;&amp;nbsp;&amp;nbsp; Cpu_DisableInt();&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Flash_Common_Code();&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; flash_rom[ index] = 0;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // command write sequence&amp;nbsp;&amp;nbsp;&amp;nbsp; FCMD = ERASE_VERIFY;&amp;nbsp;&amp;nbsp;&amp;nbsp; FSTAT = 0x80;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; while(!(FSTAT &amp;amp; FSTAT_FCCF_MASK)) {};&amp;nbsp;&amp;nbsp; // wait for command buffer empty&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if( FSTAT &amp;amp; FSTAT_FBLANK_MASK) return TRUE; else return FALSE;&amp;nbsp;&amp;nbsp;&amp;nbsp; Cpu_EnableInt();} /* Flash_Erase_Verify *//****************************************************************&amp;nbsp;&amp;nbsp;&amp;nbsp; Erases a single sector (1024 bytes or 256 longs)&amp;nbsp;&amp;nbsp;&amp;nbsp; Returns TRUE if operation is successful, FALSE otherwise.****************************************************************/void Flash_Sector_Erase( short index){&amp;nbsp;&amp;nbsp;&amp;nbsp; Cpu_DisableInt();&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Flash_Common_Code();&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; flash_rom[ index] = 0;&amp;nbsp;&amp;nbsp;&amp;nbsp; FCMD = SECTOR_ERASE;&amp;nbsp;&amp;nbsp;&amp;nbsp; FSTAT = 0x80;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; while(!(FSTAT &amp;amp; FSTAT_FCCF_MASK)) {};&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // wait for command buffer empty&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Cpu_EnableInt();} /* Flash_Sector_Erase *//****************************************************************&amp;nbsp;&amp;nbsp;&amp;nbsp; Programs a single address in flash.****************************************************************/void Flash_Programme_One_Byte( short index, long data){&amp;nbsp;&amp;nbsp;&amp;nbsp; Cpu_DisableInt();&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Flash_Common_Code();&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; flash_rom[ index] = data;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; FCMD = BURST_PROGRAM;&amp;nbsp;&amp;nbsp;&amp;nbsp; FSTAT = 0x80;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; while(!(FSTAT &amp;amp; FSTAT_FCCF_MASK)) {};&amp;nbsp;&amp;nbsp; // wait for command completion&amp;nbsp;&amp;nbsp;&amp;nbsp; Cpu_EnableInt();} /* Flash_Programme_One_Byte *//****************************************************************&amp;nbsp;&amp;nbsp;&amp;nbsp; Erase the study area of flash and verify the erasure.&amp;nbsp;&amp;nbsp;&amp;nbsp; Return TRUE if the erasure of all three sectors is good,&amp;nbsp;&amp;nbsp;&amp;nbsp; FALSE otherwise.****************************************************************/bool Erase_And_Verify_Data_Flash( void){&amp;nbsp;&amp;nbsp;&amp;nbsp; Flash_Sector_Erase( 0);&amp;nbsp;&amp;nbsp;&amp;nbsp; if( Flash_Erase_Verify( 0))&amp;nbsp;&amp;nbsp;&amp;nbsp; {&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Flash_Sector_Erase( 0x100);&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if( Flash_Erase_Verify( 0x100))&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Flash_Sector_Erase( 0x200);&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if( Flash_Erase_Verify( 0x200))&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; error = 0;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return TRUE;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; else error = 29;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // block 3 failed erasure&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; else error = 28;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // block 2 failed erasure&amp;nbsp;&amp;nbsp;&amp;nbsp; }&amp;nbsp;&amp;nbsp;&amp;nbsp; else error = 27;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // block 1 failed erasure&amp;nbsp;&amp;nbsp;&amp;nbsp; return FALSE;} /* Erase_And_Verify_Data_Flash *//****************************************************************&amp;nbsp;&amp;nbsp;&amp;nbsp; Saves a study in flash.&amp;nbsp;&amp;nbsp;&amp;nbsp; ****************************************************************/void Save_Study_In_Flash( void){&amp;nbsp;&amp;nbsp;&amp;nbsp; short i;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if( Erase_And_Verify_Data_Flash())&amp;nbsp;&amp;nbsp;&amp;nbsp; {&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; for( i = 0; i &amp;lt; STUDY_SIZE; i++)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; { //&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Flash_Programme_One_Byte( i, Volume.flash_study[ i]);&amp;nbsp;&amp;nbsp; // one of the problems&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; for( i = STUDY_SIZE; i &amp;lt; STUDY_SIZE + REPORT_SIZE; i++)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Flash_Programme_One_Byte( i, Extra.flash_report[ i]);&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&amp;nbsp;&amp;nbsp;&amp;nbsp; }&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; else&amp;nbsp;&amp;nbsp;&amp;nbsp; // something wrong so print an error message.&amp;nbsp;&amp;nbsp;&amp;nbsp; {&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Printer_Enable();&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Print_Error( error);&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Printer_Disable();&amp;nbsp;&amp;nbsp;&amp;nbsp; }} /* Save_Study_In_Flash *//****************************************************************&amp;nbsp;&amp;nbsp;&amp;nbsp; Retrieves the last study from flash****************************************************************/void Restore_Study_From_Flash( void){&amp;nbsp;&amp;nbsp;&amp;nbsp; short i;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; for( i = 0; i &amp;lt; STUDY_SIZE; i++)&amp;nbsp;&amp;nbsp;&amp;nbsp; { //&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Volume.flash_study[ i] = flash_rom[ i];&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // one of the problems&amp;nbsp;&amp;nbsp;&amp;nbsp; }&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; for( i = STUDY_SIZE; i &amp;lt; STUDY_SIZE + REPORT_SIZE; i++)&amp;nbsp;&amp;nbsp;&amp;nbsp; {&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Extra.flash_report[ i] = flash_rom[ i];&amp;nbsp;&amp;nbsp;&amp;nbsp; }} /* Restore_Study_From_Flash *//*&amp;nbsp;&amp;nbsp;&amp;nbsp; These two statements result in the errors listed below.&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Flash_Programme_One_Byte( i, Volume.flash_study[ i]); //&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Volume.flash_study[ i] = flash_rom[ i]; Link Error&amp;nbsp;&amp;nbsp; : Overflow in segment: userram from section: .bssSegment reserved size is: 0x00002000 -- Overflow of: 0x00001f5cLink Error&amp;nbsp;&amp;nbsp; : Overflow in segment: userram from section: .customSegment reserved size is: 0x00002000 -- Overflow of: 0x00001f5cLink Error&amp;nbsp;&amp;nbsp; : Overflow in segment: userram from section: .rompSegment reserved size is: 0x00002000 -- Overflow of: 0x00001f74Link failed.*/&lt;/PRE&gt;&lt;/DIV&gt;&lt;BR /&gt;&amp;nbsp;&lt;BR /&gt;&lt;/DIV&gt;&lt;BR /&gt;&lt;/DIV&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;DIV&gt; &lt;/DIV&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;Message Edited by fireweaver on &lt;/SPAN&gt;&lt;SPAN class="date_text"&gt;2008-07-30&lt;/SPAN&gt;&lt;SPAN&gt; &lt;/SPAN&gt;&lt;SPAN class="time_text"&gt;07:14 PM&lt;/SPAN&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Thu, 29 Oct 2020 09:26:14 GMT</pubDate>
      <guid>https://community.nxp.com/t5/ColdFire-68K-Microcontrollers/MCF51QE128-Problem-using-Flash-errors-in-CodeWarrior-long-post/m-p/177105#M6980</guid>
      <dc:creator>fireweaver</dc:creator>
      <dc:date>2020-10-29T09:26:14Z</dc:date>
    </item>
    <item>
      <title>Re: MCF51QE128:  Problem using Flash, errors in CodeWarrior  (long post)</title>
      <link>https://community.nxp.com/t5/ColdFire-68K-Microcontrollers/MCF51QE128-Problem-using-Flash-errors-in-CodeWarrior-long-post/m-p/177106#M6981</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;The link error appear to indicate you have tried to use more RAM that is available.&lt;BR /&gt;&lt;BR /&gt;You must be running from ram to program flash.&amp;nbsp; The QE128 has two 16 bit wide block that are interleaved, so it is not possible to program flash from flash. I don't see that stated in the QERM, so shame on the writers for omitting that "minor" point.&lt;BR /&gt;You must write the command and wait for it to finish from ram.&lt;BR /&gt;&lt;BR /&gt;I do know where you could fin sample code. If you go to canyourbadgedothis.com, register, log in then click the link for "contest tools".&lt;BR /&gt;download FTF_Badge_2008_Bootloader.zip. There is code in that project to flash a V1.&lt;BR /&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Thu, 31 Jul 2008 02:15:36 GMT</pubDate>
      <guid>https://community.nxp.com/t5/ColdFire-68K-Microcontrollers/MCF51QE128-Problem-using-Flash-errors-in-CodeWarrior-long-post/m-p/177106#M6981</guid>
      <dc:creator>JimDon</dc:creator>
      <dc:date>2008-07-31T02:15:36Z</dc:date>
    </item>
    <item>
      <title>Re: MCF51QE128:  Problem using Flash, errors in CodeWarrior  (long post)</title>
      <link>https://community.nxp.com/t5/ColdFire-68K-Microcontrollers/MCF51QE128-Problem-using-Flash-errors-in-CodeWarrior-long-post/m-p/177107#M6982</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;So what you are saying is that even though the flash is divided into sectors (that's what the book says, anyway), those sectors are not really independent?&amp;nbsp; That it you are executing from one sector, programming an entirely different sector is forbidden?&lt;BR /&gt;&lt;BR /&gt;Anyway, thanks for the link, I'm going to check it out.&lt;BR /&gt;&lt;BR /&gt;&lt;DIV&gt;&lt;/DIV&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Thu, 31 Jul 2008 02:53:08 GMT</pubDate>
      <guid>https://community.nxp.com/t5/ColdFire-68K-Microcontrollers/MCF51QE128-Problem-using-Flash-errors-in-CodeWarrior-long-post/m-p/177107#M6982</guid>
      <dc:creator>fireweaver</dc:creator>
      <dc:date>2008-07-31T02:53:08Z</dc:date>
    </item>
    <item>
      <title>Re: MCF51QE128:  Problem using Flash, errors in CodeWarrior  (long post)</title>
      <link>https://community.nxp.com/t5/ColdFire-68K-Microcontrollers/MCF51QE128-Problem-using-Flash-errors-in-CodeWarrior-long-post/m-p/177108#M6983</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;Yes, the sectors are in a block, so there are gates to control programming, but the block as a whole goes "offline" when programming. I can't believe they fail to mention that - you are not the first one to miss it.&lt;BR /&gt;&lt;BR /&gt;&lt;BR /&gt;From the RM:&lt;BR /&gt;&lt;BR /&gt;"The MCF51QE128/64/32 flash memory is organized as two 16-bit wide blocks interleaved to yield a 32-bit data path"&lt;BR /&gt;&lt;BR /&gt;Since it needs 32 bits, it need both blocks.&lt;BR /&gt;&lt;BR /&gt;If you get the code from that sample, post it here if you would.&lt;BR /&gt;&lt;BR /&gt;&lt;DIV&gt;&lt;/DIV&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Thu, 31 Jul 2008 03:47:57 GMT</pubDate>
      <guid>https://community.nxp.com/t5/ColdFire-68K-Microcontrollers/MCF51QE128-Problem-using-Flash-errors-in-CodeWarrior-long-post/m-p/177108#M6983</guid>
      <dc:creator>JimDon</dc:creator>
      <dc:date>2008-07-31T03:47:57Z</dc:date>
    </item>
    <item>
      <title>Re: MCF51QE128:  Problem using Flash, errors in CodeWarrior  (long post)</title>
      <link>https://community.nxp.com/t5/ColdFire-68K-Microcontrollers/MCF51QE128-Problem-using-Flash-errors-in-CodeWarrior-long-post/m-p/177109#M6984</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;DIV&gt;&lt;/DIV&gt;Here is the code you asked for.&amp;nbsp; It is copied straight from the website:&lt;BR /&gt;&lt;BR /&gt;&lt;DIV&gt;&lt;DIV class="msg_source_code"&gt;&lt;DIV class="text_smallest"&gt;Code:&lt;/DIV&gt;&lt;PRE&gt;/*********************************************************************************                                                                     *       Copyright (C) 2007 Freescale Semiconductor, Inc.              *       All Rights Reserved                      *                            * Filename:     flash.h                *                            * Revision:                              *                            * Functions:    flash driver header file*         * Description:  ** Notes:        **********************************************************************************//*********************************** Includes ***********************************//*********************************** Macros ************************************//*********************************** Defines ***********************************//* error code */#define Flash_OK          0x00#define Flash_FACCERR     0x01#define Flash_FPVIOL      0x02#define Flash_NOT_ERASED   0x04#define Flash_CONTENTERR   0x08#define Flash_NOT_INIT     0xFF/* flash commands */#define FlashCmd_EraseVerify    0x05#define FlashCmd_Program        0x20#define FlashCmd_BurstProgram   0x25#define FlashCmd_SectorErase    0x40#define FlashCmd_MassErase      0x41/********************************** Constant ***********************************//*********************************** Variables *********************************//*********************************** Prototype *********************************/extern void Flash_Init(unsigned char FlashClockDiv);extern unsigned char Flash_SectorErase(unsigned long *FlashPtr); extern unsigned char Flash_ByteProgram(unsigned long *FlashStartAdd,unsigned long *DataSrcPtr,unsigned long NumberOfBytes); void SpSub(void);void SpSubEnd(void);&lt;/PRE&gt;&lt;/DIV&gt;&lt;BR /&gt;&amp;nbsp;and&lt;BR /&gt;&lt;BR /&gt;&lt;DIV&gt;&lt;DIV class="msg_source_code"&gt;&lt;DIV class="text_smallest"&gt;Code:&lt;/DIV&gt;&lt;PRE&gt;/*********************************************************************************                                                                     *       Copyright (C) 2007 Freescale Semiconductor, Inc.              *       All Rights Reserved                      *                            * Filename:     flash.c                *                            * Revision:                              *                            * Functions:    Includes flash routines*         * Description:  ** Notes:        **********************************************************************************//*********************************** Includes ***********************************/#include &amp;lt;hidef.h&amp;gt; /* for EnableInterrupts macro */#include "derivative.h" /* include peripheral declarations */#include "flash.h" /* include flash driver header file *//*********************************** Macros ************************************//*********************************** Defines ***********************************//********************************** Constant ***********************************//*********************************** Variables *********************************//*********************************** Prototype *********************************//*********************************** Function **********************************/ /******************************************************************************* * Function:        Flash_Init * * Description:     Set the flash clock * * Returns:         never return * * Notes: * *******************************************************************************/void Flash_Init(unsigned char FlashClockDiv) {  /* Flash clock between 150-200kHz - &amp;gt; 8MHz/(39+1)=200kHz*/  FCDIV = FlashClockDiv;}/******************************************************************************* * Function:        Flash_SectorErase * * Description:     erase a sector of the flash * * Returns:         Error Code * * Notes: * *******************************************************************************/unsigned char Flash_SectorErase(unsigned long *FlashPtr) {  unsigned char Return = Flash_OK;    /* Allocate space on stack to run flash command out of SRAM */ char localbuf[100]; int (*RunOnStack)(void) = (int(*)(void))localbuf; memcpy(localbuf, (void*)SpSub, (char*)SpSubEnd - (char*)SpSub);    if(FCDIV_FDIVLD == 1)    {    /* flash is init */        /* wait until FCBEF is set in FSTAT */    while(FSTAT_FCBEF == 0){}    /* check for errors */    if(FSTAT_FACCERR == 1)      {      /* clear error flag */      FSTAT = 0x10;      }    if(FSTAT_FPVIOL == 1)      {      /* clear error flag */      FSTAT = 0x20;      }    /* dummy write to flash */    *FlashPtr = (unsigned long)0x11111111;       /* write command */    FCMD = FlashCmd_SectorErase;        RunOnStack();        /* launch command */    //FSTAT = 0x80;        /* wait for command completion */    //while(FSTAT_FCCF == 0){}        /* check for errors */    if(FSTAT_FACCERR == 1)      {      /* clear error flag */      FSTAT = 0x10;            /* update return value*/      Return |= Flash_FACCERR;      }    if(FSTAT_FPVIOL == 1)      {      /* clear error flag */      FSTAT = 0x20;            /* update return value*/      Return |= Flash_FPVIOL;      }    }  else    {    /* flash is not init */    Return = Flash_NOT_INIT;    }  /* function return */  return  Return;}/******************************************************************************* * Function:        Flash_ByteProgram * * Description:     byte program the flash * * Returns:         Error Code * * Notes: * *******************************************************************************/unsigned char Flash_ByteProgram(unsigned long *FlashStartAdd,unsigned long *DataSrcPtr,unsigned long NumberOfBytes) {  unsigned char Return = Flash_OK;          /* Allocate space on stack to run flash command out of SRAM */ char localbuf[100]; int (*RunOnStack)(void) = (int(*)(void))localbuf; memcpy(localbuf, (void*)SpSub, (char*)SpSubEnd - (char*)SpSub);    if(FCDIV_FDIVLD == 1)    {    /* flash is init */        /* wait until FCBEF is set in FSTAT */    while(FSTAT_FCBEF == 0){}    /* check for errors */    if(FSTAT_FACCERR == 1)      {      /* clear error flag */      FSTAT = 0x10;      }    if(FSTAT_FPVIOL == 1)      {      /* clear error flag */      FSTAT = 0x20;      }    while((NumberOfBytes) &amp;amp;&amp;amp; (Return == Flash_OK))      {            /* write data to flash and increase pointers by 1 */      *FlashStartAdd++ = *DataSrcPtr++;           /* write command */      FCMD = FlashCmd_Program;            RunOnStack();      /* launch command */      //FSTAT = 0x80;            /* wait for command completion */      //while(FSTAT_FCCF == 0){}            /* check for errors */      if(FSTAT_FACCERR == 1)        {        /* clear error flag */        FSTAT = 0x10;                /* update return value*/        Return |= Flash_FACCERR;        }      if(FSTAT_FPVIOL == 1)        {        /* clear error flag */        FSTAT = 0x20;                /* update return value*/        Return |= Flash_FPVIOL;        }            /* decrement byte count */      NumberOfBytes--;      }    }  else    {    /* flash is not init */    Return = Flash_NOT_INIT;    }  /* function return */  return  Return;}/******************************************************************************* * Function:        SpSub * * Description:     Execute the Flash write while running out of SRAM * * Returns:          * * Notes: * *******************************************************************************/void SpSub(void) { asm(    //Save off registers d0, d1, and d2    link    a6,#-12    movem.l d0-d2,(sp)    // MCF_CFM_CFMUSTAT = CBEIF;    mvs.w    #128,d0    move.b   d0,0xffff9825      // while (!(MCF_CFM_CFMUSTAT &amp;amp; CCIF)){};//wait until execution complete    loop:      mvz.b    0xffff9825,d1      moveq    #25,d0      lsl.l    d0,d1      moveq    #31,d2      lsr.l    d2,d1      tst.b    d1      beq.s   loop         //Restore registers d0, d1, and d2    movem.l (sp),d0-d2    lea     12(sp),sp    unlk    a6 );}/* Leave this immediately after SpSub */void SpSubEnd(void){}&lt;/PRE&gt;&lt;/DIV&gt;&lt;BR /&gt;&amp;nbsp;&lt;BR /&gt;&lt;/DIV&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;/DIV&gt;&lt;BR /&gt;&lt;DIV&gt;&lt;/DIV&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Thu, 29 Oct 2020 09:26:15 GMT</pubDate>
      <guid>https://community.nxp.com/t5/ColdFire-68K-Microcontrollers/MCF51QE128-Problem-using-Flash-errors-in-CodeWarrior-long-post/m-p/177109#M6984</guid>
      <dc:creator>fireweaver</dc:creator>
      <dc:date>2020-10-29T09:26:15Z</dc:date>
    </item>
    <item>
      <title>Re: MCF51QE128:  Problem using Flash, errors in CodeWarrior  (long post)</title>
      <link>https://community.nxp.com/t5/ColdFire-68K-Microcontrollers/MCF51QE128-Problem-using-Flash-errors-in-CodeWarrior-long-post/m-p/177110#M6985</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;Cool, thanks.&lt;BR /&gt;&lt;BR /&gt;So it uses like 100 bytes on the stack. Shortly, some asm birds of prey should come by and cut that down, but at least you have a known working example.&lt;BR /&gt;&lt;BR /&gt;Did you track down the source of the link error?&lt;BR /&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Fri, 01 Aug 2008 00:53:18 GMT</pubDate>
      <guid>https://community.nxp.com/t5/ColdFire-68K-Microcontrollers/MCF51QE128-Problem-using-Flash-errors-in-CodeWarrior-long-post/m-p/177110#M6985</guid>
      <dc:creator>JimDon</dc:creator>
      <dc:date>2008-08-01T00:53:18Z</dc:date>
    </item>
    <item>
      <title>Re: MCF51QE128:  Problem using Flash, errors in CodeWarrior  (long post)</title>
      <link>https://community.nxp.com/t5/ColdFire-68K-Microcontrollers/MCF51QE128-Problem-using-Flash-errors-in-CodeWarrior-long-post/m-p/177111#M6986</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;BR /&gt;&lt;BLOCKQUOTE&gt;&lt;HR /&gt;JimDon wrote:&lt;BR /&gt;&lt;BR /&gt;Shortly, some asm birds of prey should come by and cut that down...&lt;BR /&gt;&lt;BR /&gt;&lt;HR /&gt;&lt;/BLOCKQUOTE&gt;/*&lt;BR /&gt;&amp;nbsp;* This is copied to the stack and executed there by the flash driver&lt;BR /&gt;&amp;nbsp;*/&lt;BR /&gt;&lt;BR /&gt;flash_wait:&lt;BR /&gt;_flash_wait:&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; /*&amp;nbsp; MCF_CFM_CFMUSTAT = CBEIF; */&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; move.l&amp;nbsp;&amp;nbsp; #__IPSBAR+0x1D0020,a0&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; move.b&amp;nbsp;&amp;nbsp; #0x80,(a0)&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;BR /&gt;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; /* while (!(MCF_CFM_CFMUSTAT &amp;amp; CCIF)){}; */&lt;BR /&gt;.loopf:&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; move.b&amp;nbsp;&amp;nbsp; (a0),d0&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; andi.l&amp;nbsp;&amp;nbsp; #0x40,d0&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; beq.s&amp;nbsp;&amp;nbsp;&amp;nbsp; .loopf&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; rts&lt;BR /&gt;&lt;BR /&gt;flash_wait_x:&lt;BR /&gt;_flash_wait_x:&lt;BR /&gt;&lt;BR /&gt;&lt;DIV&gt;&lt;/DIV&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Fri, 01 Aug 2008 01:30:09 GMT</pubDate>
      <guid>https://community.nxp.com/t5/ColdFire-68K-Microcontrollers/MCF51QE128-Problem-using-Flash-errors-in-CodeWarrior-long-post/m-p/177111#M6986</guid>
      <dc:creator>bkatt</dc:creator>
      <dc:date>2008-08-01T01:30:09Z</dc:date>
    </item>
    <item>
      <title>Re: MCF51QE128:  Problem using Flash, errors in CodeWarrior  (long post)</title>
      <link>https://community.nxp.com/t5/ColdFire-68K-Microcontrollers/MCF51QE128-Problem-using-Flash-errors-in-CodeWarrior-long-post/m-p/177112#M6987</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;Wow, that was quick.&lt;BR /&gt;I assume a0 and d0 are disposable and do not need to be saved and restored?&lt;BR /&gt;&lt;DIV&gt;&lt;/DIV&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Fri, 01 Aug 2008 01:51:46 GMT</pubDate>
      <guid>https://community.nxp.com/t5/ColdFire-68K-Microcontrollers/MCF51QE128-Problem-using-Flash-errors-in-CodeWarrior-long-post/m-p/177112#M6987</guid>
      <dc:creator>JimDon</dc:creator>
      <dc:date>2008-08-01T01:51:46Z</dc:date>
    </item>
    <item>
      <title>Re: MCF51QE128:  Problem using Flash, errors in CodeWarrior  (long post)</title>
      <link>https://community.nxp.com/t5/ColdFire-68K-Microcontrollers/MCF51QE128-Problem-using-Flash-errors-in-CodeWarrior-long-post/m-p/177113#M6988</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;I didn't track down the link error.&amp;nbsp; When I spliced in the new code and doctored it a little, that went away.&lt;BR /&gt;&lt;BR /&gt;If all this works, there are going to be a lot of happy people here at work.&amp;nbsp; &lt;IMG alt=":smileyvery-happy:" class="emoticon emoticon-smileyvery-happy" id="smileyvery-happy" src="http://freescale.i.lithium.com/i/smilies/16x16_smiley-very-happy.gif" title="Smiley Very Happy" /&gt;&lt;BR /&gt;&lt;DIV&gt;&lt;/DIV&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Fri, 01 Aug 2008 03:31:07 GMT</pubDate>
      <guid>https://community.nxp.com/t5/ColdFire-68K-Microcontrollers/MCF51QE128-Problem-using-Flash-errors-in-CodeWarrior-long-post/m-p/177113#M6988</guid>
      <dc:creator>fireweaver</dc:creator>
      <dc:date>2008-08-01T03:31:07Z</dc:date>
    </item>
    <item>
      <title>Re: MCF51QE128:  Problem using Flash, errors in CodeWarrior  (long post)</title>
      <link>https://community.nxp.com/t5/ColdFire-68K-Microcontrollers/MCF51QE128-Problem-using-Flash-errors-in-CodeWarrior-long-post/m-p/177114#M6989</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Hi to all,&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;I´m developing and event log with my internal flash and i need to erase only a sector giving the starting address of it. I use this function&lt;STRONG&gt; Flash_SectorErase &lt;/STRONG&gt;that you add but in my case it erases 2Kbytes instead of 1KB. Do you know why? How would I need to change??&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Thanks&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Tue, 16 Oct 2012 17:27:45 GMT</pubDate>
      <guid>https://community.nxp.com/t5/ColdFire-68K-Microcontrollers/MCF51QE128-Problem-using-Flash-errors-in-CodeWarrior-long-post/m-p/177114#M6989</guid>
      <dc:creator>gerardodiez</dc:creator>
      <dc:date>2012-10-16T17:27:45Z</dc:date>
    </item>
  </channel>
</rss>

