SciFi (07.11.2013 22:38, просмотров: 133) ответил Леонид Иванович на Это не ответ.
Правильный стартап ниже. Всё остальное - от лукавого. Это для Sourcery.
#include "stm32f2regs.h"
#include "cs3.h"
#include <string.h>
extern void __libc_init_array(void);
extern int main();
union intvec_elem
{
void (*fptr)(void);
void *dptr;
};
static void
trap(void)
{
for (;;)
{
/* it's a trap! */
}
}
static union intvec_elem vectab[] __attribute((used, section(".cs3.vectab"))) =
{
{ .dptr = __cs3_stack },
{ __cs3_start_c },
{ trap }, /* NMI */
{ trap }, /* HardFault */
{ trap }, /* MemManage */
{ trap }, /* BusFault */
{ trap }, /* UsageFault */
{ 0 },
{ 0 },
{ 0 },
{ 0 },
{ trap }, /* SVC */
{ trap }, /* DebugMon */
{ 0 },
{ trap }, /* PendSV */
{ trap }, /* SysTick */
};
static void
mcu_init(void)
{
uint32_t tmp = 0x0703;
FLASH_ACR = tmp; /* 3 wait states, acceleration enabled */
while (FLASH_ACR != tmp) { /* wait */ }
RCC_PLLCFGR = 0x080030CD; /* M=13, N=195, P=2, Q=8 */
REGBIT(RCC_CR, 24) = 1; /* PLL on */
RCC_CFGR = 0x00009402; /* use PLL as clock source */
}
void __attribute ((noreturn))
__cs3_start_c(void)
{
const struct __cs3_region* r = &__cs3_regions[0];
mcu_init();
/* Initialize memory */
memcpy(r->data, r->init, r->init_size);
memset(r->data + r->init_size, 0, r->zero_size);
/* Run initializers. */
__libc_init_array();
(void)main();
for (;;) {}
}
ส็็็็็็็็็็็็็็็็็็็็็็็็็༼ ຈل͜ຈ༽ส้้้้้้้้้้้้้้้้้้้้้้้