/** * @brief Program option bytes * @param pOBInit: pointer to an FLASH_OBInitStruct structure that * contains the configuration information for the programming. * * @retval HAL Status */ HAL_StatusTypeDef HAL_FLASHEx_OBProgram(FLASH_OBProgramInitTypeDef *pOBInit) { HAL_StatusTypeDef status = HAL_ERROR; /* Process Locked */ __HAL_LOCK(&pFlash); /* Check the parameters */ assert_param(IS_OPTIONBYTE(pOBInit->OptionType)); /*Write protection configuration*/ if((pOBInit->OptionType & OPTIONBYTE_WRP) == OPTIONBYTE_WRP) { assert_param(IS_WRPSTATE(pOBInit->WRPState)); if(pOBInit->WRPState == OB_WRPSTATE_ENABLE) { /*Enable of Write protection on the selected Sector*/ status = FLASH_OB_EnableWRP(pOBInit->WRPSector, pOBInit->Banks); } else { /*Disable of Write protection on the selected Sector*/ status = FLASH_OB_DisableWRP(pOBInit->WRPSector, pOBInit->Banks); } } /*Read protection configuration*/ if((pOBInit->OptionType & OPTIONBYTE_RDP) == OPTIONBYTE_RDP) { status = FLASH_OB_RDP_LevelConfig(pOBInit->RDPLevel); } /*USER configuration*/ if((pOBInit->OptionType & OPTIONBYTE_USER) == OPTIONBYTE_USER) { status = FLASH_OB_UserConfig(pOBInit->USERConfig&OB_IWDG_SW, pOBInit->USERConfig&OB_STOP_NO_RST, pOBInit->USERConfig&OB_STDBY_NO_RST); } /*BOR Level configuration*/ if((pOBInit->OptionType & OPTIONBYTE_BOR) == OPTIONBYTE_BOR) { status = FLASH_OB_BOR_LevelConfig(pOBInit->BORLevel); } /* Process Unlocked */ __HAL_UNLOCK(&pFlash); return status; }
/** * @brief Program option bytes * @note The function HAL_FLASH_Unlock() should be called before to unlock the FLASH interface * The function HAL_FLASH_OB_Unlock() should be called before to unlock the options bytes * The function HAL_FLASH_OB_Launch() should be called after to force the reload of the options bytes * (system reset will occur) * * @param pOBInit: pointer to an FLASH_OBInitStruct structure that * contains the configuration information for the programming. * * @retval HAL_StatusTypeDef HAL Status */ HAL_StatusTypeDef HAL_FLASHEx_OBProgram(FLASH_OBProgramInitTypeDef *pOBInit) { HAL_StatusTypeDef status = HAL_ERROR; /* Check the parameters */ assert_param(IS_OPTIONBYTE(pOBInit->OptionType)); /* Write protection configuration */ if((pOBInit->OptionType & OPTIONBYTE_WRP) == OPTIONBYTE_WRP) { assert_param(IS_WRPSTATE(pOBInit->WRPState)); if (pOBInit->WRPState == OB_WRPSTATE_ENABLE) { /* Enable of Write protection on the selected page */ status = FLASH_OB_EnableWRP(pOBInit->WRPPage); } else { /* Disable of Write protection on the selected page */ status = FLASH_OB_DisableWRP(pOBInit->WRPPage); } } /* Read protection configuration */ if((pOBInit->OptionType & OPTIONBYTE_RDP) == OPTIONBYTE_RDP) { status = FLASH_OB_RDP_LevelConfig(pOBInit->RDPLevel); } /* USER configuration */ if((pOBInit->OptionType & OPTIONBYTE_USER) == OPTIONBYTE_USER) { status = FLASH_OB_UserConfig(pOBInit->USERConfig); } /* DATA configuration*/ if((pOBInit->OptionType & OPTIONBYTE_DATA) == OPTIONBYTE_DATA) { status = FLASH_OB_ProgramData(pOBInit->DATAAddress, pOBInit->DATAData); } return status; }
/** * @brief Program option bytes * @param pOBInit pointer to an FLASH_OBInitStruct structure that * contains the configuration information for the programming. * * @retval HAL Status */ HAL_StatusTypeDef HAL_FLASHEx_OBProgram(FLASH_OBProgramInitTypeDef *pOBInit) { HAL_StatusTypeDef status = HAL_OK; /* Process Locked */ __HAL_LOCK(&pFlash); /* Check the parameters */ assert_param(IS_OPTIONBYTE(pOBInit->OptionType)); pFlash.ErrorCode = HAL_FLASH_ERROR_NONE; /*Write protection configuration*/ if((pOBInit->OptionType & OPTIONBYTE_WRP) == OPTIONBYTE_WRP) { assert_param(IS_WRPSTATE(pOBInit->WRPState)); assert_param(IS_FLASH_BANK(pOBInit->Banks)); if(pOBInit->WRPState == OB_WRPSTATE_ENABLE) { /*Enable of Write protection on the selected Sector*/ status = FLASH_OB_EnableWRP(pOBInit->WRPSector,pOBInit->Banks); } else { /*Disable of Write protection on the selected Sector*/ status = FLASH_OB_DisableWRP(pOBInit->WRPSector, pOBInit->Banks); } if(status != HAL_OK) { /* Process Unlocked */ __HAL_UNLOCK(&pFlash); return status; } } /* Read protection configuration */ if((pOBInit->OptionType & OPTIONBYTE_RDP) != RESET) { /* Configure the Read protection level */ status = FLASH_OB_RDPConfig(pOBInit->RDPLevel); if(status != HAL_OK) { /* Process Unlocked */ __HAL_UNLOCK(&pFlash); return status; } } /* User Configuration */ if((pOBInit->OptionType & OPTIONBYTE_USER) != RESET) { /* Configure the user option bytes */ status = FLASH_OB_UserConfig(pOBInit->USERType, pOBInit->USERConfig); if(status != HAL_OK) { /* Process Unlocked */ __HAL_UNLOCK(&pFlash); return status; } } /* PCROP Configuration */ if((pOBInit->OptionType & OPTIONBYTE_PCROP) != RESET) { assert_param(IS_FLASH_BANK(pOBInit->Banks)); /*Configure the Proprietary code readout protection */ status = FLASH_OB_PCROPConfig(pOBInit->PCROPConfig, pOBInit->PCROPStartAddr, pOBInit->PCROPEndAddr, pOBInit->Banks); if(status != HAL_OK) { /* Process Unlocked */ __HAL_UNLOCK(&pFlash); return status; } } /*BOR Level configuration*/ if((pOBInit->OptionType & OPTIONBYTE_BOR) == OPTIONBYTE_BOR) { status = FLASH_OB_BOR_LevelConfig(pOBInit->BORLevel); if(status != HAL_OK) { /* Process Unlocked */ __HAL_UNLOCK(&pFlash); return status; } } /*Boot Address configuration*/ if((pOBInit->OptionType & OPTIONBYTE_BOOTADD) == OPTIONBYTE_BOOTADD) { status = FLASH_OB_BootAddConfig(pOBInit->BootConfig, pOBInit->BootAddr0, pOBInit->BootAddr1); if(status != HAL_OK) { /* Process Unlocked */ __HAL_UNLOCK(&pFlash); return status; } } /*Bank1 secure area configuration*/ if((pOBInit->OptionType & OPTIONBYTE_SECURE_AREA) == OPTIONBYTE_SECURE_AREA) { status = FLASH_OB_SecureAreaConfig(pOBInit->SecureAreaConfig, pOBInit->SecureAreaStartAddr, pOBInit->SecureAreaEndAddr,pOBInit->Banks); if(status != HAL_OK) { /* Process Unlocked */ __HAL_UNLOCK(&pFlash); return status; } } /* Process Unlocked */ __HAL_UNLOCK(&pFlash); return status; }
/** * @brief Main program * @param None * @retval None */ int main(void) { /*!< At this stage the microcontroller clock setting is already configured, this is done through SystemInit() function which is called from startup file (startup_stm32l1xx_xx.s) before to branch to application main. To reconfigure the default setting of SystemInit() function, refer to system_stm32l1xx.c file */ /* Set the vector table address */ #if defined(BOOT_FROM_BANK1) /* Set the vector table to the Bank1 start address */ NVIC_SetVectorTable(NVIC_VectTab_FLASH, BANK1_START_ADDRESS); #elif defined(BOOT_FROM_BANK2) /* Set the vector table to the Bank1 start address */ NVIC_SetVectorTable(NVIC_VectTab_FLASH, BANK2_START_ADDRESS); #endif /* BOOT_FROM_BANK1 */ /* Initialize LEDs, Buttons and LCD on STM32L152D-EVAL board ****************/ STM_EVAL_LEDInit(LED1); STM_EVAL_LEDInit(LED2); STM_EVAL_LEDInit(LED3); STM_EVAL_LEDInit(LED4); /* Save the first BANK1 page */ FLASH_SaveBANK1(); /* Save the first BANK2 page */ FLASH_SaveBANK2(); /* SysTick end of count event each 10ms */ RCC_GetClocksFreq(&RCC_Clocks); SysTick_Config(RCC_Clocks.HCLK_Frequency / 100); /* Configure the Joystick buttons */ STM_EVAL_PBInit(BUTTON_UP, BUTTON_MODE_GPIO); STM_EVAL_PBInit(BUTTON_SEL, BUTTON_MODE_GPIO); STM_EVAL_PBInit(BUTTON_DOWN, BUTTON_MODE_GPIO); STM_EVAL_PBInit(BUTTON_RIGHT, BUTTON_MODE_GPIO); STM_EVAL_PBInit(BUTTON_LEFT, BUTTON_MODE_GPIO); /* Initialize the LCD */ STM32L152D_LCD_Init(); /* Display message on STM32L152D-EVAL LCD ************************************/ /* Clear the LCD */ LCD_Clear(LCD_COLOR_WHITE); /* Set the LCD Back Color */ #if defined(BOOT_FROM_BANK1) LCD_SetBackColor(LCD_COLOR_BLUE); #elif defined(BOOT_FROM_BANK2) LCD_SetBackColor(LCD_COLOR_RED); #endif /* BOOT_FROM_BANK1 */ /* Set the LCD Text Color */ LCD_SetTextColor(LCD_COLOR_WHITE); LCD_DisplayStringLine(LCD_LINE_0, MESSAGE1); LCD_DisplayStringLine(LCD_LINE_1, MESSAGE2); LCD_DisplayStringLine(LCD_LINE_2, MESSAGE3); LCD_DisplayStringLine(LCD_LINE_4, MESSAGE4); LCD_SetFont(&Font12x12); LCD_SetTextColor(LCD_COLOR_GREEN); LCD_DisplayStringLine(LCD_LINE_10, MESSAGE5); LCD_DisplayStringLine(LCD_LINE_11, MESSAGE6); LCD_SetTextColor(LCD_COLOR_WHITE); LCD_DisplayStringLine(LCD_LINE_12, MESSAGE7); LCD_DisplayStringLine(LCD_LINE_13, MESSAGE8); LCD_SetTextColor(LCD_COLOR_GREEN); LCD_DisplayStringLine(LCD_LINE_14, MESSAGE9); LCD_DisplayStringLine(LCD_LINE_15, MESSAGE10); LCD_SetTextColor(LCD_COLOR_WHITE); LCD_DisplayStringLine(LCD_LINE_16, MESSAGE11); LCD_DisplayStringLine(LCD_LINE_17, MESSAGE12); LCD_SetTextColor(LCD_COLOR_GREEN); LCD_DisplayStringLine(LCD_LINE_18, MESSAGE13); LCD_DisplayStringLine(LCD_LINE_19, MESSAGE14); LCD_SetTextColor(LCD_COLOR_WHITE); LCD_SetFont(&Font16x24); /* Turn on leds available on STM32L152D-EVAL ************************************/ STM_EVAL_LEDOn(LED1); STM_EVAL_LEDOn(LED2); STM_EVAL_LEDOn(LED3); STM_EVAL_LEDOn(LED4); /* Infinite loop */ while (1) { /*--- If Joystick DOWN button is pushed, reset BFB2 bit to enable boot from Bank2 (active after next reset, w/ Boot pins set in Boot from Flash memory position ---*/ if (STM_EVAL_PBGetState(BUTTON_DOWN) == 0) { /* Reset BFB2 bit to enable boot from Flash Bank2 */ FLASH_Unlock(); FLASH_OB_Unlock(); FLASH_ClearFlag(FLASH_FLAG_EOP|FLASH_FLAG_WRPERR | FLASH_FLAG_PGAERR | FLASH_FLAG_SIZERR | FLASH_FLAG_OPTVERR | FLASH_FLAG_OPTVERRUSR); FLASH_OB_UserConfig(OB_IWDG_SW, OB_STOP_NoRST, OB_STDBY_NoRST); FLASH_OB_BORConfig(OB_BOR_LEVEL1); if (FLASH_OB_BootConfig(OB_BOOT_BANK2) == FLASH_COMPLETE) { /* Generate System Reset to load the new option byte values */ FLASH_OB_Launch(); } else { /* Display information */ LCD_DisplayStringLine(LCD_LINE_6, MESSAGE15); } } /*--- If Joystick UP button is pushed, set BFB2 bit to enable boot from Bank1 (active after next reset, w/ Boot pins set in Boot from Flash memory position ---*/ if (STM_EVAL_PBGetState(BUTTON_UP) == 0) { /* Set BFB2 bit to enable boot from Flash Bank2 */ FLASH_Unlock(); FLASH_OB_Unlock(); FLASH_ClearFlag(FLASH_FLAG_EOP|FLASH_FLAG_WRPERR | FLASH_FLAG_PGAERR | FLASH_FLAG_SIZERR | FLASH_FLAG_OPTVERR | FLASH_FLAG_OPTVERRUSR); FLASH_OB_UserConfig(OB_IWDG_SW, OB_STOP_NoRST, OB_STDBY_NoRST); FLASH_OB_BORConfig(OB_BOR_LEVEL1); if (FLASH_OB_BootConfig(OB_BOOT_BANK1) == FLASH_COMPLETE) { /* Generate System Reset to load the new option byte values */ FLASH_OB_Launch(); } else { /* Display information */ LCD_DisplayStringLine(LCD_LINE_6, MESSAGE15); } } /*--- If Joystick LEFT button is pushed, program the content of address 0x08000000 (base address of Bank1) to 0x00 ---*/ if (STM_EVAL_PBGetState(BUTTON_LEFT) == 0) { FLASH_Unlock(); FLASH_ClearFlag(FLASH_FLAG_EOP | FLASH_FLAG_WRPERR | FLASH_FLAG_PGAERR | FLASH_FLAG_SIZERR | FLASH_FLAG_OPTVERR | FLASH_FLAG_OPTVERRUSR); /* Erase stack pointer value at Bank 1 start address */ FLASH_ErasePage(0x08000000); FLASH_Lock(); LCD_ClearLine(LCD_LINE_5); LCD_ClearLine(LCD_LINE_7); LCD_ClearLine(LCD_LINE_8); LCD_ClearLine(LCD_LINE_9); /* Check if erase operation is OK */ if ((uint32_t)(*(uint32_t *)BANK1_START_ADDRESS) != 0x00) { /* Display information */ LCD_DisplayStringLine(LCD_LINE_6, MESSAGE15); } else { /* Display information */ LCD_DisplayStringLine(LCD_LINE_6, MESSAGE16); } } /*--- If Joystick RIGHT button is pushed, program the content of address 0x08030000 (base address of Bank2) to 0x00 ---*/ if (STM_EVAL_PBGetState(BUTTON_RIGHT) == 0) { FLASH_Unlock(); FLASH_ClearFlag(FLASH_FLAG_EOP|FLASH_FLAG_WRPERR | FLASH_FLAG_PGAERR | FLASH_FLAG_SIZERR | FLASH_FLAG_OPTVERR | FLASH_FLAG_OPTVERRUSR); /* Erase stack pointer value at Bank 2 start address */ FLASH_ErasePage(0x08030000); FLASH_Lock(); LCD_ClearLine(LCD_LINE_5); LCD_ClearLine(LCD_LINE_7); LCD_ClearLine(LCD_LINE_8); LCD_ClearLine(LCD_LINE_9); /* Check if erase operation is OK */ if ((uint32_t)(*(uint32_t *)BANK2_START_ADDRESS) != 0x00) { /* Display information */ LCD_DisplayStringLine(LCD_LINE_6, MESSAGE15); } else { /* Display information */ LCD_DisplayStringLine(LCD_LINE_6, MESSAGE16); } } /*--- If Joystick UP button is pushed, copy the program to the cross bank --*/ if (STM_EVAL_PBGetState(BUTTON_SEL) == 0) { FLASH_Unlock(); FLASH_ClearFlag(FLASH_FLAG_EOP|FLASH_FLAG_WRPERR | FLASH_FLAG_PGAERR | FLASH_FLAG_SIZERR | FLASH_FLAG_OPTVERR | FLASH_FLAG_OPTVERRUSR); #if defined (BOOT_FROM_BANK1) /* Erase one page in BANK2 to store the first page */ FLASH_ErasePage(0x08030000); for(index = 0; index < 64; index++) { FLASH_FastProgramWord((0x08030000 + (index * 4)), (*(uint32_t *)(0x08020000 + (index * 4)))); } #elif defined (BOOT_FROM_BANK2) /* Erase one page in BANK1 to store the first page */ FLASH_ErasePage(0x08000000); for(index = 0; index < 64; index++) { FLASH_FastProgramWord((0x08000000 + (index * 4)), (*(uint32_t *)(0x08050000 + (index * 4)))); } #endif } /* Toggle LD3 */ STM_EVAL_LEDToggle(LED3); /* Insert 50 ms delay */ Delay(5); /* Toggle LD2 */ STM_EVAL_LEDToggle(LED2); /* Insert 100 ms delay */ Delay(10); } }