/*---------------------------------------------------------------------------* * 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 */ }
/*********************************************************************************************************************** * 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 */ }