Пн янв 04, 2021 18:08:43
/**
* @brief Set demo sub-mode
* @param SubMode select one of 2 different demo modes.
* This parameter can be one of the following values:
* @arg @ref SUBDEMO_MODE_GPIO
* @arg @ref SUBDEMO_MODE_NRST
* Target will reboot with option byte reset reason
* @retval None
*/
static void SetDemoMode(DemoMode_t DemoMode)
{
uint32_t nrstmode;
/* Enable Flash access anyway */
__HAL_RCC_FLASH_CLK_ENABLE();
/* Unlock flash */
FLASH->KEYR = FLASH_KEY1;
FLASH->KEYR = FLASH_KEY2;
while((FLASH->CR & FLASH_CR_LOCK) != 0x00);
/* unlock option byte registers */
FLASH->OPTKEYR = 0x08192A3B;
FLASH->OPTKEYR = 0x4C5D6E7F;
while((FLASH->CR & FLASH_CR_OPTLOCK) == FLASH_CR_OPTLOCK);
/* get current user option bytes */
nrstmode = (FLASH->OPTR & ~FLASH_OPTR_NRST_MODE);
/* Select sub demo mode */
if(DemoMode == DEMO_MODE_GPIO)
{
nrstmode |= OB_RESET_MODE_GPIO;
}
else
{
nrstmode |= OB_RESET_MODE_INPUT_OUTPUT;
}
/* Program option bytes */
FLASH->OPTR = nrstmode;
/* Write operation */
FLASH->CR |= FLASH_CR_OPTSTRT;
while((FLASH->SR & FLASH_SR_BSY1) != 0);
/* Force OB Load */
FLASH->CR |= FLASH_CR_OBL_LAUNCH;
//while(1);
}