Arlleex 183 2 июля, 2021 Опубликовано 2 июля, 2021 · Жалоба 2 часа назад, LAS9891 сказал: ...и это работало. Что не так делал автор поясните? Не знаю. Может, совпало так, что "работало", а на самом деле всего лишь звезды сложились правильно. Синтаксиса указания в качестве имени секции имени региона - не видел. Поэтому возможны любые казусы. Цитата Что такое Execution Region? Что такое выходная секция? TRM на Ваш тулчейн откройте, там в разделе описания линкера увидите всю интересующую Вас информацию. Цитата ...вылетает блок GPIO, который удерживает питание для контроллера (ключ)... Желательно, все-таки, чуть конкретизировать, что под этим имеется ввиду. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Darth Vader 0 3 июля, 2021 Опубликовано 3 июля, 2021 · Жалоба 02.07.2021 в 09:14, LAS9891 сказал: Что такое Execution Region? Что такое выходная секция? Прочтите об этом в оригинале. А про аттрибут размещения в секции здесь. Как видите, имя секции и имя Execution region - разные вещи. Их нельзя смешивать. Вы же именно это и сделали. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
LAS9891 0 3 июля, 2021 Опубликовано 3 июля, 2021 (изменено) · Жалоба 9 hours ago, Darth Vader said: Прочтите об этом в оригинале. А про аттрибут размещения в секции здесь. Как видите, имя секции и имя Execution region - разные вещи. Их нельзя смешивать. Вы же именно это и сделали. СПАСИБО! On 7/2/2021 at 11:38 AM, Arlleex said: Желательно, все-таки, чуть конкретизировать, что под этим имеется ввиду. Пока проверить не на чем, так что пока не важно. Мне интересно всё ли я сделал чтобы заработала SRAM1. В код добавил строчку: RCC->AHB2ENR |= RCC_AHB2ENR_SRAM1EN; // SRAM1 interface clock is enabled. В Scatter добавлю все необходимое благодаря Darth Vader. Что то ещё требуется для подключения SRAM1 в STM32H73 ? Изменено 3 июля, 2021 пользователем LAS9891 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
LAS9891 0 5 июля, 2021 Опубликовано 5 июля, 2021 · Жалоба On 1/13/2021 at 5:11 PM, Allregia said: С хипом и стеком - отбой, там причина оказалась совсем в другом. То, о чем изначало спрашивалсь - все работает. Похоже это мой случай. Если я использую такой scatter: ; ************************************************************* ; *** Scatter-Loading Description File generated by uVision *** ; ************************************************************* LR_IROM1 0x08000000 0x00200000 { ; load region size_region ER_IROM1 0x08000000 0x00200000 { ; load address = execution address *.o (RESET, +First) *(InRoot$$Sections) .ANY (+RO) .ANY (+XO) } RW_DTCM 0x20000000 0x00020000 { ; RW data .ANY (+RW +ZI) } RW_AXI_SRAM 0x24000000 0x00080000 { .ANY (+RW +ZI) } RW_SRAM4 0x38000000 0x00010000 { .ANY (+RW +ZI) } } Всё работает. Стоит мне добавить область SRAM1: ; ************************************************************* ; *** Scatter-Loading Description File generated by uVision *** ; ************************************************************* LR_IROM1 0x08000000 0x00200000 { ; load region size_region ER_IROM1 0x08000000 0x00200000 { ; load address = execution address *.o (RESET, +First) *(InRoot$$Sections) .ANY (+RO) .ANY (+XO) } RW_DTCM 0x20000000 0x00020000 { ; RW data .ANY (+RW +ZI) } RW_AXI_SRAM 0x24000000 0x00080000 { .ANY (+RW +ZI) } RW_SRAM1 0x30000000 0x00020000 { .ANY (+RW +ZI) } RW_SRAM4 0x38000000 0x00010000 { .ANY (+RW +ZI) } } Всё летит в Hard Fault. Тактирование SRAM1 включено в функции SystemInit (void): RCC->AHB2ENR |= (RCC_AHB2ENR_D2SRAM1EN | RCC_AHB2ENR_D2SRAM2EN | RCC_AHB2ENR_D2SRAM3EN); В отладчике проверил - тактирование включено. В чём проблема? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 69 5 июля, 2021 Опубликовано 5 июля, 2021 · Жалоба 15 minutes ago, LAS9891 said: Тактирование SRAM1 включено в функции SystemInit (void) А вызывается она где? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
LAS9891 0 5 июля, 2021 Опубликовано 5 июля, 2021 · Жалоба 1 minute ago, aaarrr said: А вызывается она где? ; Reset handler Reset_Handler PROC EXPORT Reset_Handler [WEAK] IMPORT SystemInit IMPORT __main LDR R0, =SystemInit BLX R0 LDR R0, =__main BX R0 ENDP перед __main Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 69 5 июля, 2021 Опубликовано 5 июля, 2021 · Жалоба Тогда исследуйте место и причину HF. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
LAS9891 0 5 июля, 2021 Опубликовано 5 июля, 2021 · Жалоба 1 minute ago, aaarrr said: Тогда исследуйте место и причину HF. Как? В отладку не зайти. В окошке Command сыплются "Cannot access Memory". Allregia что-то знает, но молчит. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 69 5 июля, 2021 Опубликовано 5 июля, 2021 · Жалоба Хорошо, сделайте проще: уберите описание SRAM1 из скрипта линкера, и попробуйте работать с ней из своего кода через указатель. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
LAS9891 0 5 июля, 2021 Опубликовано 5 июля, 2021 (изменено) · Жалоба Убрал. Потом в код добавил: uint32_t* pointer = (uint32_t*)0x30000000; *pointer = 1; Результат в отладке: Ещё наблюдение: Пробовал зажигать светодиод в прерывании по HF. Диод не горит, подозреваю, что это происходит из-за того, что инициализации порта не была проведена. Изменено 5 июля, 2021 пользователем LAS9891 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 69 5 июля, 2021 Опубликовано 5 июля, 2021 · Жалоба 6 minutes ago, LAS9891 said: Результат в отладке Прекрасно: память на месте и доступна. 40 minutes ago, LAS9891 said: В отладку не зайти. В окошке Command сыплются "Cannot access Memory". Например, освоить отладочную печать, написать обработчик HF с выводом содержимого стек-фрейма и статусных регистров. Или пройти по шагам от сброса. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Darth Vader 0 5 июля, 2021 Опубликовано 5 июля, 2021 · Жалоба 6 часов назад, LAS9891 сказал: Всё летит в Hard Fault Т.е. вы даже не лезете туда своей программой (не пишите туда и не читаете оттуда) и происходит HF? Посмотрите в map-файле, какие объекты программы линкер разместил в этом регионе памяти. Может там лежат какие-то глобальные данные, которые инициализируются в __main(), и как раз при этой записи и происходит HF. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 69 5 июля, 2021 Опубликовано 5 июля, 2021 · Жалоба Еще Reset_Handler зачем-то объявлен как WEAK (чистой воды вредительство, КМК). Не переопределяется ли где? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Arlleex 183 6 июля, 2021 Опубликовано 6 июля, 2021 · Жалоба 16 часов назад, LAS9891 сказал: Как? В отладку не зайти. Это еще что значит? Почему? Вы что, не на реальном МК запускаетесь? Цитата В окошке Command сыплются "Cannot access Memory" Вот при симуляции как раз так и будет. При железном отладчике - в некоторых случаях. 11 часов назад, Darth Vader сказал: Может там лежат какие-то глобальные данные, которые инициализируются в __main(), и как раз при этой записи и происходит HF. Все RW-, ZI-данные инициализируются в __main() и не важно, где они находятся в ОЗУ. Естественно, она должна быть включена (и она у него включена). Тут сейчас начнется гадание на кофейной гуще и окажется, например, что 'Use FPU' в проекте был включен, __main() закономерно инструкции сопроцессора в своих целях использовала, а в стандартном SystemInit() сам сопроцессор включен не был. Классика А может, сама SystemInit() в своих целях расположила свои переменные в SRAM, которая не была еще включена. Тогда поможет прослойка на ассемблере перед вызовом SystemInit(). Например, как тут. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
LAS9891 0 6 июля, 2021 Опубликовано 6 июля, 2021 · Жалоба 13 hours ago, Darth Vader said: Т.е. вы даже не лезете туда своей программой (не пишите туда и не читаете оттуда) и происходит HF? Посмотрите в map-файле, какие объекты программы линкер разместил в этом регионе памяти. Может там лежат какие-то глобальные данные, которые инициализируются в __main(), и как раз при этой записи и происходит HF. В смысле не пишите не читаете? Я в Scatter-файле указываю область памяти SRAM1. При сборке проекта в этой области размещаются данные. Их не я сам принудительно размещаю. Вот например что расположилось в SRAM1 при сборке (.map-файл): Execution Region RW_SRAM1 (Exec base: 0x30000000, Load base: 0x08011968, Size: 0x00000910, Max: 0x00020000, ABSOLUTE) Exec Addr Load Addr Size Type Attr Idx E Section Name Object 0x30000000 0x08011968 0x0000002c Data RW 36 .data functions.o 0x3000002c 0x08011994 0x00000004 PAD 0x30000030 0x08011998 0x0000006e Data RW 442 .data calibration.o 0x3000009e 0x08011a06 0x00000002 PAD 0x300000a0 0x08011a08 0x00000008 Data RW 679 .data font12.o 0x300000a8 0x08011a10 0x00000008 Data RW 2489 .data system_stm32h7xx.o 0x300000b0 - 0x00000200 Zero RW 34 .bss functions.o 0x300002b0 - 0x00000060 Zero RW 2631 .bss c_w.l(libspace.o) 0x30000310 - 0x00000200 Zero RW 2 HEAP startup_stm32h743xx.o 0x30000510 - 0x00000400 Zero RW 1 STACK startup_stm32h743xx.o Кроме SRAM1 в Scatter-файле также указаны области DTCM, AXI SRAM, SRAM4. В них тоже располагаются какие-то данные. Если в Scatter-файле указать только эти области, то все работает без проблем, если добавить SRAM1 - Hard Fault. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться