LINUX.ORG.RU

STM32 «Blue pill» и точка входа.

 


0

1

Пилю проект под blue pill (STM32F103C8) без всяких сред, по хардкору - mousepad + gcc. Без сред чтобы научиться и понять где что куда.

Возникает вопрос:

Если я пишу main.c с int main, линуюсь с stm32f103c8tx.ld, в которой указаны параметры чипа и точка входа

/* Entry Point */
ENTRY(main)
то программа не запускается.
Если я пишу main.c с int main, линкуюсь с stm32f103c8tx.ld, в которой указаны параметры чипа, а в дополнение линкуюсь с flash.s:
.arch armv7-m
.cpu cortex-m3
.thumb

.thumb_func
.global _start
_start:
stacktop: .word 0x20005000
.word reset
.word hang

.thumb_func
reset:
    bl main
    b hang

.thumb_func
hang:   
    b .

.align 4

.end
то точка входа срабатывает и программа запускается как надо.

Почему линковка с ENTRY(main) не работает?

★★

А вот это вот

_start:
stacktop: .word 0x20005000
.word reset
.word hang

На мысли не наводит? Что это похоже на задание вершины стека и таблицу векторов прерываний, которая необходима процессору для запуска.

anonymous ()

К сообщениям предыдущих ораторов добавлю, что STM32F103 запускается на внутреннем генераторе на частоте 8МГц. И чтобы он заработал на полных 72МГц, нужно инициализировать внешний кварц и PLL, включить нужные wait-states для флеша и вообще, чтобы хоть что-то сделать (хотя бы помигать светодиодиком), нужно инициализировать соответствующий модуль периферии. И все эти вещи обычно делаются до входа в main.

Beewek ()
Ответ на: комментарий от anonymous

А это что такое?

безусловное ветвление по адресу, что же ещё.

Другое дело, как метка reset получает управление.

Не иначе, как процессор .ld читает.

anonymous ()
Ответ на: комментарий от Beewek

Но в любом случае надо настроить тактирование, PLL и waitstate-ы.

Нет. настройки по умолчанию устанавливаются нормальные, при которых МК может нормально работать. Камень запускается от внутреннего генератора, ваитстейтов не нужно до 30 МГц.

Таким образом для простого мигания диодом остается только инициализировать нужный пин, и собственно мигать.

anonymous ()
Ответ на: комментарий от anonymous

Нет. настройки по умолчанию устанавливаются нормальные, при которых МК может нормально работать.

Вы цепочку не отследили. Я сначала написал, что для того, чтобы заставить работать F103 на максимальных 72 МГц, надо включить внешний кварц и настроить PLL. Мне AUX возразил, что можно и от внутреннего генератора получить 72МГц. Я с ним согласился.

ваитстейтов не нужно до 30 МГц.

до 24.

Beewek ()

Попробуй отсюда что-нибудь.

Я намешал заголовочных файлов и стартапов из opencm3 и других мест. В итоге получилось вроде вполне нормально. Возможно, когда-нибудь и CDC с HID'ом перенесу с STM32F0x2 на STM32F103.

anonymous ()

Не хочу попусту темы плодить, поэтому здесь спрошу: как правильно разместить константную структуру так, чтобы она была в самом конце прошивки? Делаю эмуляцию EEPROM во флеше, но хочу использовать весь объем флеш-памяти (бывает такое, что блоки, которые нужно сохранять, достаточно объемные — байт по 200-300, и хотелось бы эффективно использовать свободные 120кБ флеша в STM32F103).

Eddy_Em ☆☆☆☆☆ ()
Ответ на: комментарий от AUX

При чем здесь таблица? Мне нужно автоматом запихивать мои данные (то бишь эмуляцию еепрома во флеше) начиная с первого же свободного блока!

Сижу тут с линкером маюсь, но никак не выходит, чтобы блок сохраняемых данных с выравниванием по размеру страницы располагался в самом конце...

Eddy_Em ☆☆☆☆☆ ()
Ответ на: комментарий от Eddy_Em

начиная с первого же свободного блока!

Типичный .ld файлик выглядит так:

/* Define output sections */
SECTIONS
{
  .some_section_1:
  {
    ...
  } >FLASH

  .some_section_2:
  {
    ...
  } >FLASH

  ...

  .eeprom_reserved:
  {
    ...
  } >FLASH

  /* used by the startup to initialize data */
  _sidata = LOADADDR(.data);

  .some_section_4:
  {
    ...
  } >RAM

...

}

После последнего «>FLASH» вставить ".eeprom_reserved". И объявить соответствующий буфер в исходнике:

#define BUFFER_SIZE 32768
static unsigned char __attribute__((section (".eeprom_reserved")))
        my_eeprom_reserved_buffer[BUFFER_SIZE] __attribute__((used));

gag ★★★★★ ()