/**
* @简述 对期望的页面写保护
* @参数 FLASH_Pages: 待写保护页面的地址.
* 这个参数可以是:
* STM32_低密度处理器: value between FLASH_WRProt_Pages0to3 和 FLASH_WRProt_Pages28to31
* STM32_中密度处理器: value between FLASH_WRProt_Pages0to3 和 FLASH_WRProt_Pages124to127
* STM32_高密度处理器: value between FLASH_WRProt_Pages0to1 和 FLASH_WRProt_Pages60to61 或 FLASH_WRProt_Pages62to255
* STM32_连通性处理器: value between FLASH_WRProt_Pages0to1 和 FLASH_WRProt_Pages60to61 或 FLASH_WRProt_Pages62to127
* FLASH_WRProt_AllPages
* @返回 FLASH Status: 返回值可以是: FLASH_ERROR_PG, FLASH_ERROR_WRP,
* FLASH_COMPLETE 或 FLASH_TIMEOUT.
*/
FLASH_Status FLASH_EnableWriteProtection(uint32_t FLASH_Pages)
{
uint16_t WRP0_Data = 0xFFFF, WRP1_Data = 0xFFFF, WRP2_Data = 0xFFFF, WRP3_Data = 0xFFFF;
FLASH_Status status = FLASH_COMPLETE;
/* 检查参数 */
assert_param(IS_FLASH_WRPROT_PAGE(FLASH_Pages));
FLASH_Pages = (uint32_t)(~FLASH_Pages);
WRP0_Data = (uint16_t)(FLASH_Pages & WRP0_Mask);
WRP1_Data = (uint16_t)((FLASH_Pages & WRP1_Mask) >> 8);
WRP2_Data = (uint16_t)((FLASH_Pages & WRP2_Mask) >> 16);
WRP3_Data = (uint16_t)((FLASH_Pages & WRP3_Mask) >> 24);
/* 等待最后一个操作完成 */
status = FLASH_WaitForLastOperation(ProgramTimeout);
if(status == FLASH_COMPLETE)
{
/* 授权小信息块编程 */
FLASH->OPTKEYR = FLASH_KEY1;
FLASH->OPTKEYR = FLASH_KEY2;
FLASH->CR |= CR_OPTPG_Set;
if(WRP0_Data != 0xFF)
{
OB->WRP0 = WRP0_Data;
/* 等待最后一个操作完成 */
status = FLASH_WaitForLastOperation(ProgramTimeout);
}
if((status == FLASH_COMPLETE) && (WRP1_Data != 0xFF))
{
OB->WRP1 = WRP1_Data;
/* 等待最后一个操作完成 */
status = FLASH_WaitForLastOperation(ProgramTimeout);
}
if((status == FLASH_COMPLETE) && (WRP2_Data != 0xFF))
{
OB->WRP2 = WRP2_Data;
/* 等待最后一个操作完成 */
status = FLASH_WaitForLastOperation(ProgramTimeout);
}
if((status == FLASH_COMPLETE)&& (WRP3_Data != 0xFF))
{
OB->WRP3 = WRP3_Data;
/* 等待最后一个操作完成 */
status = FLASH_WaitForLastOperation(ProgramTimeout);
}
if(status != FLASH_TIMEOUT)
{
/* 如果编程操作完成,失能 OPTPG 位 */
FLASH->CR &= CR_OPTPG_Reset;
}
}
/* 返回写保护操作状态 */
return status;
}
|