2015-11-12 10:13 AM
Hi All,
I am working on boot loader for STM32 and using DMA interrupts on USART1 for receiving and Transmitting Data. The same USART is used in Application as well with the same settings. I was using below code to jump to application:LOG_INFO(''BootLoader Jumping to Application'');
timer_->Timer_Sleep(100);
// deinit interrupts, set address to reset handler, set stack pointer, and jump
uint32_t jumpAddress = 0x00000000;
__disable_irq();
typedef void (*pFunction)(void);
pFunction jumpToApp;
uint32_t startAddress = bootloaderUtilities_.getApplicationStartAddress();
NVIC_SetVectorTable(NVIC_VectTab_FLASH, startAddress - 0x08000000);
jumpAddress = *(__IO uint32_t*)(startAddress + 4);
jumpToApp = (pFunction)jumpAddress;
__set_MSP(*(__IO uint32_t*)startAddress);
jumpToApp();
But THIS does not work. when I jump to Application, it does jump to application but stuck in the application itself.
if i change the code and disable that particular USART Rx Interrupt , Code works flawless
below is the working code:
LOG_INFO(''BootLoader Jumping to Application'');
timer_->Timer_Sleep(100);
NVIC_InitTypeDef NVIC_InitStructure;
/* Disable the USART DMA Rx Interrupt */
NVIC_InitStructure.NVIC_IRQChannel = DMA2_Stream2_IRQn;
NVIC_InitStructure.NVIC_IRQChannelCmd = DISABLE;
NVIC_Init(&NVIC_InitStructure);
uint32_t jumpAddress = 0x00000000;
typedef void (*pFunction)(void);
pFunction jumpToApp;
uint32_t appStartAddress = getApplicationStartAddress();
NVIC_SetVectorTable(NVIC_VectTab_FLASH, appStartAddress - USER_FLASH_START_ADDRESS);
jumpAddress = *(__IO uint32_t*)(appStartAddress + 4);
jumpToApp = (pFunction)jumpAddress;
__set_MSP(*(__IO uint32_t*)appStartAddress);
jumpToApp();
But this is not the correct way to disable . Any one has any idea how can I disable all interrupts in Bootloader and then jump to Application and configure again.
#stm32 #stm32 #dma #bootloader #usart
2015-11-12 10:56 AM
Ok, and what's the issue with switching off the interrupts at a peripheral level? You need code on the app side to be able to immediately service something it's not set itself up to handle otherwise. The RAM variables and stack are likely to be totally different, and unrelated, in the application vs the loader.
This is awfully tortured NVIC_SetVectorTable(NVIC_VectTab_FLASH, appStartAddress - USER_FLASH_START_ADDRESS); Surely just SCB->VTOR = appStartAddress; or NVIC_SetVectorTable(appStartAddress, 0);2015-11-12 12:47 PM
Thanks Clive for your Response. yes I have disabled all the interrupts one by one and let the application handle those separately. I don’t want to bound application to specific boot loader or the peripheral , so my application is generic.
However in my boot loader, before jumping to my application, i have disabled all the peripheral i have used for my boot loader, so that Application is independent to chose which one it need to initialise or not. Thanks a ton