/*---------------------------------------------------------------------------*
 * delay_ms
 *---------------------------------------------------------------------------
 * Description:
 *      Uses the interval timer to delay so many milliseconds
 * Inputs:
 *      aTimeMS - milliseconds to delay
 *---------------------------------------------------------------------------*/
void delay_ms(int aTimeMS)
{
    G_msTimer = 0;
    R_IT_Start();
    while(G_msTimer < aTimeMS);
    R_IT_Stop();
}
/*---------------------------------------------------------------------------*
 * delay_ms
 *---------------------------------------------------------------------------
 * Description:
 *      Uses the interval timer to delay so many milliseconds
 * Inputs:
 *      aCount - number of 100us intervals to delay
 *---------------------------------------------------------------------------*/
void delay_100us(int aCount)
{
    G_100usTimer = 0;
    R_IT_Start();
    while(G_100usTimer < aCount);
    R_IT_Stop();
}
/***********************************************************************************************************************
* 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;
    fsl_u08 fslStatus;
    
    // prepare the interrupt vector table and user code in ram 
    FSL_userCopyInterruptToRam();
    FSL_userCopyApplicationCodeToRam();
    
    // copy the relevant FSL API sections to ram
    FSL_CopySection();
    
    // prepare the descriptor for initializing the mode
    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 = 0x0;  // status check user mode

    // retrieve the flash block numbers for checking
    FSL_userGetFlashBlockRanges(&startBlockNum, &endBlockNum);
      
    // always do this sequence before using FSL
    fslStatus = FSL_Init(&fslDescriptor);
    FSL_Open();
    FSL_PrepareFunctions();
    FSL_PrepareExtFunctions();                      
    
    // 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) {
    

      
      // toggle the led if requested
      if(keyPress) {
        
        keyPress = 0;
        P6_bit.no3 ^= 1U;

        fslStatus = eraseFromRam(startBlockNum, endBlockNum);
      
        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);
      
        fslStatus = writeFromRam(NUM_DATA_BLOCKS, &fslWriteStr);

        fslStatus = verifyFromRam(startBlockNum, endBlockNum);
      
        FSL_RestoreInterruptTable();
        
        
      };            

           
    };  
    
    /* End user code. Do not edit comment generated here */
}
/***********************************************************************************************************************
* 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 */
}
Beispiel #5
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 */
  
	uint32_t i;
	pfdl_descriptor_t descriptor;

    R_IT_Start();
    R_INTC0_Start(); 

	// this depends on the system settings!
	// fast mode @ 32 MHz in this case
	descriptor.fx_MHz_u08 = 32;
	descriptor.wide_voltage_mode_u08 = 0;
	dataFlashStatus =  PFDL_Open(&descriptor);
	
    // just copy the version string for info
	version = PFDL_GetVersionString();
	i = 0;
	do{ 
	  	libVersion[i++] = *version++; 
		if(23==i) break;
	}
	while((*version) != 0);
	
	// prepare some data
	for(i=0;i<8;i++) flashData[i] = i;
	
	// erase block 0	
	dataFlashRequest.index_u16 = 0;
	dataFlashRequest.data_pu08 = 0;
	dataFlashRequest.bytecount_u16 = 0;
	dataFlashRequest.command_enu = PFDL_CMD_ERASE_BLOCK;	  
	dataFlashStatus = PFDL_Execute(&dataFlashRequest);
	
	while(PFDL_BUSY == dataFlashStatus) {
	  dataFlashStatus = PFDL_Handler(); 	
	};	
	
	// in case of error, lit LED 2 and stay there
	if(dataFlashStatus != PFDL_OK) {	 
	  P7_bit.no6 = 0;
      while(1);
	}
	
	// check block is erased
	dataFlashRequest.index_u16 = 0;
	dataFlashRequest.data_pu08 = 0;
	dataFlashRequest.bytecount_u16 = 8;
	dataFlashRequest.command_enu = PFDL_CMD_BLANKCHECK_BYTES;	  
	dataFlashStatus = PFDL_Execute(&dataFlashRequest);
	while(PFDL_BUSY == dataFlashStatus) {
	  dataFlashStatus = PFDL_Handler(); 
	};
	
	if(dataFlashStatus != PFDL_OK) {	 
	    P7_bit.no6 = 0;
        while(1);
	}
	
	// write bytes
	dataFlashRequest.index_u16 = 0;
	dataFlashRequest.data_pu08 = &flashData[0];
	dataFlashRequest.bytecount_u16 = 8;
	dataFlashRequest.command_enu = PFDL_CMD_WRITE_BYTES;	  
	dataFlashStatus = PFDL_Execute(&dataFlashRequest);
	while(PFDL_BUSY == dataFlashStatus) {
	  dataFlashStatus = PFDL_Handler(); 	
	};
	
	if(dataFlashStatus != PFDL_OK) {	    
        P7_bit.no6 = 0;
        while(1);
	}
	
	// verify cells
	dataFlashRequest.index_u16 = 0;
	dataFlashRequest.data_pu08 = 0;
	dataFlashRequest.bytecount_u16 = 8;
	dataFlashRequest.command_enu = PFDL_CMD_IVERIFY_BYTES;	  
	dataFlashStatus =  PFDL_Execute(&dataFlashRequest);
	while(PFDL_BUSY == dataFlashStatus) {
	  dataFlashStatus = PFDL_Handler(); 	
	}
	
	if(dataFlashStatus != PFDL_OK) {	 
	    P7_bit.no6 = 0;
        while(1);
	}
	
	// destroy original data and read back from data flash
	for(i=0;i<8;i++) flashData[i] = 0xAA;	
	dataFlashRequest.index_u16 = 0;
	dataFlashRequest.data_pu08 = &flashData[0];
	dataFlashRequest.bytecount_u16 = 8;
	dataFlashRequest.command_enu = PFDL_CMD_READ_BYTES;	  
	// this execute immediately returns OK, as it does not use the sequencer
	dataFlashStatus = PFDL_Execute(&dataFlashRequest);
	// a call to the Handler will return "idle" status
	while(PFDL_BUSY == dataFlashStatus) {
	  dataFlashStatus = PFDL_Handler(); 	
	};
	
	if(dataFlashStatus != PFDL_OK) {	 
	    P7_bit.no6 = 0;
        while(1);
	}

	// now an endless loop
	while(1) {	  
	  
	  /* some fancy toggling on success */
	  P7_bit.no6 = ~ P7_bit.no6;
	  for(i=0;i<100000;i++);
	  P7_bit.no6 = ~ P7_bit.no6;
	  for(i=0;i<100000;i++);
	  P7_bit.no6 = ~ P7_bit.no6;
	  for(i=0;i<100000;i++);
	  P7_bit.no6 = ~ P7_bit.no6;
	  for(i=0;i<100000;i++);			  
    }

    /* End user code. Do not edit comment generated here */
}