S(ikovný levný modulek se STM32F103

Miroslav Mraz mraz na seznam.cz
Středa Listopad 12 20:00:28 CET 2014


Aha, já jsem to dělal přepínáním BOOT0. Takže pro ten váš způsob je to 
podobnější. Ve flash stačí tohle:

#include <stdint.h>
#define __IO volatile
#define __I const

typedef struct {                            /*!< (@ 0x40048000) SYSCON 
Structure       */
   __IO uint32_t SYSMEMREMAP;                /*!< (@ 0x40048000) System 
memory remap    */
   // ostatni neni potreba
} LPC_SYSCON_Type;

LPC_SYSCON_Type * const LPC_Syscon = (LPC_SYSCON_Type *)(0x40048000);

#define NORET __attribute__ ((naked))
#define ALIAS(f) __attribute__ ((weak, alias (#f)))

   void ResetISR          (void) NORET;
   void NMI_Handler       (void) ALIAS (IntDefaultHandler);
   void HardFault_Handler (void) ALIAS (IntDefaultHandler);

   typedef void (*pHandler)    (void);
   extern  void _estack        (void);
   extern  void VectorCheckSum (void);

extern pHandler const Vectors[];
pHandler const Vectors[] = {
   _estack,        // The initial stack pointer
   ResetISR,                         // The reset handler
   NMI_Handler,                      // The NMI handler
   HardFault_Handler,                // The hard fault handler
   0,                                // Reserved
   0,                                // Reserved
   0,                                // Reserved
   VectorCheckSum                    // <- číslo zde musí být vypočteno
   // tak, aby součet předchozích, včetně tohoto byl celkem nulový
};


void ResetISR (void) {
   // Remap vectors to RAM
   LPC_Syscon->SYSMEMREMAP = 1;
   asm volatile ("nop");
   asm volatile ("nop");
   // Read remaped.
   volatile const pHandler * boot = Vectors;
   // Call remaped.
   boot[1] ();
}

void IntDefaultHandler (void) {
   while (1) {
   }
}

a v RAM je pak normální program, včetně potřebných vektorů. Jen ten kód 
(ani ve flash ani v ram) nesmí být v těch začátečních 512B. Prostě to 
nastartuje z flash (viz ResetISR), přepne vektory do RAM, stále běží z 
flash, takže chvíli počká, pak načte z RAM vektor, odpovídající Reset 
(boot = Vectors) a skočí na tuto adresu (boot[1] ()). Teď už běží z RAM.

Mrazík

Dne 12.11.2014 v 19:29 Petr Labaj napsal(a):
> Já to u STM32F0 dělám tak, že ve startupu namapuju na adresu
> 0x0000 tu paměť, ve které běží kód (Flash nebo RAM).
> Takže program běží tam kde byl, jenom od adresy 0x0000
> je kopie tohoto bloku, včetně tabulky vektorů.
> Takže tohle teda u NXP nejde? To je docela škoda.
> A jak se teda přepínají vektory do RAM? Když to umí program,
> tak přece může být součásti startupu, tedy běží jako součást
> laděné aplikace, ale přepnutí udělá ještě před povolením IRQ.
>
> PL
>
>


Další informace o konferenci Hw-list