Problems with custom bootloader on STM32F4
Hello,
I have some problems to implement a bootloader in a STM32F4. I searched on internet and I found coherent informations and examples, but I 'm not able to make simple test work.Here my simple code:
bootloader (writed on 0x08000000 address):
&sharpdefine APPLICATION_ADDRESS 0x08008000
typedef void (*pFunction)(void);
pFunction appEntry;uint32_t appStack, test, i;int main(void){
/* Get the application stack pointer (First entry in the application vector table) */
appStack = (uint32_t) *((__IO uint32_t*)APPLICATION_ADDRESS);/* Get the application entry point (Second entry in the application vector table) */
appEntry = (pFunction) *(__IO uint32_t*) (APPLICATION_ADDRESS + 4);/* Reconfigure vector table offset register to match the application location */
SCB->VTOR = APPLICATION_ADDRESS;/* Set the application stack pointer */
__set_MSP(appStack);/* Start the application */
appEntry();while(1);
return 0;
}program (writed on 0x08008000 address):
int main(void){
register uint32_t tl;GPIO_InitTypeDef GPIO_InitStructure;
ErrorStatus HSEStartUpStatus; RCC_DeInit(); // Enable HSE RCC_HSEConfig(RCC_HSE_ON); // Wait till HSE is ready HSEStartUpStatus = RCC_WaitForHSEStartUp(); if(HSEStartUpStatus == SUCCESS){ // HCLK = SYSCLK impostato a 168 tick RCC_HCLKConfig(RCC_SYSCLK_Div1); // PCLK2 = HCLK/2 perch� massimo � 84Mhz RCC_PCLK2Config(RCC_HCLK_Div2); // PCLK1 = HCLK/4 perch� massimo � 42Mhz RCC_PCLK1Config(RCC_HCLK_Div4); // PLLCLK = 168 MHz RCC_PLLConfig(RCC_PLLSource_HSE, 12, 336, 2, 7); // PLLCLK = 144 MHz //RCC_PLLConfig(RCC_PLLSource_HSE, 12, 288, 2, 6); // Enable PLL RCC_PLLCmd(ENABLE); // Wait till PLL is ready while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET) { } // Select PLL as system clock source RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK); // Wait till PLL is used as system clock source while(RCC_GetSYSCLKSource() != 0x08){} SystemCoreClockUpdate(); } RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOG, ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; GPIO_Init(GPIOG, &GPIO_InitStructure);GPIO_SetBits(GPIOG, GPIO_Pin_4);
while(1){
for(tl=0; tl < 0xFFFFFF; tl++); // about 0.6 seconds GPIO_ToggleBits(GPIOG, GPIO_Pin_4); }return 0;
}I write program to 0x08000000 address for test and it works, so I'm sure there is no bugs.When I use bootloader system doesn't work. I try to understand with debugger and I see that instruction appEntry(); has no effect and next command is while(1);
Can anyone tell me where it is wrong?
ThanksRoberto#bootloader #stm-32f407