Пример #1
0
/***********************************************************************************************************************
* Function Name: main
* Description  : This function implements main function.
* Arguments    : None
* Return Value : None
***********************************************************************************************************************/
void  main(void)
{
    /* Start user code. Do not edit comment generated here */
  
    uint16_t i, startBlockNum, endBlockNum;
    
    fslDescriptor.fsl_flash_voltage_u08 = 0x0;      // full speed mode
    fslDescriptor.fsl_frequency_u08 = 32;           // 32 MHz frequency, round up
    fslDescriptor.fsl_auto_status_check_u08 = 0x1;  // status check internal mode

    // retrieve the flash block numbers for checking
    FSL_userGetFlashBlockRanges(&startBlockNum, &endBlockNum);
      
    // always do this sequence first
    fslStatus = FSL_Init(&fslDescriptor);
    FSL_Open();
    FSL_PrepareFunctions();
    FSL_PrepareExtFunctions();         
               
    // prepare the interrupt vector table in ram before the timer starts
    FSL_userCopyInterruptToRam();
    
    // get the flash status
    fslVersionString = FSL_GetVersionString();            
    fslStatus = FSL_GetSecurityFlags(&fslSecurityFlags);
    fslStatus = FSL_GetBootFlag(&fslBootFlag);
    fslStatus = FSL_GetSwapState(&fslSwapState);        
    fslStatus = FSL_GetFlashShieldWindow(&fslFlashShieldWindow);        
    
    // activate the interrupt table in ram
    FSL_ChangeInterruptTable((fsl_u16)&FSL_userIsrInRam);

    R_INTC0_Start();
    R_IT_Start();
    
    // repeat in a loop to demonstrate interrupt servicing in background
    while(1) {
    
      // erase blocks
      for(i=startBlockNum;i<=endBlockNum;i++) {
        
        fslStatus = FSL_Erase(i);
        if(FSL_OK != fslStatus) while(1);
        
        fslStatus = FSL_BlankCheck(i);
        if(FSL_OK != fslStatus) while(1);       
      }
      
      FSL_RestoreInterruptTable();
      
      // prepare buffer data
      for(i=0;i<WORK_BUFFER_SIZE;i++) {
        workingBuffer[i] = i;
      }
      
      fslWriteStr.fsl_data_buffer_p_u08 = &workingBuffer[0];
      fslWriteStr.fsl_word_count_u08 = WORK_BUFFER_WDSIZE;
      fslWriteStr.fsl_destination_address_u32 = FSL_userGetFlashStartAddress();     
      
      FSL_ChangeInterruptTable((fsl_u16)&FSL_userIsrInRam);
      
      // write new data
      for(i=0;i<NUM_DATA_BLOCKS;i++) {
        
        fslStatus = FSL_Write(&fslWriteStr);
        if(FSL_OK != fslStatus) while(1);
        
        fslWriteStr.fsl_destination_address_u32 += WORK_BUFFER_SIZE;
      }
      
      // verify retention
      for(i=startBlockNum;i<=endBlockNum;i++) {
        
        fslStatus = FSL_IVerify(i);
        if(FSL_OK != fslStatus) while(1);    
      }
      
      FSL_RestoreInterruptTable();
      
      // toggle the led if requested
      if(keyPress) {
        keyPress = 0;
        P7_bit.no6 ^= 1U;
      };            

      FSL_ChangeInterruptTable((fsl_u16)&FSL_userIsrInRam);
      
    };  

    /* End user code. Do not edit comment generated here */
}
Пример #2
0
void flash_erase(void)
{
  FSL_Erase(63);  // apaga o bloco 63 (0xFC00 a 0xFFFF)
}