1 /*****************************************************************************/
\r
2 /* THIS SAMPLE CODE IS PROVIDED AS IS AND IS SUBJECT TO ALTERATIONS. FUJITSU */
\r
3 /* MICROELECTRONICS ACCEPTS NO RESPONSIBILITY OR LIABILITY FOR ANY ERRORS OR */
\r
4 /* ELIGIBILITY FOR ANY PURPOSES. */
\r
5 /* (C) Fujitsu Microelectronics Europe GmbH */
\r
6 /*****************************************************************************/
\r
9 #include "mb91465k.h"
\r
11 static unsigned int IFlag;
\r
13 #pragma section CODE=IRAM,attr=CODE
\r
16 void FLASH_PrepareWriteHalfWordMode()
\r
18 /* Set FLASH Access Mode via BootROM Routine */
\r
19 /* For details refer to the Hardware Manual or Data Sheet */
\r
24 LDI #0x01,R4 ; Set FLASH to 16Bit read/write Mode
\r
25 LDI #0x04,R5 ; Go 4 times through delay loop (64MHz CLKB)
\r
33 /* Set the FLASH Interface to Write Timing */
\r
34 /* For details refer to the Hardware Manual or Data Sheet */
\r
35 /* Setting shown here is for CLKB = 64MHz */
\r
41 void FLASH_PrepareReadMode()
\r
43 /* Set FLASH Access Mode via BootROM Routine */
\r
44 /* For details refer to the Hardware Manual or Data Sheet */
\r
49 LDI #0x00,R4 ; Set FLASH to 32Bit read/write Mode
\r
50 LDI #0x04,R5 ; Go 4 times through delay loop (64MHz CLKB)
\r
58 /* Set the FLASH Interface to Read Timing */
\r
59 /* For details refer to the Hardware Manual or Data Sheet */
\r
60 /* Setting shown here is for CLKB = 64MHz */
\r
67 unsigned char FLASH_SectorErase(unsigned int secadr)
\r
69 unsigned char flag = 0;
\r
70 volatile unsigned int value = 0;
\r
72 /* Disable Interrupts if necessary */
\r
73 IFlag = FLASH_SaveDisableInterruptFlag();
\r
75 /* Set FLASH access mode to 16Bit Write Mode */
\r
76 FLASH_PrepareWriteHalfWordMode();
\r
80 /* Start FLASH Sector Erase Sequence */
\r
86 *(unsigned short int *)secadr = 0x0030;
\r
88 /* Wait for the Auto Algorithm to start */
\r
89 while( !( *(unsigned short int *)secadr & SETIMR ) )
\r
91 /* Feed the Hardware Watchdog */
\r
94 /* Check for Pending Interrupts */
\r
95 if( FLASH_CheckPendingInterrupt() )
\r
97 /* Wait for Sector Erase Suspend */
\r
98 FLASH_SuspendSectorErase(secadr);
\r
100 /* Set FLASH access mode to 32Bit Read Mode */
\r
101 FLASH_PrepareReadMode();
\r
103 /* Restore the original Interrupt Flag */
\r
104 FLASH_RestoreInterruptFlag(IFlag);
\r
106 /* Keep on checking for pending Interrupts */
\r
107 while( FLASH_CheckPendingInterrupt() ) HWWD_CL = 0;
\r
109 /* Disable Interrupts if necessary */
\r
110 IFlag = FLASH_SaveDisableInterruptFlag();
\r
112 /* Set FLASH access mode to 16Bit Write Mode */
\r
113 FLASH_PrepareWriteHalfWordMode();
\r
115 /* Sector Erase Resume */
\r
116 FLASH_ResumeSectorErase(secadr);
\r
120 /* Wait for the Auto Algorithm to finish */
\r
123 /* Feed Hardware Watchdog */
\r
126 /* Check for Pending Interrupts */
\r
127 if( FLASH_CheckPendingInterrupt() )
\r
129 /* Sector Erase Suspend */
\r
130 FLASH_SuspendSectorErase(secadr);
\r
132 /* Set FLASH access mode to 32Bit Read Mode */
\r
133 FLASH_PrepareReadMode();
\r
135 /* Restore the original Interrupt Flag */
\r
136 FLASH_RestoreInterruptFlag(IFlag);
\r
138 /* Keep on checking for pending Interrupts */
\r
139 while( FLASH_CheckPendingInterrupt() ) HWWD_CL = 0;
\r
141 /* Disable Interrupts if necessary */
\r
142 IFlag = FLASH_SaveDisableInterruptFlag();
\r
144 /* Set FLASH access mode to 16Bit Write Mode */
\r
145 FLASH_PrepareWriteHalfWordMode();
\r
147 /* Sector Erase Resume */
\r
148 FLASH_ResumeSectorErase(secadr);
\r
152 /* Check the Hardware Sequence Flags */
\r
153 if( ( *(unsigned short int *)secadr /* value */ & DPOLL ) )
\r
157 if( ( *(unsigned short int *)secadr /* value */ & TLOVER ) )
\r
159 if( ( *(unsigned short int *)secadr /* value */ & DPOLL ) )
\r
174 /* Restore the original Interrupt Flag */
\r
175 FLASH_RestoreInterruptFlag(IFlag);
\r
177 /* Set FLASH access mode to 32Bit Read Mode */
\r
178 FLASH_PrepareReadMode();
\r
183 unsigned char FLASH_SectorBlankCheck(unsigned int secaddr, unsigned int size)
\r
185 unsigned int count;
\r
186 unsigned char empty_flag = 0;
\r
187 unsigned int addr = secaddr;
\r
189 /* Clear FIXE bit to see FLASH memory content instead of fixed reset vector */
\r
192 for(count = 0; count < size; count ++)
\r
194 /* Clear Hardware Watchdog */
\r
196 if( *(unsigned int *)addr != 0xFFFFFFFF ) empty_flag = 1;
\r
200 /* Set FIXE bit to see fixed reset vector */
\r
203 if( empty_flag != 0 )
\r
211 unsigned char FLASH_WriteHalfWord(unsigned int adr, unsigned short int data)
\r
213 unsigned char flag = 0;
\r
215 /* Disable Interrupts if necessary */
\r
216 IFlag = FLASH_SaveDisableInterruptFlag();
\r
218 /* Set FLASH access mode to 16Bit Write Mode */
\r
219 FLASH_PrepareWriteHalfWordMode();
\r
221 /* Start Write FLASH Sequence */
\r
225 *((volatile unsigned short int *)adr) = data;
\r
227 /* Wait for the Auto Algorithm to finish */
\r
230 /* Feed Hardware Watchdog */
\r
233 if( ( *(volatile unsigned short int *)adr & DPOLL ) == (data & DPOLL) )
\r
237 if( ( *(volatile unsigned short int *)adr & TLOVER ) == TLOVER )
\r
239 if( ( *(volatile unsigned short int *)adr & DPOLL ) == (data & DPOLL) )
\r
245 /* Reset FLASH (keep in mind 16Bit access to FLASH) */
\r
246 *hseq_1 = 0x00F0; // Keep in Mind (16Bit access)
\r
253 /* Set FLASH access mode to 32Bit Read Mode */
\r
254 FLASH_PrepareReadMode();
\r
256 /* Restore the original Interrupt Flag */
\r
257 FLASH_RestoreInterruptFlag(IFlag);
\r
263 unsigned char FLASH_ReadReset()
\r
271 _FLASH_SaveDisableInterruptFlag:
\r
274 LDI #0x00000010,R0
\r
275 AND R0,R4 ; Store Original Flag
\r
276 ANDCCR #0xFFFFFFEF ; Clear Interrupt Flag
\r
283 _FLASH_RestoreInterruptFlag:
\r
285 MOV PS,R0 ; Get current PS
\r
286 OR R4,R0 ; Set Flag as saved
\r
287 MOV R0,PS ; Write back PS
\r
293 unsigned char FLASH_SuspendSectorErase(unsigned int secaddr)
\r
295 /* Write Sector Erase Suspend Command */
\r
296 *(volatile unsigned short int *)secaddr = 0x00B0;
\r
298 /* Wait for the FLASH macro to suspend sector erase */
\r
299 while(!(*(unsigned short int *)secaddr /* value */ & DPOLL) && (*(unsigned short int *)secaddr /* value */ & SETIMR))
\r
307 unsigned char FLASH_ResumeSectorErase(unsigned int secaddr)
\r
309 /* Write the Sector Erase Resume Command */
\r
310 *(volatile unsigned short int *)secaddr = 0x0030;
\r
312 /* Wait for the FLASH Macro to resume sector erase */
\r
313 while((*(unsigned short int *)secaddr /*value */ & DPOLL) && !(*(unsigned short int *)secaddr /*value */ & SETIMR))
\r
321 unsigned char FLASH_CheckPendingInterrupt()
\r
323 /* Poll for Pending Interrupts which are needed here */
\r
324 if(TMCSR0_UF) return 1; /* in this sample the only interrupt source supervised is Reload Timer 0 */
\r
326 /* and return 1 when an Interrupt is pending */
\r