STM32 новичку в ARM что к чему

Кто любит RISC в жизни, заходим, не стесняемся.
Ответить
Мудрый кот
Сообщения: 1849
Зарегистрирован: Вс дек 25, 2016 08:34:54

Сообщение Dimon456 »

VladislavS, прошивки отличаются, на asm
Спойлер

Код: Выделить всё

Program Size:					
		text	   data	    bss	    dec	    hex		filename
		5299		136		184		5619	15f3	rnd_f030.elf
ну и бинарники соответственно, на asm=5440 байт, на с=5432 байта, а если сравнивать по содержимому - то там полностью все отличается, кроме последней строки, она одинакова.

И опять же, в вашем варианте самая первая точка останова на SystemInit();, это когда отключен в debug run to main, то есть я не вижу где инициализируется оперативная память, сейчас это на каком нибудь массиве проверю.

Добавлено after 4 minutes 36 seconds:
Все увидел, вопрос отпадает, где это происходит.
Реклама
Собутыльник Кота
Аватара пользователя
Сообщения: 2567
Зарегистрирован: Вт май 01, 2018 19:44:47

Сообщение VladislavS »

[uquote="Eddy_Em",url="/forum/viewtopic.php?p=4322071#p4322071"]VladislavS, без понятия.[/uquote]Печалька.
Реклама
Мудрый кот
Сообщения: 1849
Зарегистрирован: Вс дек 25, 2016 08:34:54

Сообщение Dimon456 »

VladislavS, а вот эта строчка, синим выделено, программа туда должна заходить.
СпойлерИзображение
Собутыльник Кота
Аватара пользователя
Сообщения: 2567
Зарегистрирован: Вт май 01, 2018 19:44:47

Сообщение VladislavS »

[uquote="Dimon456",url="/forum/viewtopic.php?p=4322091#p4322091"]VladislavS, а вот эта строчка, синим выделено, программа туда должна заходить.[/uquote]В твоём случае должна. Это инициализация глобальных (ненулевых) данных.
А вот при отладке из SRAM не должна. Так как инициализирующие данные и так уже в SRAM, зачем их копировать туда-сюда.
Последний раз редактировалось VladislavS Чт ноя 17, 2022 18:38:06, всего редактировалось 1 раз.
Реклама
Эиком - электронные компоненты и радиодетали
Мудрый кот
Сообщения: 1849
Зарегистрирован: Вс дек 25, 2016 08:34:54

Сообщение Dimon456 »

Ну, тогда все ОК, работает. Можно мой код экспериментировать.
Реклама
Говорящий с текстолитом
Аватара пользователя
Сообщения: 1525
Зарегистрирован: Чт июн 10, 2010 20:11:19

Сообщение COKPOWEHEU »

[uquote="VladislavS",url="/forum/viewtopic.php?p=4322061#p4322061"]COKPOWEHEU, это действительно найдено в первом попавшемся проекте для ARМ (приведённом тут чуть выше как пример). И степень "невникания" удивала.[/uquote]
Пожалуй, сочту это комплиментом. Вроде как вы не ожидали от меня такой халтуры.
Но вообще-то, не вижу смысла уделять стартапу слишком много внимания: он выполняется единственный раз при старте камня, и даже если там накручено говнокода, по большому счету это ни на чем не скажется. Лично я к ARM'у пришел "сверху", от готового шаблона, и лезть глубоко "вниз" надобности не было: работает и ладно.
А вот с RISC-V так не повезло: не нашел шаблона, который бы просто собрался и заработал, пришлось изучать ассемблер, линкер-скрипты и прочую ядерную магию. В процессе, разумеется, тоже изрядно накосячил. Первый проект на Си у меня собрался чуть больше двух лет назад, и только на прошлой неделе я выловил грубую ошибку в линкер-скрипте.
VladislavS писал(а):Не будет подобного в курсах - замечательно.
"Будет" это уже немного поздно: 80% уже выложено на всеобщее обозрение, можете сами проверить какие там косяки.
{звуки беспалевной агитации побыть бесплатным бета-тестером}
Реклама
Мудрый кот
Сообщения: 1849
Зарегистрирован: Вс дек 25, 2016 08:34:54

Сообщение Dimon456 »

VladislavS, встроить код несложно было
Спойлер

Код: Выделить всё

void __attribute__((naked, noreturn)) Reset_Handler()
{
#ifdef __DEBUG_SRAM__
  __set_MSP((uint32_t)&_estack);
#endif

  SystemInit();

  CRC_Config();

	char *ptr = (void*)RAMSTART;
	uint32_t seed=0;
	for(uint16_t i=0; i < (RAMEND-RAMSTART-1); i++){
		seed += CRC_32BitsCompute(ptr++);
	}

#ifndef __DEBUG_SRAM__
  extern uint32_t _sidata[], _sdata[], _edata[];
  for (volatile uint32_t *pSrc = _sidata, *pDst = _sdata; pDst != _edata; *pDst ++= *pSrc++) ;
#endif

  extern uint32_t _sbss[], _ebss[];
  for (volatile uint32_t *pDst = _sbss; pDst != _ebss; *pDst ++= 0) ; // Zero -> BSS

  srand(seed);

  main();
}
Одним словом, СПАСИБО.
Собутыльник Кота
Аватара пользователя
Сообщения: 2567
Зарегистрирован: Вт май 01, 2018 19:44:47

Сообщение VladislavS »

Чтобы сделать этот код независимым от тулчейна следеут поместить всё что до инициализации данных в SystemInit (она, вообще говоря, для этого и придумана), где-то спрятать seed на время инициализации данных (в какой-нибудь периферии) и использовать по назначению уже в main.
Мудрый кот
Сообщения: 1849
Зарегистрирован: Вс дек 25, 2016 08:34:54

Сообщение Dimon456 »

SystemInit вот сюда перекидывается
Спойлер

Код: Выделить всё

void SystemInit1 (void)
{    
  /* Set HSION bit */
  RCC->CR |= (uint32_t)0x00000001;

#if defined (STM32F0XX_MD) || defined (STM32F030X8)
  /* Reset SW[1:0], HPRE[3:0], PPRE[2:0], ADCPRE and MCOSEL[2:0] bits */
  RCC->CFGR &= (uint32_t)0xF8FFB80C;
#else
  /* Reset SW[1:0], HPRE[3:0], PPRE[2:0], ADCPRE, MCOSEL[2:0], MCOPRE[2:0] and PLLNODIV bits */
  RCC->CFGR &= (uint32_t)0x08FFB80C;
#endif /* STM32F0XX_MD or STM32F030X8 */
  
  /* Reset HSEON, CSSON and PLLON bits */
  RCC->CR &= (uint32_t)0xFEF6FFFF;

  /* Reset HSEBYP bit */
  RCC->CR &= (uint32_t)0xFFFBFFFF;

  /* Reset PLLSRC, PLLXTPRE and PLLMUL[3:0] bits */
  RCC->CFGR &= (uint32_t)0xFFC0FFFF;

  /* Reset PREDIV1[3:0] bits */
  RCC->CFGR2 &= (uint32_t)0xFFFFFFF0;

  /* Reset USARTSW[1:0], I2CSW, CECSW and ADCSW bits */
  RCC->CFGR3 &= (uint32_t)0xFFFFFEAC;

  /* Reset HSI14 bit */
  RCC->CR2 &= (uint32_t)0xFFFFFFFE;

  /* Disable all interrupts */
  RCC->CIR = 0x00000000;

  /* Configure the System clock frequency, AHB/APBx prescalers and Flash settings */
  SetSysClock();
}
VladislavS писал(а):где-то спрятать seed на время инициализации данных
а где его спрятать?
Собутыльник Кота
Аватара пользователя
Сообщения: 2567
Зарегистрирован: Вт май 01, 2018 19:44:47

Сообщение VladislavS »

[uquote="Dimon456",url="/forum/viewtopic.php?p=4322221#p4322221"]а где его спрятать?[/uquote]В каждом чипе можно найти либо специально предназначенные для хранения данных регистры, либо неиспользуемые регистры периферии, способные это делать. Проявите изобретательность, почитайте RM :)
Опытный кот
Аватара пользователя
Сообщения: 848
Зарегистрирован: Ср авг 03, 2022 05:22:56

Сообщение MLX90640 »

Backup, backup SRAM
Мудрый кот
Сообщения: 1849
Зарегистрирован: Вс дек 25, 2016 08:34:54

Сообщение Dimon456 »

VladislavS, я не знал что SystemInit можно было перенести в первый вызов, то есть сделать так
Спойлер

Код: Выделить всё

Reset_Handler:
  ldr   r0, =_eram
  mov   sp, r0          /* set stack pointer */

/* Call the clock system intitialization function.*/
    bl  SystemInit
	
/* Copy the data segment initializers from flash to SRAM */
  movs r1, #0
  b LoopCopyDataInit
  .
  .
  .
а потом в SystemInit, как вы пишите, поместить мой код, в seed сохранить, к примеру, в 32-битном регистре таймера ТИМ2 (вроде он 32-битный).
Собутыльник Кота
Аватара пользователя
Сообщения: 2567
Зарегистрирован: Вт май 01, 2018 19:44:47

Сообщение VladislavS »

[uquote="Dimon456",url="/forum/viewtopic.php?p=4322945#p4322945"]я не знал что SystemInit можно было перенести в первый вызов[/uquote]Не только можно, но и нужно. Именно там его место.

[uquote="Dimon456",url="/forum/viewtopic.php?p=4322945#p4322945"]seed сохранить, к примеру, в 32-битном регистре таймера ТИМ2 (вроде он 32-битный).[/uquote]Ну можете же, если захотите :)
Опытный кот
Аватара пользователя
Сообщения: 848
Зарегистрирован: Ср авг 03, 2022 05:22:56

Сообщение MLX90640 »

Второй раз повторяю - регистры Backup, память Buckap SRAM.
Ну и пусть топикстартер расскажет (чисто для интереса), зачем же ему понадобилась генерация случайного числа? Нужно ли одно число получить или несколько, нужно ли их получить один раз при старте или получать их периодически во время работы?
Мудрый кот
Сообщения: 1849
Зарегистрирован: Вс дек 25, 2016 08:34:54

Сообщение Dimon456 »

MLX90640 писал(а):Второй раз повторяю - регистры Backup, память Buckap SRAM.
И я еще раз повторяю - stm32f030f4p6, или может в этом чипе еще что-то есть, чего я не знаю?.
Нужно что бы при старте программы получалось всегда новое число (всего один раз сканирование ОЗУ, при старте), и нужно периодически во время работы. А АЦП не охота задействовать.
Друг Кота
Аватара пользователя
Сообщения: 25500
Зарегистрирован: Чт янв 10, 2008 22:01:02
Откуда: Московская область, Фрязино

Сообщение КРАМ »

[uquote="Dimon456",url="/forum/viewtopic.php?p=4323081#p4323081"]А АЦП не охота[/uquote]
Очень убедительно... :))) :))) :)))
Заниматься масштабной движухой с памятью хочется, а получить практически true Random - нет... :tea: У всех свои извращения...
Собутыльник Кота
Аватара пользователя
Сообщения: 2567
Зарегистрирован: Вт май 01, 2018 19:44:47

Сообщение VladislavS »

[uquote="Dimon456",url="/forum/viewtopic.php?p=4323081#p4323081"]
MLX90640 писал(а):Второй раз повторяю - регистры Backup, память Buckap SRAM.
И я еще раз повторяю - stm32f030f4p6, или может в этом чипе еще что-то есть, чего я не знаю?.[/uquote]Ещё в DMA-контроллере обычно много 32-битных регистров простаивает. А от того что он десять раз повторит в f030 backup не появится.
Родился
Аватара пользователя
Сообщения: 7
Зарегистрирован: Ср июн 29, 2016 23:02:14

Сообщение kot3245 »

Котаны, натыкайте меня мордой чего покурить на тему fasmarm желательно с примерами... Особенно возбуждает дрыганье ножкой, работа с таймерами, ADC, извлечение квадратного корня в целых числах
targeet device STM32F030
У кошки четыре ноги: вход -in, выход -out, земля - gnd, и питание -vdd... А так же хвост заземления.
http://kot3245.ru
Собутыльник Кота
Аватара пользователя
Сообщения: 2516
Зарегистрирован: Пт июл 12, 2019 22:52:01

Сообщение Eddy_Em »

Такой дурацкий вопрос: а будет ли код, написанный под STM32F303, работать на F302? Попутали маленько и не те заказали…
Вроде в апоуте "migrating between F303 and F302" написано, что все должно быть ОК (а вот обратно может не получиться, т.к. у F302, как ни странно, функционал пожирней).
Linux rules! Windows must die. Здравомыслящий человек добровольно будет пользоваться мастдаем лишь в двух случаях: под дулом автомата или под влиянием анального зонда.
Я на гитхабе, в ЖЖ
Контактная информация:
Собутыльник Кота
Аватара пользователя
Сообщения: 2567
Зарегистрирован: Вт май 01, 2018 19:44:47

Сообщение VladislavS »

Заменить стартап, линкерскрипт и заголовочный файл контроллера. Проверить систему тактирования. Если после этого пересоберётся, то скорее всего и заработает.
Ответить

Вернуться в «ARM»