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

📄 stm32f10x_flash.c

📁 stm32f10xx的中文译文例程
💻 C
📖 第 1 页 / 共 3 页
字号:
*           (2)Data:指定被编程的数据.
* 输出参数: 无
* 返回参数: FLASH状态:这个返回值可以是: FLASH_BUSY,
*                  FLASH_ERROR_PG, FLASH_ERROR_WRP, FLASH_COMPLETE or 
*                  FLASH_TIMEOUT. 
*******************************************************************************/
FLASH_Status FLASH_ProgramWord(u32 Address, u32 Data)
{
  FLASH_Status status = FLASH_COMPLETE;

  /* Check the parameters [检查参数]*/
  assert_param(IS_FLASH_ADDRESS(Address));

  /* Wait for last operation to be completed [等待最后一个操作完成]*/
  status = FLASH_WaitForLastOperation(ProgramTimeout);
  
  if(status == FLASH_COMPLETE)
  {
    /* if the previous operation is completed, proceed to program the new first 
    half word [如果前一个操作完成,编程新的第一个半字]*/
    FLASH->CR |= CR_PG_Set;
  
    *(vu16*)Address = (u16)Data;

    /* Wait for last operation to be completed [等待最后一个操作完成]*/
    status = FLASH_WaitForLastOperation(ProgramTimeout);
 
    if(status == FLASH_COMPLETE)
    {
      /* if the previous operation is completed, proceed to program the new second 
      half word [如果前一个操作完成,编程新的第二个半字]*/
      *(vu16*)(Address + 2) = Data >> 16;
    
      /* Wait for last operation to be completed [等待最后一个操作完成]*/
      status = FLASH_WaitForLastOperation(ProgramTimeout);
        
      if(status != FLASH_BUSY)
      {
        /* Disable the PG Bit [禁止PG位]*/
        FLASH->CR &= CR_PG_Reset;
      }
    }
    else
    {
      if (status != FLASH_BUSY)
      {
        /* Disable the PG Bit [禁止PG位]*/
        FLASH->CR &= CR_PG_Reset;
      }
     }
  }
  /* Return the Program Status[返回编程状态] */
  return status;
}

/*******************************************************************************
* 函数名称: FLASH_ProgramHalfWord
* 功能描述: 在特定地址编程一个半字.
* 输入参数: (1)Address:被编程的地址.
*           (2)Data:指定被编程的半字数据.
* 输出参数: 无
* 返回参数: FLASH状态:这个返回值可以是: FLASH_BUSY,
*                  FLASH_ERROR_PG, FLASH_ERROR_WRP, FLASH_COMPLETE or 
*                  FLASH_TIMEOUT. 
*******************************************************************************/
FLASH_Status FLASH_ProgramHalfWord(u32 Address, u16 Data)
{
  FLASH_Status status = FLASH_COMPLETE;

  /* Check the parameters [检查参数]*/
  assert_param(IS_FLASH_ADDRESS(Address));

  /* Wait for last operation to be completed [等待最后一个操作完成]*/
  status = FLASH_WaitForLastOperation(ProgramTimeout);
  
  if(status == FLASH_COMPLETE)
  {
    /* if the previous operation is completed, proceed to program the new data [如果前一个操作完成,编程新的数据]*/
    FLASH->CR |= CR_PG_Set;
  
    *(vu16*)Address = Data;
    /* Wait for last operation to be completed [等待最后一个操作完成]*/
    status = FLASH_WaitForLastOperation(ProgramTimeout);

    if(status != FLASH_BUSY)
    {
      /* if the program operation is completed, disable the PG Bit [如果编程操作完成,禁止PG位]*/
      FLASH->CR &= CR_PG_Reset;
    }
  } 
  /* Return the Program Status [返回编程状态]*/
  return status;
}

/*******************************************************************************
* 函数名称: FLASH_ProgramOptionByteData
* 功能描述: 在指定的选项字节数据地址上编写一个半字.
* 输入参数: (1)Address:被编程的地址,该参数可为:0x1FFFF804或0x1FFFF806. 
*           (2)Data:被编写的数据.
* 输出参数: 无
* 返回参数: FLASH状态:这个返回值可以是: FLASH_BUSY,
*                  FLASH_ERROR_PG, FLASH_ERROR_WRP, FLASH_COMPLETE or 
*                  FLASH_TIMEOUT. 
*******************************************************************************/
FLASH_Status FLASH_ProgramOptionByteData(u32 Address, u8 Data)
{
  FLASH_Status status = FLASH_COMPLETE;

  /* Check the parameters [检查参数]*/
  assert_param(IS_OB_DATA_ADDRESS(Address));

  status = FLASH_WaitForLastOperation(ProgramTimeout);

  if(status == FLASH_COMPLETE)
  {
    /* Authorize the small information block programming [授权小信息块编程]*/
    FLASH->OPTKEYR = FLASH_KEY1;
    FLASH->OPTKEYR = FLASH_KEY2;

    /* Enables the Option Bytes Programming operation [使能字节编程操作选项]*/
    FLASH->CR |= CR_OPTPG_Set; 
    *(vu16*)Address = Data;
    
    /* Wait for last operation to be completed [等待最后一个操作完成]*/
    status = FLASH_WaitForLastOperation(ProgramTimeout);

    if(status != FLASH_BUSY)
    {
      /* if the program operation is completed, disable the OPTPG Bit [如果编程操作完成,禁止OPTPG位]*/
      FLASH->CR &= CR_OPTPG_Reset;
    }
  }    
  /* Return the Option Byte Data Program Status [返回选项字节数据的编程状态]*/
  return status;      
}

/*******************************************************************************
* 函数名称: FLASH_EnableWriteProtection
* 功能描述: 对需要写保护的页进行写保护
* 输入参数: FLASH_Pages:需要写保护的页的地址。
*                 这个参数可以是:
*                    - 对于STM32F10Xxx 中密度驱动器 (FLASH 页面大小等于1 KB)
*                       - 这个值在FLASH页写保护0到3 和FLASH页写保护124到127之间
*                    - 对于STM32F10Xxx 高密度驱动器 (FLASH页面大小等于2 KB) 
*                       - 这个值在 FLASH_WRProt_Pages0到1 和
*                         FLASH页写保护60到61或者FLASH页写保护62到255 之间
*                       - 所有页的写保护
* 输出参数: 无
* 返回参数: FLASH状态:这个返回值可以是: FLASH_BUSY,
*                  FLASH_ERROR_PG, FLASH_ERROR_WRP, FLASH_COMPLETE or 
*                  FLASH_TIMEOUT.
*******************************************************************************/
FLASH_Status FLASH_EnableWriteProtection(u32 FLASH_Pages)
{
  u16 WRP0_Data = 0xFFFF, WRP1_Data = 0xFFFF, WRP2_Data = 0xFFFF, WRP3_Data = 0xFFFF;
  
  FLASH_Status status = FLASH_COMPLETE;
  
  /* Check the parameters [检查参数]*/
  assert_param(IS_FLASH_WRPROT_PAGE(FLASH_Pages));
  
  FLASH_Pages = (u32)(~FLASH_Pages);
  WRP0_Data = (vu16)(FLASH_Pages & WRP0_Mask);
  WRP1_Data = (vu16)((FLASH_Pages & WRP1_Mask) >> 8);
  WRP2_Data = (vu16)((FLASH_Pages & WRP2_Mask) >> 16);
  WRP3_Data = (vu16)((FLASH_Pages & WRP3_Mask) >> 24);
  
  /* Wait for last operation to be completed [等待最后一个操作完成]*/
  status = FLASH_WaitForLastOperation(ProgramTimeout);
  
  if(status == FLASH_COMPLETE)
  {
    /* Authorizes the small information block programming [授权小信息块编程]*/
    FLASH->OPTKEYR = FLASH_KEY1;
    FLASH->OPTKEYR = FLASH_KEY2;
    FLASH->CR |= CR_OPTPG_Set;

    if(WRP0_Data != 0xFF)
    {
      OB->WRP0 = WRP0_Data;
      
      /* Wait for last operation to be completed [等待最后一个操作完成]*/
      status = FLASH_WaitForLastOperation(ProgramTimeout);
    }
    if((status == FLASH_COMPLETE) && (WRP1_Data != 0xFF))
    {
      OB->WRP1 = WRP1_Data;
      
      /* Wait for last operation to be completed [等待最后一个操作完成]*/
      status = FLASH_WaitForLastOperation(ProgramTimeout);
    }

    if((status == FLASH_COMPLETE) && (WRP2_Data != 0xFF))
    {
      OB->WRP2 = WRP2_Data;
      
      /* Wait for last operation to be completed [等待最后一个操作完成]*/
      status = FLASH_WaitForLastOperation(ProgramTimeout);
    }
    
    if((status == FLASH_COMPLETE)&& (WRP3_Data != 0xFF))
    {
      OB->WRP3 = WRP3_Data;
     
      /* Wait for last operation to be completed [等待最后一个操作完成]*/
      status = FLASH_WaitForLastOperation(ProgramTimeout);
    }
          
    if(status != FLASH_BUSY)
    {
      /* if the program operation is completed, disable the OPTPG Bit [如果编程操作完成,禁止OPTPG位]*/
      FLASH->CR &= CR_OPTPG_Reset;
    }
  } 
  /* Return the write protection operation Status [返回写保护操作状态]*/
  return status;       
}

/*******************************************************************************
* 函数名称: FLASH_ReadOutProtection
* 功能描述: 使能(或禁能)读出保护.
*                  如果在调用这个函数之前使用者已经编程了其它的选项字节,在这个
*                  函数擦除所有的选项字节以后他必须重新编程那些选项字节 .
* 输入参数: NewState:读出保护的新状态。这个参数可被设置为:ENABLE或DISABLE.
* 输出参数: 无
* 返回参数: FLASH状态:这个返回值可以是: FLASH_BUSY,
*                  FLASH_ERROR_PG, FLASH_ERROR_WRP, FLASH_COMPLETE or 
*                  FLASH_TIMEOUT.
*******************************************************************************/
FLASH_Status FLASH_ReadOutProtection(FunctionalState NewState)
{
  FLASH_Status status = FLASH_COMPLETE;

  /* Check the parameters [检查参数]*/
  assert_param(IS_FUNCTIONAL_STATE(NewState));

  status = FLASH_WaitForLastOperation(EraseTimeout);

  if(status == FLASH_COMPLETE)
  {
    /* Authorizes the small information block programming [授权小信息块编程]*/
    FLASH->OPTKEYR = FLASH_KEY1;
    FLASH->OPTKEYR = FLASH_KEY2;

    FLASH->CR |= CR_OPTER_Set;
    FLASH->CR |= CR_STRT_Set;

    /* Wait for last operation to be completed [等待最后一个操作完成]*/
    status = FLASH_WaitForLastOperation(EraseTimeout);

    if(status == FLASH_COMPLETE)
    {
      /* if the erase operation is completed, disable the OPTER Bit [如果擦除操作完成,禁止OPTER位]*/
      FLASH->CR &= CR_OPTER_Reset;

      /* Enable the Option Bytes Programming operation [使能字节编程操作选项]*/
      FLASH->CR |= CR_OPTPG_Set; 

      if(NewState != DISABLE)
      {
        OB->RDP = 0x00;
      }
      else
      {
        OB->RDP = RDP_Key;  
      }

      /* Wait for last operation to be completed [等待最后一个操作完成]*/
      status = FLASH_WaitForLastOperation(EraseTimeout); 
    
      if(status != FLASH_BUSY)
      {
        /* if the program operation is completed, disable the OPTPG Bit [如果编程操作完成,禁止OPTPG位]*/
        FLASH->CR &= CR_OPTPG_Reset;
      }
    }
    else 
    {
      if(status != FLASH_BUSY)
      {
        /* Disable the OPTER Bit [禁止OPTER位]*/
        FLASH->CR &= CR_OPTER_Reset;
      }
    }
  }
  /* Return the protection operation Status [返回写保护操作状态]*/
  return status;      
}
    
/*******************************************************************************
* 函数名称: FLASH_UserOptionByteConfig
* 功能描述: 编写FLASH用户选项字节:IWDG_SW/RST_STOP/RST_STDBY.
* 输入参数: (1)OB_IWDG:选择IWDG模式。
*                     这个参数可以是下面的值之一:
*                     - OB_IWDG_SW: 软件IWDG被选择
*                     - OB_IWDG_HW: 硬件IWDG被选择
*           (2)OB_STOP:当进入STOP模式时重置事件。
*                     这个参数可以是下面的值之一:
*                     - OB_STOP_NoRST: 当进入STOP模式时没有产生复位
*                     - OB_STOP_RST: 当进入STOP模式时产生复位
*           (3)OB_STDBY:当进入待命模式时重置事件。

⌨️ 快捷键说明

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