passe en DFU si un core reset est envoyé (pour l'instant, par STLINK)

Committer:
potless
Date:
Wed May 23 23:01:17 2018 +0000
Revision:
0:5ed2a30b9e68
lire le nota en d?but de code.;

Who changed what in which revision?

UserRevisionLine numberNew contents of line
potless 0:5ed2a30b9e68 1 #include "mbed.h"
potless 0:5ed2a30b9e68 2
potless 0:5ed2a30b9e68 3 // mode d'emploi :
potless 0:5ed2a30b9e68 4 // le STM passe en DFU après l'execution de ce code + un core reset envoyé depuis STLINK-utility
potless 0:5ed2a30b9e68 5 // Comme ce core reset passe par le port SW, pour l'instant ça ne sert à rien
potless 0:5ed2a30b9e68 6 // objectif 1 : trouver le moyen d'envoyer ce core reset par voie logicielle
potless 0:5ed2a30b9e68 7 // objectif 2 : regarder si on peut charger un code en dfu par l'USB
potless 0:5ed2a30b9e68 8 // objectif 3 : faire cohabiter l'USBserial et le DFU sur les mêmes pins
potless 0:5ed2a30b9e68 9
potless 0:5ed2a30b9e68 10
potless 0:5ed2a30b9e68 11 int main() {
potless 0:5ed2a30b9e68 12
potless 0:5ed2a30b9e68 13 //RESET INTO DFU MODE - NOTE THIS WILL STOP RUNNING YOUR FIRMWARE
potless 0:5ed2a30b9e68 14 //Don't do this unless you are comfortable flashing over USB / DFU
potless 0:5ed2a30b9e68 15 //and maybe have a programmer shield / st-link programmer
potless 0:5ed2a30b9e68 16
potless 0:5ed2a30b9e68 17
potless 0:5ed2a30b9e68 18
potless 0:5ed2a30b9e68 19 void (*SysMemBootJump)(void);
potless 0:5ed2a30b9e68 20
potless 0:5ed2a30b9e68 21 /**
potless 0:5ed2a30b9e68 22 * Step: Set system memory address.
potless 0:5ed2a30b9e68 23 *
potless 0:5ed2a30b9e68 24 * For STM32F446, system memory is on 0x1FFF 0000
potless 0:5ed2a30b9e68 25 * For other families, check AN2606 document table 110 with descriptions of memory addresses
potless 0:5ed2a30b9e68 26 */
potless 0:5ed2a30b9e68 27 volatile uint32_t addr = 0x1FFF0000;
potless 0:5ed2a30b9e68 28
potless 0:5ed2a30b9e68 29 /**
potless 0:5ed2a30b9e68 30 * Step: Disable RCC, set it to default (after reset) settings
potless 0:5ed2a30b9e68 31 * Internal clock, no PLL, etc.
potless 0:5ed2a30b9e68 32 */
potless 0:5ed2a30b9e68 33 HAL_RCC_DeInit();
potless 0:5ed2a30b9e68 34 __HAL_RCC_SYSCFG_CLK_ENABLE();
potless 0:5ed2a30b9e68 35 /**
potless 0:5ed2a30b9e68 36 * Step: Disable systick timer and reset it to default values
potless 0:5ed2a30b9e68 37 */
potless 0:5ed2a30b9e68 38 SysTick->CTRL = 0;
potless 0:5ed2a30b9e68 39 SysTick->LOAD = 0;
potless 0:5ed2a30b9e68 40 SysTick->VAL = 0;
potless 0:5ed2a30b9e68 41
potless 0:5ed2a30b9e68 42
potless 0:5ed2a30b9e68 43 /**
potless 0:5ed2a30b9e68 44 * Step: Disable all interrupts
potless 0:5ed2a30b9e68 45 */
potless 0:5ed2a30b9e68 46 __disable_irq();
potless 0:5ed2a30b9e68 47
potless 0:5ed2a30b9e68 48 __DSB();
potless 0:5ed2a30b9e68 49
potless 0:5ed2a30b9e68 50 /**
potless 0:5ed2a30b9e68 51 * Step: Remap system memory to address 0x0000 0000 in address space
potless 0:5ed2a30b9e68 52 * For each family registers may be different.
potless 0:5ed2a30b9e68 53 * Check reference manual for each family.
potless 0:5ed2a30b9e68 54 *
potless 0:5ed2a30b9e68 55 * For STM32F4xx, MEMRMP register in SYSCFG is used (bits[1:0])
potless 0:5ed2a30b9e68 56 * For STM32F0xx, CFGR1 register in SYSCFG is used (bits[1:0])
potless 0:5ed2a30b9e68 57 * For others, check family reference manual
potless 0:5ed2a30b9e68 58 */
potless 0:5ed2a30b9e68 59 //SYSCFG->MEMRMP = 1;
potless 0:5ed2a30b9e68 60
potless 0:5ed2a30b9e68 61 __HAL_SYSCFG_REMAPMEMORY_SYSTEMFLASH(); //Call HAL macro to do this for you
potless 0:5ed2a30b9e68 62
potless 0:5ed2a30b9e68 63
potless 0:5ed2a30b9e68 64 /**
potless 0:5ed2a30b9e68 65 * Step: Set jump memory location for system memory
potless 0:5ed2a30b9e68 66 * Use address with 4 bytes offset which specifies jump location where program starts
potless 0:5ed2a30b9e68 67 */
potless 0:5ed2a30b9e68 68
potless 0:5ed2a30b9e68 69
potless 0:5ed2a30b9e68 70 /* Remap is not visible at once. Execute some unrelated command! */
potless 0:5ed2a30b9e68 71 __DSB();
potless 0:5ed2a30b9e68 72 __ISB();
potless 0:5ed2a30b9e68 73
potless 0:5ed2a30b9e68 74
potless 0:5ed2a30b9e68 75
potless 0:5ed2a30b9e68 76
potless 0:5ed2a30b9e68 77 SysMemBootJump = (void (*)(void)) (*((uint32_t *)(addr + 4)));
potless 0:5ed2a30b9e68 78
potless 0:5ed2a30b9e68 79
potless 0:5ed2a30b9e68 80 /**
potless 0:5ed2a30b9e68 81 * Step: Set main stack pointer.
potless 0:5ed2a30b9e68 82 * This step must be done last otherwise local variables in this function
potless 0:5ed2a30b9e68 83 * don't have proper value since stack pointer is located on different position
potless 0:5ed2a30b9e68 84 *
potless 0:5ed2a30b9e68 85 * Set direct address location which specifies stack pointer in SRAM location
potless 0:5ed2a30b9e68 86 */
potless 0:5ed2a30b9e68 87 __set_MSP(*(uint32_t *)addr);
potless 0:5ed2a30b9e68 88
potless 0:5ed2a30b9e68 89 /**
potless 0:5ed2a30b9e68 90 * Step: Actually call our function to jump to set location
potless 0:5ed2a30b9e68 91 * This will start system memory execution
potless 0:5ed2a30b9e68 92 */
potless 0:5ed2a30b9e68 93
potless 0:5ed2a30b9e68 94 SysMemBootJump();
potless 0:5ed2a30b9e68 95
potless 0:5ed2a30b9e68 96 /**
potless 0:5ed2a30b9e68 97 * Step: Connect USB<->UART converter to dedicated USART pins and test
potless 0:5ed2a30b9e68 98 * and test with bootloader works with STM32 Flash Loader Demonstrator software
potless 0:5ed2a30b9e68 99 */
potless 0:5ed2a30b9e68 100
potless 0:5ed2a30b9e68 101
potless 0:5ed2a30b9e68 102
potless 0:5ed2a30b9e68 103 }
potless 0:5ed2a30b9e68 104