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

Кто любит RISC в жизни, заходим, не стесняемся.
Ответить
Вымогатель припоя
Аватара пользователя
Сообщения: 677
Зарегистрирован: Чт янв 20, 2011 09:07:08
Откуда: Пермь

Сообщение prinv »

Для информации: получил blue-pill с Ali. Оказалось, что там вкрячен не STM32F103, а SC32F103.
Так вот, Keil c st-link v2 это китайское чудо прошивает нормально, а вот Atollic отказывается.
Никакая контра не уйдёт от нас
Контактная информация:
Реклама
Друг Кота
Аватара пользователя
Сообщения: 3386
Зарегистрирован: Пн окт 11, 2010 19:00:08

Сообщение Мурик »

afz писал(а):Студия отдает под стек и кучу всю свободную оперативку.
Стек и куча не могут быть в одной области памяти. Откуда студия знает сколько из свободной памяти нужно выделить под стек, а сколько под кучу?
afz писал(а):чтобы программист сам указывал размеры стека и кучи.
И это правильно. Потому что если куча не используется, то для нее можно не выделять память. Явно заданные размеры стека и кучи, позволят определить что переменные дошли до кучи со стеком.
В скрипте линкера есть такая проверка.

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

	/* Set stack top to end of RAM, and stack limit move down by
	 * size of stack_dummy section */
	__StackTop = ORIGIN(RAM) + LENGTH(RAM);
	__StackLimit = __StackTop - SIZEOF(.stack_dummy);
	PROVIDE(__stack = __StackTop);

	/* Check if data + heap + stack exceeds RAM limit */
	ASSERT(__StackLimit >= __HeapLimit, "region RAM overflowed with stack")
prinv писал(а):Оказалось, что там не STM32F103, а SC32F103.
Ссылку на продавца можно?
Реклама
Вымогатель припоя
Аватара пользователя
Сообщения: 677
Зарегистрирован: Чт янв 20, 2011 09:07:08
Откуда: Пермь

Сообщение prinv »

[uquote="Мурик",url="/forum/viewtopic.php?p=3555110#p3555110"]Ссылку на продавца можно?[/uquote]
Ссылка
Никакая контра не уйдёт от нас
Контактная информация:
Друг Кота
Аватара пользователя
Сообщения: 3386
Зарегистрирован: Пн окт 11, 2010 19:00:08

Сообщение Мурик »

В заголовке и описании упоминается что на плате SC32F103C8T6. Так что продавец предупредил об этом.
В МК 128 КБ флеша как в STM32?
Реклама
Эиком - электронные компоненты и радиодетали
Идёт направо - песнь заводит, Налево - сказку говорит.
Аватара пользователя
Сообщения: 5000
Зарегистрирован: Чт апр 21, 2011 17:55:50
Откуда: Иркутск

Сообщение СКАЗОЧНИК »

У меня тоже блюпилл, но там стоит настоящий СТМ32. Однако для С8Т6 вроде как заявлено 64 кБ флеша, а мой СТ-Линк в Кейле показал его как 128 кБ.
Станислав
Реклама
Вымогатель припоя
Аватара пользователя
Сообщения: 677
Зарегистрирован: Чт янв 20, 2011 09:07:08
Откуда: Пермь

Сообщение prinv »

[uquote="Мурик",url="/forum/viewtopic.php?p=3555119#p3555119"]В заголовке и описании упоминается что на плате SC32F103C8T6. Так что продавец предупредил об этом.
В МК 128 КБ флеша как в STM32?[/uquote]
Это понятно, что в тексте упоминается, но сначала-то идёт STM32
Да пофиг, за 100 рублей :)

В МК 64KB - это же C8, а не CB

Добавлено after 8 minutes 54 seconds:
[uquote="СКАЗОЧНИК",url="/forum/viewtopic.php?p=3555126#p3555126"]У меня тоже блюпилл, но там стоит настоящий СТМ32. Однако для С8Т6 вроде как заявлено 64 кБ флеша, а мой СТ-Линк в Кейле показал его как 128 кБ.[/uquote]
Блин, и у меня Кейл показывает 128К, а ST-Link Utility - 64K.
Думаю, что Кейл гонит.
Никакая контра не уйдёт от нас
Контактная информация:
Реклама
Идёт направо - песнь заводит, Налево - сказку говорит.
Аватара пользователя
Сообщения: 5000
Зарегистрирован: Чт апр 21, 2011 17:55:50
Откуда: Иркутск

Сообщение СКАЗОЧНИК »

Я о том же, но ... кажется понял я уже чего это такое.

Все правильно. 64 кБ.
Просто я смотрел в настройках дебагера в Кейле, а там он эту информацию похоже, взял из подключенной библиотеки, как Медиум-денсити.(средней плотности).
Может надо просто другую либу подключить и будет по другому видеть.
Сейчас запустил через СТ-Линк утилиу отдельную, там видит все нормально..

Добавлено after 1 minute 51 second:
И он правильно, Медиум-денсити

Добавлено after 22 seconds:
Low-density devices are STM32F101xx, STM32F102xx and STM32F103xx
microcontrollers where the Flash memory density ranges between 16 and 32 Kbytes.
Medium-density devices are STM32F101xx, STM32F102xx and STM32F103xx
microcontrollers where the Flash memory density ranges between 64 and 128 Kbytes.
High-density devices are STM32F101xx and STM32F103xx microcontrollers where the
Flash memory density ranges between 256 and 512 Kbytes.
XL-density devices are STM32F101xx and STM32F103xx microcontrollers where the
Flash memory density ranges between 768 Kbytes and 1 Mbyte.
Станислав
Друг Кота
Аватара пользователя
Сообщения: 4906
Зарегистрирован: Чт апр 11, 2013 11:19:59
Откуда: Минск

Сообщение WiseLord »

Показывает-то 64К, и по даташиту 64К. Но большой шанс, что реально там внутри 128к. По крайней мере, в тех BluePill, с которыми сейчас разбираюсь я, после небольших манипуляций с фалом для линкера и конфигом для OpenOCD я вполне себе все 128кБ использую. Последние 8кБ использую для эмуляции EEPROM, а так размеры прошивки уже к 75кБ подобрались, и всё ОК работает..
Контактная информация:
Поставщик валерьянки для Кота
Сообщения: 2089
Зарегистрирован: Вс июн 19, 2016 09:32:03

Сообщение Reflector »

[uquote="WiseLord",url="/forum/viewtopic.php?p=3555231#p3555231"]По крайней мере, в тех BluePill, с которыми сейчас разбираюсь я, после небольших манипуляций с фалом для линкера и конфигом для OpenOCD я вполне себе все 128кБ использую.[/uquote]
Зачем что-то править для 103C8, если можно просто изначально исходить из того, что это 103CB? Тем более в других мк может быть больше не только флеша, но и RAM, плюс добавляется какая-то периферия.
Идёт направо - песнь заводит, Налево - сказку говорит.
Аватара пользователя
Сообщения: 5000
Зарегистрирован: Чт апр 21, 2011 17:55:50
Откуда: Иркутск

Сообщение СКАЗОЧНИК »

Скажите лучше мне, что такое КУЧА?

А потом скажите, что такое "Сущности"? Я прочитал об этом где-то, разглядывая блок-схему тактирования МК. Там эти "сущности" были выделены серым цветом (квадратики такие с коэффициентом деления). Я скачал новый RM, но у него все в одном цвете.

Прошу прощения за глупые вопросы.

Добавлено after 40 seconds:
Не, про первое я уже нашел. А вот про Сущности
Станислав
Друг Кота
Аватара пользователя
Сообщения: 4906
Зарегистрирован: Чт апр 11, 2013 11:19:59
Откуда: Минск

Сообщение WiseLord »

Reflector
Тот же OpenOCD умеет детектировать тип МК по его ID регистрам и просто так не даёт записать прошивку размером более 128кБ, если он определил размер банка памяти как 64кБ. Поэтому конфиг OpenOCD приходится подправлять.
И другие утилиты не факт что позволят записать больше "официального" размера.
Последний раз редактировалось WiseLord Ср янв 23, 2019 17:02:11, всего редактировалось 1 раз.
Контактная информация:
Идёт направо - песнь заводит, Налево - сказку говорит.
Аватара пользователя
Сообщения: 5000
Зарегистрирован: Чт апр 21, 2011 17:55:50
Откуда: Иркутск

Сообщение СКАЗОЧНИК »

И мне Кейл без взлома не даст больше 32 накатать. ))) Но я еще и 500 байт не сделал... то, что у вас уже под 80 кБайт - это очень крутой проектище.
Станислав
Друг Кота
Аватара пользователя
Сообщения: 4906
Зарегистрирован: Чт апр 11, 2013 11:19:59
Откуда: Минск

Сообщение WiseLord »

Нет, это просто много шрифтов.

RLE-сжатие сильно помогает, но всё равно, использование каждого шрифта где-то 5..7кБ добавляет к размеру прошивки.
Контактная информация:
Поставщик валерьянки для Кота
Сообщения: 2089
Зарегистрирован: Вс июн 19, 2016 09:32:03

Сообщение Reflector »

[uquote="WiseLord",url="/forum/viewtopic.php?p=3555247#p3555247"]Тот же OpenOCD умеет детектировать тип МК по его ID регистрам и просто так не даёт записать прошивку размером более 128кБ, если он определил размер банка памяти как 64кБ. Поэтому конфиг OpenOCD приходится подправлять.[/uquote]
У меня кода-то были похожие проблемы, как раз с OpenOCD, но я давно от него отказался, т.к. как минимум он очень медленный... Но ладно OpenOCD, остается еще скрипт линкера, а в случае дополнительной периферии еще и хедеры, их то смысла править нет никакого.
Друг Кота
Аватара пользователя
Сообщения: 3386
Зарегистрирован: Пн окт 11, 2010 19:00:08

Сообщение Мурик »

prinv писал(а):В МК 64KB - это же C8, а не CB
В C8 и CB один и тот же кристалл, а значит одинаковый объем памяти. :)
СКАЗОЧНИК писал(а):Скажите лучше мне, что такое КУЧА?
https://ru.wikipedia.org/wiki/Куча_(память)
СКАЗОЧНИК писал(а):И мне Кейл без взлома не даст больше 32 накатать.
Для STM32 есть много бесплатных IDE без ограничений. :)
Идёт направо - песнь заводит, Налево - сказку говорит.
Аватара пользователя
Сообщения: 5000
Зарегистрирован: Чт апр 21, 2011 17:55:50
Откуда: Иркутск

Сообщение СКАЗОЧНИК »

Сижу ковыряюсь в блок схеме по тактированию МК. Скажите пожалуйста (я еще не дочитал до таймеров в RM0008 и это будет не скоро), судя по схеме, у таймеров нету своих делителей? Т.е. если я хочу сделать таймер медленнее, то мне надо сделать медленнее всю шину? :shock:

Или про делители таймеров отдельно написано? :oops:

Прошу прощения за очередной глупый вопрос...
Станислав
Поставщик валерьянки для Кота
Сообщения: 2089
Зарегистрирован: Вс июн 19, 2016 09:32:03

Сообщение Reflector »

[uquote="СКАЗОЧНИК",url="/forum/viewtopic.php?p=3555326#p3555326"]Прошу прощения за очередной глупый вопрос...[/uquote]
Переключиться в RM на описание таймеров дело нескольких секунд, про делители там, естественно в самом начале написано, итого можно было самому во всем разобраться быстрее, чем написать запрос на форуме :)
Идёт направо - песнь заводит, Налево - сказку говорит.
Аватара пользователя
Сообщения: 5000
Зарегистрирован: Чт апр 21, 2011 17:55:50
Откуда: Иркутск

Сообщение СКАЗОЧНИК »

:)))
Не, я так не могу. Хочу с живыми людьми пообщаться, хоть и виртуально. Тем более, у меня слепой метод набора текста и не составляет большой трудности написать здесь пару строчек.
Да и когда в одного все это читаешь (тем более на английском, с которым не совсем плохо, но и не хорошо у меня), голова начинает отключаться. Надо на что-то отвлекаться.

За ответ спасибо. :beer:

Добавлено after 10 minutes 52 seconds:
А еще там нарисовано, что ядро, память и ДМА тактируются от шины АНВ. И с максимально-настроенной частотой. однако там же нарисована интересная штуковина типа Clock Enable. И у всей периферии такие же. Понятно, что вокруг все выключено изначально и надо будет включить тактирование того, что используем.
Но ядро и память??? Они тоже изначально выключены?
Станислав
afz
Опытный кот
Аватара пользователя
Сообщения: 744
Зарегистрирован: Сб дек 22, 2012 08:17:42
Откуда: Караганда, Казахстан

Сообщение afz »

Мурик писал(а):Стек и куча не могут быть в одной области памяти. Откуда студия знает сколько из свободной памяти нужно выделить под стек, а сколько под кучу?
А зачем ей знать? Куча растет снизу вверх, стек сверху вниз. Если они встретятся, конечно, будет катастрофа, но,чаще всего, в тех задачах, которые решают на АВР-ках, этого не происходит. И ни у кого голова не болит... В отличие от STM32, где дефолтные размеры стека и кучи указаны маленькими и сплошь и рядом народ вдруг с паническим воплем "почему у меня hard fault" лезет в конференции, на что получает стандартный ответ "Стек увеличь".
Мурик писал(а):И это правильно. Потому что если куча не используется, то для нее можно не выделять память.
Правильно, но не поэтому. А, может быть, и совсем неправильно. Отдай стеку с кучей всю память, оставшуюся свободной после статических переменных и программа сама разберется, сколько из этой памяти уйдет под стек, сколько под кучу. Динамически, в процессе исполнения.
Мурик писал(а):Явно заданные размеры стека и кучи, позволят определить что переменные дошли до кучи со стеком.
В скрипте линкера есть такая проверка.
Проверка, конечно, нужная, но не особо информативная. Поскольку большинство народа рулит размерами стека и кучи, что называется, "от фонаря". Мало? Добавим. Сделаем в 2-4-8-16 раз больше, и вперед! Вот, как раз, от чрезмерного увеличения стека с кучей в процессе такого отфонарного подбора эта проверка и защищает. То есть, бодрое преодоление трудностей, специально для этой цели придуманных.

Мне кажется, вся эта ситуация - результат некорректного "обратного масштабирования" с "больших" систем на МК. В большой системе всеми этими делами рулит система управления виртуальной памятью, вопросов с размерами стека и кучи просто не возникает. А в большинстве МК ничего такого нет, да даже если и есть, то не используется, по причине отсутствия "большой" операционки и ненадобности оной. Ну, и решили свалить это дело на программиста...

То есть, конечно, еще могут быть дополнительные типы внешней памяти, вроде SDRAM на "продвинутых" STM32, но это, по-любому, требует специальных действий, такую память нельзя использовать таким же образом, как и встроенную SRAM, хотя бы потому, что она тормознее, и уж под стек она точно не годится.

Добавлено after 25 minutes 29 seconds:
И, кстати, я не понимаю, с чего это народ так боится, что стек вдруг переполнится из-за ошибки в программе? Да, если просто не хватает памяти, надо брать кристалл "пожирнее", а вот так, вроде всего хватает, а допустил какую-то ошибку, и стек переполнился? С чего бы это вдруг? Ладно, в программе на асме можно такое накосячить запросто, но для STM32 на асме, обычно, не программируют. А так, единственное, что приходит в голову - зациклившая рекурсия, но рекурсивная программа на МК - это как-то крутовато...

А иначе, стек имеет вполне конечные размеры, из расчета на максимум вложенности, если оно не лезет, значит, как я уже отметил, просто нужен камешек "пожирнее", или нужно менять алгоритм. В общем, неправильно все это...

Впрочем, все это уже обсуждалось, здесь же, ИМХО, осенью.
Кто мешает тебе выдумать порох непромокаемый? (К. Прутков, мысль № 133)
Друг Кота
Аватара пользователя
Сообщения: 3386
Зарегистрирован: Пн окт 11, 2010 19:00:08

Сообщение Мурик »

afz писал(а):допустил какую-то ошибку, и стек переполнился? С чего бы это вдруг? Ладно, в программе на асме можно такое накосячить запросто, но для STM32 на асме, обычно, не программируют. А так, единственное, что приходит в голову - зациклившая рекурсия
Можно создать локальный экземпляр структуры на пару КБ или больше и стек переполнен. Маловероятно? Посмотрите на структуры FafFs.

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

typedef struct {
	BYTE	fs_type;		/* File system type (0:N/A) */
	BYTE	drv;			/* Physical drive number */
	BYTE	n_fats;			/* Number of FATs (1 or 2) */
	BYTE	wflag;			/* win[] flag (b0:dirty) */
	BYTE	fsi_flag;		/* FSINFO flags (b7:disabled, b0:dirty) */
	WORD	id;				/* File system mount ID */
	WORD	n_rootdir;		/* Number of root directory entries (FAT12/16) */
	WORD	csize;			/* Cluster size [sectors] */
#if _MAX_SS != _MIN_SS
	WORD	ssize;			/* Sector size (512, 1024, 2048 or 4096) */
#endif
#if _USE_LFN != 0
	WCHAR*	lfnbuf;			/* LFN working buffer */
#endif
#if _FS_EXFAT
	BYTE*	dirbuf;			/* Directory entry block scratchpad buffer */
#endif
#if _FS_REENTRANT
	_SYNC_t	sobj;			/* Identifier of sync object */
#endif
#if !_FS_READONLY
	DWORD	last_clst;		/* Last allocated cluster */
	DWORD	free_clst;		/* Number of free clusters */
#endif
#if _FS_RPATH != 0
	DWORD	cdir;			/* Current directory start cluster (0:root) */
#if _FS_EXFAT
	DWORD	cdc_scl;		/* Containing directory start cluster (invalid when cdir is 0) */
	DWORD	cdc_size;		/* b31-b8:Size of containing directory, b7-b0: Chain status */
	DWORD	cdc_ofs;		/* Offset in the containing directory (invalid when cdir is 0) */
#endif
#endif
	DWORD	n_fatent;		/* Number of FAT entries (number of clusters + 2) */
	DWORD	fsize;			/* Size of an FAT [sectors] */
	DWORD	volbase;		/* Volume base sector */
	DWORD	fatbase;		/* FAT base sector */
	DWORD	dirbase;		/* Root directory base sector/cluster */
	DWORD	database;		/* Data base sector */
	DWORD	winsect;		/* Current sector appearing in the win[] */
	BYTE	win[_MAX_SS];	/* Disk access window for Directory, FAT (and file data at tiny cfg) */
} FATFS;


typedef struct {
	_FDID	obj;			/* Object identifier (must be the 1st member to detect invalid object pointer) */
	BYTE	flag;			/* File status flags */
	BYTE	err;			/* Abort flag (error code) */
	FSIZE_t	fptr;			/* File read/write pointer (Zeroed on file open) */
	DWORD	clust;			/* Current cluster of fpter (invalid when fprt is 0) */
	DWORD	sect;			/* Sector number appearing in buf[] (0:invalid) */
#if !_FS_READONLY
	DWORD	dir_sect;		/* Sector number containing the directory entry */
	BYTE*	dir_ptr;		/* Pointer to the directory entry in the win[] */
#endif
#if _USE_FASTSEEK
	DWORD*	cltbl;			/* Pointer to the cluster link map table (nulled on open, set by application) */
#endif
#if !_FS_TINY
	BYTE	buf[_MAX_SS];	/* File private data read/write window */
#endif
} FIL;


typedef struct {
	FSIZE_t	fsize;			/* File size */
	WORD	fdate;			/* Modified date */
	WORD	ftime;			/* Modified time */
	BYTE	fattrib;		/* File attribute */
#if _USE_LFN != 0
	TCHAR	altname[13];			/* Altenative file name */
	TCHAR	fname[_MAX_LFN + 1];	/* Primary file name */
#else
	TCHAR	fname[13];		/* File name */
#endif
} FILINFO;
Обратите внимание на массивы байт и символов. _MAX_SS равно 512, а _MAX_LFN 255. Во многих статьях эти экземпляры структур локальные (не знаю чем руководствовались их авторы, неужели не знали размеры структур?). https://eax.me/stm32-fatfs/
http://we.easyelectronics.ru/aliaksei/s ... schim.html
http://mycontroller.ru/old_site/stm32-f ... efault.htm
https://radiokot.ru/forum/viewtopic.php ... 0#p3433010
Ответить

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