📄 stm32f10x_flash.c
字号:
* (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 + -