POTLESS
/
DFUsimple
passe en DFU si un core reset est envoyé (pour l'instant, par STLINK)
main.cpp@0:5ed2a30b9e68, 2018-05-23 (annotated)
- 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?
User | Revision | Line number | New 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 |