avec dfu

Fork of Utils by POTLESS

Revision:
19:2b5bac7f435e
Parent:
18:522e18b47823
--- a/Utils.cpp	Thu May 17 07:45:30 2018 +0000
+++ b/Utils.cpp	Thu May 24 23:16:22 2018 +0000
@@ -386,6 +386,8 @@
     serial_port->printf("  K 1              =    capteur CO2 mode streaming.\r\n");
     serial_port->printf("  K 2              =    capteur CO2 mode spooling.\r\n");
     serial_port->printf("  A X              =    digi filter X. X égal à 32, 64, 128...\r\n");
+    serial_port->printf("");
+    serial_port->printf("  DFU              =    mise à jour firmware\r\n");
     //serial_port->printf("\r\n");
     fflush(stdout);
 }
@@ -535,4 +537,117 @@
         clean_line_EEPROM(pointer, address);
     }
     DEBUG("Eeprom néttoyée.\r\n");
+}
+
+void UTILS::DFU()
+{
+DEEP_DEBUG("  mode DFU utils \r\n\r\n");
+
+DEEP_DEBUG("  mode DFU deadbeef \r\n\r\n");
+wait(1);
+
+
+
+void (*SysMemBootJump)(void);
+
+/**
+* Step: Set system memory address.
+*
+* For STM32F446, system memory is on 0x1FFF 0000
+* For other families, check AN2606 document table 110 with descriptions of memory addresses
+*/
+volatile uint32_t addr = 0x1FFF0000;
+
+
+/**
+* Step: Disable RCC, set it to default (after reset) settings
+* Internal clock, no PLL, etc.
+*/
+HAL_RCC_DeInit();
+DEEP_DEBUG("  mode DFU rcc deinit \r\n\r\n");
+wait(1);
+
+__HAL_RCC_SYSCFG_CLK_ENABLE();
+DEEP_DEBUG("  mode DFU clk enable \r\n\r\n");
+wait(1);
+
+/**
+* Step: Disable systick timer and reset it to default values
+*/
+SysTick->CTRL = 0;
+SysTick->LOAD = 0;
+SysTick->VAL = 0;
+
+
+/**
+* Step: Disable all interrupts
+*/
+__disable_irq();
+DEEP_DEBUG("  mode DFU irq disable \r\n\r\n");
+wait(1);
+
+__DSB();
+
+/**
+* Step: Remap system memory to address 0x0000 0000 in address space
+* For each family registers may be different.
+* Check reference manual for each family.
+*
+* For STM32F4xx, MEMRMP register in SYSCFG is used (bits[1:0])
+* For STM32F0xx, CFGR1 register in SYSCFG is used (bits[1:0])
+* For others, check family reference manual
+*/
+//SYSCFG->MEMRMP = 1;
+
+__HAL_SYSCFG_REMAPMEMORY_SYSTEMFLASH(); //Call HAL macro to do this for you
+
+DEEP_DEBUG("  mode DFU remap \r\n\r\n");
+wait(1);
+
+/**
+* Step: Set jump memory location for system memory
+* Use address with 4 bytes offset which specifies jump location where program starts
+*/
+
+
+/* Remap is not visible at once. Execute some unrelated command! */
+__DSB();
+__ISB();
+
+ 
+
+
+SysMemBootJump = (void (*)(void)) (*((uint32_t *)(addr + 4)));
+
+DEEP_DEBUG("  mode DFU jump \r\n\r\n");
+wait(1);
+
+
+/**
+* Step: Set main stack pointer.
+* This step must be done last otherwise local variables in this function
+* don't have proper value since stack pointer is located on different position
+*
+* Set direct address location which specifies stack pointer in SRAM location
+*/
+__set_MSP(*(uint32_t *)addr);
+
+DEEP_DEBUG("  mode DFU set msp \r\n\r\n");
+wait(1);
+
+/**
+* Step: Actually call our function to jump to set location
+* This will start system memory execution
+*/
+
+SysMemBootJump();
+
+/**
+* Step: Connect USB<->UART converter to dedicated USART pins and test
+* and test with bootloader works with STM32 Flash Loader Demonstrator software
+*/
+
+while (1);
+
+
 }
\ No newline at end of file