/**
******************************************************************************
* @file FLASH/Dual_Boot/main.c
* @author MCD Application Team
* @version V3.5.0
* @date 08-April-2011
* @brief Main program body
******************************************************************************
* @attention
*
* THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS
* WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE
* TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY
* DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING
* FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE
* CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
*
*
© COPYRIGHT 2011 STMicroelectronics
******************************************************************************
*/
/* Includes ------------------------------------------------------------------*/
#include "main.h"
/** @addtogroup STM32F10x_StdPeriph_Examples
* @{
*/
/** @addtogroup Dual_Boot
* @{
*/
/* Private typedef -----------------------------------------------------------*/
typedef enum {FAILED = 0, PASSED = !FAILED} TestStatus;
/* Private define ------------------------------------------------------------*/
/* Uncomment one of the lines below to select which bank to boot from */
#if !defined(BOOT_FROM_BANK1) && !defined(BOOT_FROM_BANK2)
//#define BOOT_FROM_BANK1 /* The program will be loaded on Flash Bank1 */
//#define BOOT_FROM_BANK2 /* The program will be loaded on Flash Bank2 */
#endif
#if defined(BOOT_FROM_BANK1)
#define MESSAGE4 " Running from Bank 1"
#elif defined(BOOT_FROM_BANK2)
#define MESSAGE4 " Running from Bank 2"
#else
#error "Select Boot from Bank1 or Bank2 using defines:BOOT_FROM_BANK1 or BOOT_FROM_BANK2!"
#endif
#define MESSAGE1 " STM32 XL Density "
#define MESSAGE2 " Device running on "
#define MESSAGE3 " STM3210E-EVAL "
#define MESSAGE5 " Joystick-DOWN: reset BFB2"
#define MESSAGE6 " bit to Boot from Bank2 "
#define MESSAGE7 " Joystick-UP: set BFB2 "
#define MESSAGE8 " bit to Boot from Bank1 "
#define MESSAGE9 " Joystick-SEL: program to "
#define MESSAGE10 " 0x0 the base @ of Bank1/2"
#define MESSAGE11 " Operation Failed !"
#define MESSAGE12 "Bank 1/2 base @ -> 0"
#define BANK1_START_ADDRESS 0x08000000
#define BANK2_START_ADDRESS 0x08080000
/* Private macro -------------------------------------------------------------*/
/* Private variables ---------------------------------------------------------*/
USART_InitTypeDef USART_InitStructure;
static __IO uint32_t TimingDelay;
RCC_ClocksTypeDef RCC_Clocks;
/* Private function prototypes -----------------------------------------------*/
void Delay(__IO uint32_t nTime);
/* Private functions ---------------------------------------------------------*/
/**
* @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_stm32f10x_xx.s) before to branch to application main.
To reconfigure the default setting of SystemInit() function, refer to
system_stm32f10x.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 STM3210E-EVAL board *****************/
STM_EVAL_LEDInit(LED1);
STM_EVAL_LEDInit(LED2);
STM_EVAL_LEDInit(LED3);
STM_EVAL_LEDInit(LED4);
/* 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);
/* Initialize the LCD */
STM3210E_LCD_Init();
/* Display message on STM3210E-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_DisplayStringLine(LCD_LINE_12, MESSAGE5);
LCD_DisplayStringLine(LCD_LINE_13, MESSAGE6);
LCD_DisplayStringLine(LCD_LINE_15, MESSAGE7);
LCD_DisplayStringLine(LCD_LINE_16, MESSAGE8);
LCD_DisplayStringLine(LCD_LINE_18, MESSAGE9);
LCD_DisplayStringLine(LCD_LINE_19, MESSAGE10);
LCD_SetFont(&Font16x24);
/* Turn on leds available on STM3210E-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_EraseOptionBytes();
if (FLASH_BootConfig(FLASH_BOOT_Bank2) == FLASH_COMPLETE)
{
/* Generate System Reset to load the new option byte values */
NVIC_SystemReset();
}
else
{
/* Display information */
LCD_DisplayStringLine(LCD_LINE_6, MESSAGE11);
}
}
/*--- 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_EraseOptionBytes();
if (FLASH_BootConfig(FLASH_BOOT_Bank1) == FLASH_COMPLETE)
{
/* Generate System Reset to load the new option byte values */
NVIC_SystemReset();
}
else
{
/* Display information */
LCD_DisplayStringLine(LCD_LINE_6, MESSAGE11);
}
}
/*--- If Joystick UP button is pushed, program the content of address 0x08080000
(base address of Bank2) and 0x08000000(base address of Bank1) to 0x00 --*/
if (STM_EVAL_PBGetState(BUTTON_SEL) == 0)
{
FLASH_Unlock();
/* Erase stack pointer value at Bank 2 start address */
FLASH_ProgramWord(BANK2_START_ADDRESS, 0x00);
/* Erase stack pointer value at Bank 1 start address */
FLASH_ProgramWord(BANK1_START_ADDRESS, 0x00);
FLASH_Lock();
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)
{
if ((uint32_t)(*(uint32_t *)BANK1_START_ADDRESS) != 0x00)
{
/* Display information */
LCD_DisplayStringLine(LCD_LINE_6, MESSAGE11);
}
else
{
/* Display information */
LCD_DisplayStringLine(LCD_LINE_6, MESSAGE12);
}
}
else
{
/* Display information */
LCD_DisplayStringLine(LCD_LINE_6, MESSAGE11);
}
}
/* Toggle LD3 */
STM_EVAL_LEDToggle(LED3);
/* Insert 50 ms delay */
Delay(5);
/* Toggle LD2 */
STM_EVAL_LEDToggle(LED2);
/* Insert 100 ms delay */
Delay(10);
}
}
/**
* @brief Inserts a delay time.
* @param nTime: specifies the delay time length, in 10 ms.
* @retval None
*/
void Delay(__IO uint32_t nTime)
{
TimingDelay = nTime;
while (TimingDelay != 0);
}
/**
* @brief Decrements the TimingDelay variable.
* @param None
* @retval None
*/
void TimingDelay_Decrement(void)
{
if (TimingDelay != 0x00)
{
TimingDelay--;
}
}
#ifdef USE_FULL_ASSERT
/**
* @brief Reports the name of the source file and the source line number
* where the assert_param error has occurred.
* @param file: pointer to the source file name
* @param line: assert_param error line source number
* @retval None
*/
void assert_failed(uint8_t* file, uint32_t line)
{
/* User can add his own implementation to report the file name and line number,
ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */
while (1)
{}
}
#endif
/**
* @}
*/
/**
* @}
*/
/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/