Fake STM32F103C8T6 / APM32F103CCT6/T7 (64kb ОЗУ / 256kb FLASH), device ID: 0x414

Все началось с с этого поста: Интересное на AliExpress и других маркетплейсах - #303 от пользователя BOOM

Так как господа модераторы не хотят ничего переносить из той темы в отдельную, создал эту тему. Предлагаю тут и продолжить.

Итак, остановились на том, что выяснили что используемый микроконтроллер в “синей таблетке” имеет реальные 256кб FLASH-памяти, и должен иметь 64кб ОЗУ.

Как определить реальный объем ОЗУ?

Ссылка на товар на AliExpress: STM32F103C8T6.

Расколупать камень и посмотреть литографию под микроскопом. :slight_smile:

Компилятору подсунуть другой чип с бОльшим объёмом памяти, чтоб он стэк изначально выше поставил, и попробовать заработает или нет программа.

А зачем вообще знать что памяти больше, чем написано?

там память может “заворачиваться” на меньшие адреса, так не проверишь

Ну…не знаю, не уверен, сегодня попробую

Не знаю, @b707 “подбил” к продолжению темы “исследования APM32F103CCT6/T7”… ))
И мне не нужно знать бОльше, хотелось бы узнать - не меньше ли 64кб (и на сколько)? ))

Тот объем ОЗУ, что в ST-Link Utility определяется - правильный? Или он от ID = 0x414 “берется”?

А нет никакой разницы что там программа определила, важно что откомпилированном коде.

Создавать массивы размером 1К и заполнять их порядковым номером массива.
После заполнения нового 1К - проверять не изменилось ли содержимое старых массивов…

Это понятно, вопрос как стэк не затереть или проскочить при выделении памяти?

ну так взять адрес регистра стека, а еще лучше переменной STACK_HEAD и не писАть в этот блок

Код должен быть простым - без вызовов процедур и функций.

DetSimen
Из-за зеркалирования он может оказаться совсем не там где мы думаем.

это будет непросто, как то ведь понадобиться сообщить юзеру на каком этапе/адресе память закончилась.

Итак, с дефолтными настройками на чип с 20 КБ памяти, нашел в файлах map и list следующие значения (не уверен конечно что это верхняя граница стэка):

LOAD f:/st/stm32cubeide_1.4.0/stm32cubeide/plugins/com.st.stm32cube.ide.mcu.externaltools.gnu-tools-for-stm32.10.3-2021.10.win32_1.0.100.202210260954/tools/bin/../lib/gcc/arm-none-eabi/10.3.1/thumb/v7-m/nofp/crtn.o
                0x0000000020005000                _estack = (ORIGIN (RAM) + LENGTH (RAM))
                0x0000000000000200                _Min_Heap_Size = 0x200
                0x0000000000000400                _Min_Stack_Size = 0x400




LoopForever:
  b LoopForever
 8000bca:	e7fe      	b.n	8000bca <LoopForever>
  ldr   r0, =_estack
 8000bcc:	20005000 	.word	0x20005000
  ldr r0, =_sdata
 8000bd0:	20000000 	.word	0x20000000


20kb - это для STM32F103C8T6, а в этом мк должно быть 64kb…

После того как мы нашли “затирание” мы же перестанем писать в память и тогда уже можно смело пользоваться стеком - мы же больше не портим значения !

да понятно все, я пока ищу где в компиляторе исправить размер памяти чтоб протестировать с ьОльшим объемом

поменял на 32 КБ памяти, чуда не произошло :thinking: Китайцы лишней памяти не доложили

LoopForever:
  b LoopForever
 8000bca:	e7fe      	b.n	8000bca <LoopForever>
  ldr   r0, =_estack
 8000bcc:	20008000 	.word	0x20008000

to BOOM - так что все индивидуально - пробуйте/тестируйте на своем чипе, может вам и повезет.

Из чего это следует ?

Я бы рад, если разъясните - что Вы сделали и как это проделать мне?