Fix reset for STM32 devices
This commit is contained in:
		
							parent
							
								
									fca31693df
								
							
						
					
					
						commit
						8c2ae4a470
					
				
					 4 changed files with 23 additions and 21 deletions
				
			
		| 
						 | 
				
			
			@ -6,32 +6,32 @@
 | 
			
		|||
#ifdef STM32_BOOTLOADER_ADDRESS
 | 
			
		||||
/* STM32 */
 | 
			
		||||
 | 
			
		||||
#if defined(STM32F0XX)
 | 
			
		||||
/* This code should be checked whether it runs correctly on platforms */
 | 
			
		||||
#define SYMVAL(sym) (uint32_t)(((uint8_t *)&(sym)) - ((uint8_t *)0))
 | 
			
		||||
extern uint32_t __ram0_end__;
 | 
			
		||||
#define BOOTLOADER_MAGIC 0xDEADBEEF
 | 
			
		||||
#define MAGIC_ADDR (unsigned long*)(SYMVAL(__ram0_end__) - 4)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
void bootloader_jump(void) {
 | 
			
		||||
  *((unsigned long *)(SYMVAL(__ram0_end__) - 4)) = 0xDEADBEEF; // set magic flag => reset handler will jump into boot loader
 | 
			
		||||
  *MAGIC_ADDR = BOOTLOADER_MAGIC; // set magic flag => reset handler will jump into boot loader
 | 
			
		||||
   NVIC_SystemReset();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#elif defined(STM32F3XX)
 | 
			
		||||
/* This code should be checked whether it runs correctly on platforms. 
 | 
			
		||||
 * It was added for clueboard60 BUT HAS NOT BEEN TESTED.
 | 
			
		||||
 * FIXME - Test this
 | 
			
		||||
 */
 | 
			
		||||
#define SYMVAL(sym) (uint32_t)(((uint8_t *)&(sym)) - ((uint8_t *)0))
 | 
			
		||||
extern uint32_t __ram0_end__;
 | 
			
		||||
void enter_bootloader_mode_if_requested(void)  {
 | 
			
		||||
  unsigned long* check = MAGIC_ADDR;
 | 
			
		||||
  if(*check == BOOTLOADER_MAGIC)  {
 | 
			
		||||
    *check = 0;
 | 
			
		||||
    __set_CONTROL(0);
 | 
			
		||||
    __set_MSP(*(__IO uint32_t*)STM32_BOOTLOADER_ADDRESS);
 | 
			
		||||
    __enable_irq();
 | 
			
		||||
 | 
			
		||||
void bootloader_jump(void) {
 | 
			
		||||
  *((unsigned long *)(SYMVAL(__ram0_end__) - 4)) = 0xDEADBEEF; // set magic flag => reset handler will jump into boot loader
 | 
			
		||||
   NVIC_SystemReset();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#else /* defined(STM32F0XX) */
 | 
			
		||||
#error Check that the bootloader code works on your platform and add it to bootloader.c!
 | 
			
		||||
#endif /* defined(STM32F0XX) */
 | 
			
		||||
    typedef void (*BootJump_t)(void);
 | 
			
		||||
    BootJump_t boot_jump = *(BootJump_t*)(STM32_BOOTLOADER_ADDRESS + 4);
 | 
			
		||||
    boot_jump();
 | 
			
		||||
    while(1);
 | 
			
		||||
  }
 | 
			
		||||
 }
 | 
			
		||||
 | 
			
		||||
#elif defined(KL2x) || defined(K20x) /* STM32_BOOTLOADER_ADDRESS */
 | 
			
		||||
/* Kinetis */
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue