⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 flash.c

📁 freemodbus-v1-1-1-0.zip v1.1.1版本的代码 支持多个平台
💻 C
字号:
/******************** (C) COPYRIGHT 2003 STMicroelectronics ********************* File Name          : flash.c* Author             : MCD Application Team* Date First Issued  : 07/28/2003* Description        : This file provides all the Flash software functions********************************************************************************* History:*  13/01/2006 : V3.1*  24/05/2005 : V3.0*  30/11/2004 : V2.0*  14/07/2004 : V1.3*  01/01/2004 : V1.2******************************************************************************* THE PRESENT SOFTWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING FROM THE CONTENT OF SUCH SOFTWARE AND/OR THE USE MADE BY CUSTOMERS OF THE CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.*******************************************************************************/#include "flash.h"/******************************************************************************** Function Name  : FLASH_Init* Description    : Initialise the Flash registers to their default values.* Input          : None.* Return         : None.*******************************************************************************/void FLASH_Init(void){/* Reset Flash Control Registers */  FLASHR->CR0 = 0x00000000;  FLASHR->CR1 = 0x00000000;/* Reset Flash Data Registers */  FLASHR->DR0 = 0xFFFFFFFF;  FLASHR->DR1 = 0xFFFFFFFF;/* Reset Flash Error Register */  FLASHR->ER  = 0x00000000;}/******************************************************************************** Function Name  : FLASH_WordWrite* Description    : Writes a Word in the Flash.* Input 1        : Address of the Destination.* Input 2        : Word to program at Address.* Return         : None.*******************************************************************************/void FLASH_WordWrite(u32 XtargetAdd, u32 Xdata){  /* Wait until another operation going on is completed */  FLASH_WaitForLastTask();  /* Set the Word Programming bit 'WPG' in the CR0 Reg */  FLASHR->CR0 |= FLASH_WPG_Mask;  /* Load the destination address in AR */  FLASHR->AR   = XtargetAdd;  /* Load DATA to be programmed in DR0 */  FLASHR->DR0  = Xdata;  /* Set the Write Mode Start bit 'WMS' in the CR0 Reg to Start Write Operation */  FLASHR->CR0 |= FLASH_WMS_Mask;  /* Wait until the write operation is completed */  FLASH_WaitForLastTask();}/******************************************************************************** Function Name  : FLASH_DWordWrite* Description    : Writes Double Word to the Flash.* Input 1        : Address of the Destination.* Input 2        : Word 1 to program.* Input 3        : Word 2 to program.* Return         : None.*******************************************************************************/void FLASH_DWordWrite(u32 XtargetAdd, u32 Xdata0, u32 Xdata1){  /* Wait until another operation going on is completed */  FLASH_WaitForLastTask();  /* set the Double Word Programming bit 'DWPG' in the CR0 Reg */  FLASHR->CR0 |= FLASH_DWPG_Mask;  /* Load the destination address in AR */  FLASHR->AR   = XtargetAdd;  /* Load DATA0 in DR0 Reg */  FLASHR->DR0  = Xdata0;  /* Load DATA1 in DR1 Reg */  FLASHR->DR1  = Xdata1;  /* Set the Write Mode Start bit 'WMS' in the CR0 Reg to Start Write Operation */  FLASHR->CR0 |= FLASH_WMS_Mask;  /* Wait until the write operation is completed */  FLASH_WaitForLastTask();}/******************************************************************************** Function Name  : FLASH_SectorErase* Description    : Erases a Flash sector.* Input 1        : Sectors to be Erased.* Return         : None.*******************************************************************************/void FLASH_SectorErase(u32 Xsectors){  /* Wait until another operation going on is completed */    FLASH_WaitForLastTask();  /* Set the Sector Erase flag 'SER' in the CRO reg */  FLASHR->CR0 |= FLASH_SER_Mask;  /* Select in the CR1 register the Sectors to be erased  */  FLASHR->CR1 |= Xsectors;  /* Set the Write Mode Start bit 'WMS' in the CR0 Reg to Start Erase Operation */  FLASHR->CR0 |= FLASH_WMS_Mask;  /* Wait until the erase operation is completed */  FLASH_WaitForLastTask();}/******************************************************************************** Function Name  : FLASH_Suspend* Description    : Suspends the current program or erase operation.* Input 1        : None.* Return         : Flash CR0 register content.*******************************************************************************/u32 FLASH_Suspend(void){  u32 temp;  /* Save the CR0 Content */  temp = FLASHR->CR0;  /* Set The suspend Bit 'SUSP' in the CR0 register */  FLASHR->CR0 |= FLASH_SUSP_Mask;  /* Wait until the flash controller acknowledges the suspend of the current     operation */  FLASH_WaitForLastTask();  return temp;}/******************************************************************************** Function Name  : FLASH_Resume* Description    : Resume a Suspended program or erase operation.* Input 1        : The operation to be resumed.* Return         : None.*******************************************************************************/void FLASH_Resume(u32 FLASH_LastOperation){  /* Clear The suspend Bit 'SUSP' in the FRC0 register */  FLASHR->CR0 &= ~FLASH_SUSP_Mask;  /* Resume last operation */  FLASHR->CR0 = FLASH_LastOperation & 0x7FFFFFFF;  /* Set write mode bit */  FLASHR->CR0  |= FLASH_WMS_Mask;}/******************************************************************************** Function Name  : FLASH_WordRead* Description    : Read a single word from the flash* Input 1        : Source Address* Return         : Word*******************************************************************************/u32 FLASH_WordRead(u32 FLASH_SourceAdd){  FLASH_WaitForLastTask();  /* Reads the data from the specified Address */  return *(u32 *)(FLASH_SourceAdd + 0x40000000);}/******************************************************************************** Function Name  : FLASH_FlagStatus* Description    : Returns the NewState of Flash flags* Input          : Xflag(FLASH_BSYA0,  FLASH_BSYA1, FLASH_LOCK, FLASH_INTP*                  FLASH_B0S, FLASH_B1S, FLASH_ERR, FLASH_ERER, FLASH_PGER, *                  FLASH_10ER, FLASH_SEQER, FLASH_RESER, FLASH_WPF)  * Return         : FlagStatus (SET or RESET).*******************************************************************************/FlagStatus FLASH_FlagStatus(flashflags Xflag){  FlagStatus TmpResult = RESET;  u8 TmpReg;  u8 TmpPos;  /* Get the Register Index */  TmpReg = (Xflag & FLASH_Reg_Mask) >> 5;  /* Get the Flag Index */  TmpPos = (Xflag & FLASH_Flag_Mask);  switch(TmpReg)  {    case 0 : /* CR0 */    {      /* Returns the status of the CR0[TmpPos] flag */      TmpResult = (FLASHR->CR0 & (1<<TmpPos))==0 ? RESET : SET;      break;    }    case 1 : /* CR1 */    {      /* Returns the status of the CR1[TmpPos] flag */      TmpResult = (FLASHR->CR1 & (1<<TmpPos))==0 ? RESET : SET;      break;    }    case 5 : /* ER */    {      /* Returns the status of the ER[TmpPos] flag */      TmpResult = (FLASHR->ER  & (1<<TmpPos))==0 ? RESET : SET;      break;    }  }  return(TmpResult);}/******************************************************************************** Function Name  : FLASH_FlagClear.* Description    : Clears a flash flag.* Input          : Xflag(FLASH_BSYA0,  FLASH_BSYA1, FLASH_LOCK, FLASH_INTP*                  FLASH_B0S, FLASH_B1S, FLASH_ERR, FLASH_ERER, FLASH_PGER, *                  FLASH_10ER, FLASH_SEQER, FLASH_RESER, FLASH_WPF).  * Return         : None.*******************************************************************************/void FLASH_FlagClear(flashflags Xflag){  u8 TmpReg, TmpPos;  TmpReg = (Xflag & FLASH_Reg_Mask) >> 5;  TmpPos = (Xflag & FLASH_Flag_Mask);  switch(TmpReg)  {    case 0 : /* CR0 */    {      /* Clears the status of the CR0[TmpPos] flag */      FLASHR->CR0 &= ~(1<<TmpPos);      break;    }    case 1 : /* CR1 */    {      /* Clears the status of the CR1[TmpPos] flag */      FLASHR->CR1 &= ~(1<<TmpPos);      break;    }    case 5 : /* ER */    {      /* Clears the status of the ER[TmpPos] flag */      FLASHR->ER &= ~(1<<TmpPos);      break;    }  }}/******************************************************************************** Function Name  : FLASH_WritePrConfig* Description    : Enable Write protection or Disable temporarily Write *                  protection of a flash sector.* Input 1        : Flash Sector.* Input 2        : Enable or disable Flash sector Write Protection.* Return         : None.*******************************************************************************/void FLASH_WritePrConfig(u32 Xsectors, FunctionalState NewState){  /* Wait until another operation going on is completed */    FLASH_WaitForLastTask();    /* Enable Xsectors write protection */  if (NewState == ENABLE)  {    /* Set the Set protection Bit */    FLASHR->CR0 |= FLASH_SPR_Mask;    /* Set the Register Address */    FLASHR->AR  = 0x4010DFB0;    /* Data to be programmed to the Protection Register */    FLASHR->DR0  = ~Xsectors;    /* Set the WMS bit to Start the Sequence */    FLASHR->CR0 |= FLASH_WMS_Mask;  }  /* Unprotect temporarily Flash sector */   else  {    /* Set the Set protection Bit */    FLASHR->CR0 |= FLASH_SPR_Mask;    /* Set the Register Address */    FLASHR->AR  = 0x4010DFB0;    /* Data to be programmed to the Protection Register */    FLASHR->DR0  = FLASHPR->NVWPAR|Xsectors;    /* Set the WMS bit to Start the Sequence */    FLASHR->CR0 |= FLASH_WMS_Mask;  }}/******************************************************************************** Function Name  : FLASH_PermanentDebugPrConfig* Description    : Configures the Debug Protection Bits* Input 1        : NewState: ENABLE or DISABLE.* Return         : None.*******************************************************************************/void FLASH_PermanentDebugPrConfig(FunctionalState NewState){  u16 ProtectionLevel = FLASH_ProtectionLevel();  /* Enable permanent Debug protection */  if (NewState == ENABLE)  {    /* If this is the first time that the debug protection is enabled:Reset        the DBGP bit in the NVAPR0 register */    if(!ProtectionLevel)     {      /* Set the Set protection Bit */      FLASHR->CR0 |= FLASH_SPR_Mask;      /* Set the Register Address */      FLASHR->AR  = 0x4010DFB8;      /* Data to be programmed to the Protection Register NVAPR0 */      FLASHR->DR0 = ~2;      /* Set the WMS bit to start the sequence */      FLASHR->CR0 |= FLASH_WMS_Mask;    }    /* If this is not the first time that the debug protection is enabled:        use of NVAPR1 register */    else     {      /* Set the Set protection Bit */      FLASHR->CR0 |= FLASH_SPR_Mask;      /* Set the Register Address */      FLASHR->AR  = 0x4010DFBC;      /* Data to be programmed to the Protection Register NVAPR1(PEN bits) */      FLASHR->DR0 =~(1<<(15+ProtectionLevel));      /* Set the WMS bit to Start the Sequence */      FLASHR->CR0 |= FLASH_WMS_Mask;    }  }   /* Permanent debug unprotection: use of NVAPR1 register */    else if(ProtectionLevel)    {      /* Set the Set protection Bit */      FLASHR->CR0 |= FLASH_SPR_Mask;      /* Set the Register Address */      FLASHR->AR  = 0x4010DFBC;      /* Data to be programmed to the Protection Register NVAPR1(PDS bits)*/      FLASHR->DR0 =~(1<<(ProtectionLevel-1));      /* Set the WMS bit to Start the Sequence */      FLASHR->CR0 |= FLASH_WMS_Mask;  }}/******************************************************************************** Function Name  : FLASH_ProtectionLevel* Description    : If the flash is Debug protected, up to 16 unprotection/*                  protection cycles are possible using the NVAPR1 register.*                  This routine returns the number of times of Debug unprotection. * Input          : None.* Return         : Number of times of Debug Protection/Unprotection(0..15)*                  Example: if 5 is returned, this means that the flash was debug *                  unprotected 5 times(using PDS bits)and debug protected 5 times *                  (1 time:using DBGP bit & 4 times: using PEN bits.   *******************************************************************************/u16 FLASH_ProtectionLevel(void){  u16 TmpBitIndex =0;  u16 ProtectionRegs;  /* If DBGP = 1(Flash is Debug protected */  if(FLASHPR->NVAPR0&2)    TmpBitIndex=0;  /*If DBGP = 0 (Flash is not Debug protected */  else    TmpBitIndex=1;    ProtectionRegs=~(FLASHPR->NVAPR1>>16);  while (((ProtectionRegs) != 0) && (TmpBitIndex < 16))  {    ProtectionRegs  = ProtectionRegs >>  1 ;    TmpBitIndex++;  }  return TmpBitIndex;}/******************************************************************************** Function Name  : FLASH_WaitForLastTask* Description    : Waits for the end of last task on a Flash Bank.* Input 1        : None.* Return         : None.*******************************************************************************/void FLASH_WaitForLastTask(void){  while (FLASHR->CR0&0x16);}/*******************(C)COPYRIGHT 2003 STMicroelectronics *****END OF FILE****/

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -