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