Re: S(ikovný levný modulek se STM32F103

Petr Labaj labaj na volny.cz
Středa Listopad 12 20:09:35 CET 2014


Já to na STM32F0 dělám takhle:

void pl_reset (void)
{

....

 RCC->APB2ENR |= RCC_APB2Periph_SYSCFG;       // povol clock pro SYSCFG - nezbytne pro cteni SYSCFG registru
 if ((u32)pl_reset > 0x1000000) {
  SYSCFG->CFGR1 |= SYSCFG_MemoryRemap_SRAM;     // na adresu 0x00000000 namapuj RAM
 } else {
  SYSCFG->CFGR1 |= SYSCFG_MemoryRemap_Flash;     // na adresu 0x00000000 namapuj Flash
 }
}


PL

************************************

From: "Miroslav Mraz" <mraz na seznam.cz>
To: "HW-news" <hw-list na list.hw.cz>
Sent: Wednesday, November 12, 2014 8:00 PM
Subject: Re: S(ikovný levný modulek se STM32F103


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
>
>
_______________________________________________
HW-list mailing list  -  sponsored by www.HW.cz
Hw-list na list.hw.cz
http://list.hw.cz/mailman/listinfo/hw-list


Další informace o konferenci Hw-list