void mcf52235_init_flash(void){ // Set CFMCLKD to get a flashCLK between 150 kHz and 200 kHz. // Array damage due to overstress can occur when fCLK is less than 150 kHz. // Incomplete programming and erasure can occur when fCLK is greater than 200 kHz. // Not so clear in the RefManual, but it works out to be : // flashCLK = FSYS/2 /(8*MCF_CFM_CFMCLKD_PRDIV8) /(MCF_CFM_CFMCLKD_DIV+1) // Calculate the divider to get a flashCLK closest to 200kHz (smaller or equal) : if (FSYS > 25600000) { MCF_CFM_CFMCLKD = MCF_CFM_CFMCLKD_PRDIV8|MCF_CFM_CFMCLKD_DIV((FSYS/2/8/200000)-1); } else { MCF_CFM_CFMCLKD = MCF_CFM_CFMCLKD_DIV((FSYS/2/200000)-1); } //MCF_CFM_CFMPROT=0;//No sector is protected //MCF_CFM_CFMSACC=0;//Flash sectors are placed in supervisor address space //MCF_CFM_CFMDACC=0; //MCF_CFM_CFMMCR=0x20; MCF_CFM_CFMMCR = 0; —–}
cpu_frequency = 60000000; bus_frequency = cpu_frequency/2; if (bus_frequency > 12800000) { MCF_CFM_CFMCLKD = MCF_CFM_CFMCLKD_PRDIV8|MCF_CFM_CFMCLKD_DIV((bus_frequency-1)/8/200000); } else { MCF_CFM_CFMCLKD = MCF_CFM_CFMCLKD_DIV((bus_frequency-1)/200000); }
The flash controller module runs at the system clock frequency divided by 2, but
FCLK must be divided down from this frequency to a frequency between 150 kHz and 200 kHz. Use the
following procedure to set the PRDIV8 and DIV[5:0] bits in the clock configuration register.
CFMCLKD DIV bit field must be chosen such that the following equation is valid:
If PRDIV8 == 1 then FCLK = input clock / 8, else FCLK = input clock
If (FCLK[KHz] / 200KHz) is integer then DIV = (FCLK[KHz] / 200KHz) - 1,
else DIV = INT (FCLK[KHz] / 200kHz)
What do you think?
// Calculate the divider to get a flashCLK closest to 200kHz (smaller or equal) : if (FSYS > 25600000) { MCF_CFM_CFMCLKD = MCF_CFM_CFMCLKD_PRDIV8|MCF_CFM_CFMCLKD_DIV((FSYS/2/8 -1)/200000); } else { MCF_CFM_CFMCLKD = MCF_CFM_CFMCLKD_DIV((FSYS/2 -1)/200000); }