STM32F103,HAL库如何设置flash写保护?
本帖最后由 any012 于 2016-12-26 16:19 编辑cube自带的例程里有个工程是关于flash写保护的。
但是看不懂啊。
节选了开头的一部分,想请大家帮分析下。
<div>int main(void)
{
...
/* Get pages write protection status ****************************************/
HAL_FLASHEx_OBGetConfig(&OptionsBytesStruct);
#ifdef WRITE_PROTECTION_DISABLE
/* Check if desired pages are already write protected ***********************/
if((OptionsBytesStruct.WRPPage & FLASH_PAGE_TO_BE_PROTECTED) != FLASH_PAGE_TO_BE_PROTECTED)
{...}
#elif defined WRITE_PROTECTION_ENABLE
/* Check if desired pages are not yet write protected ***********************/
if(((~OptionsBytesStruct.WRPPage) & FLASH_PAGE_TO_BE_PROTECTED )!= FLASH_PAGE_TO_BE_PROTECTED)
{...}
#endif /* WRITE_PROTECTION_DISABLE */</div><div>}
</div>
#ifdef WRITE_PROTECTION_DISABLE
if((OptionsBytesStruct.WRPPage & FLASH_PAGE_TO_BE_PROTECTED) != FLASH_PAGE_TO_BE_PROTECTED)
{...}
#elif defined WRITE_PROTECTION_ENABLE
if(((~OptionsBytesStruct.WRPPage) & FLASH_PAGE_TO_BE_PROTECTED )!= FLASH_PAGE_TO_BE_PROTECTED)
{...}
#endif /* WRITE_PROTECTION_DISABLE */
这几个条件编译,第一句,是先判断是否定义了写保护功能,如果没有的话,执行第一个条件编译,如果设置了的话,执行第二个条件编译?
根据是否定义了WRITE_PROTECTION_DISABLE这个宏,先使能写保护,或者禁止写保护。
那么接下来这些:
if ((OptionsBytesStruct.WRPPage & FLASH_PAGE_TO_BE_PROTECTED) != 0x00)
{
HAL_FLASHEx_Erase(&EraseInitStruct, &PageError);
...
}
是先擦出有写保护的页,再写入?
那么为什么不是写入数据后,再使能写保护呢?
本帖最后由 any012 于 2016-12-27 10:03 编辑
在阿莫论坛搜到了相关办法:
FLASH_OBProgramInitTypeDef OBInit;
__HAL_FLASH_PREFETCH_BUFFER_DISABLE();
HAL_FLASHEx_OBGetConfig(&OBInit);
if(OBInit.RDPLevel == RESET)
{
OBInit.OptionType = OPTIONBYTE_RDP;
OBInit.RDPLevel = OB_RDP_LEVEL_1;
HAL_FLASH_Unlock();
HAL_FLASH_OB_Unlock();
HAL_FLASHEx_OBProgram(&OBInit);
HAL_FLASH_OB_Lock();
HAL_FLASH_Lock();
}
__HAL_FLASH_PREFETCH_BUFFER_ENABLE();
这个是读保护的,写保护和这个类似。
在程序里加上这部分后,利用串口下载到单片机里,再次下载时,提示需要移除保护。
但,我如何知道是写保护起作用了还是读保护起作用了?
:lol:lol:lol:lol:lol:lol:lol:lol:lol:lol:lol:lol
页:
[1]