-
Постов
12 216 -
Зарегистрирован
Весь контент ViKo
-
Так дайте мне какую-нибудь болванку :) Если не трудно. upd. В тех scatter-файлах, что я вижу в хэлпе, не нахожу упоминания стека. Что непонятно - в файле startup_stm32f10x_hd.s вижу стек по адресу 0x20000400. Как запускаю симулятор - загружается 0x64000400.
-
Как расположить стек по заданному адресу? Когда я задаю в свойствах проекта, что будет внешняя ОЗУ по адресам 0x64000000...0x40000, __initial_sp становится равным 0x64000400. Ну а дальше в определенный момент вываливается HardFault (это потом буду исследовать). Вручную в startup задать __initial_sp 0x20000400?
-
Вызывает раздражение, когда код в виде /* Setup STM32 system (clock, PLL and Flash configuration) */ SystemInit(); /* Инициализация микроконтроллера */ MCU_Init(); в окне дизассемблера превращается в следующее 55: /* Setup STM32 system (clock, PLL and Flash configuration) */ 0x08000174 B51C PUSH {r2-r4,lr}] 56: SystemInit(); 57: 58: /* Инициализация микроконтроллера */ 0x08000176 F000FDC9 BL.W SystemInit (0x08000D0C) 59: MCU_Init(); 0x08000156 0x0800017A F000F931 BL.W MCU_Init (0x080003E0) Т.е., Keil считает, что строка комментария (в данном примере /* Инициализация микроконтроллера */) принадлежит к предыдущей строке кода, а не к следующей. Можно поставить хоть десять пустых строк, все равно комментарий прилепится к предыдущей строке кода. Неужто писать все комментарии после кода?
-
"Первой мыслью, пришедшей в голову" должна была быть мысль уменьшить количество триггеров, работающих на максимальной тактовой частоте. Некоторые блоки, наверняка, можно было тактировать меньшей частотой. Использовать сигналы ENA, приходящие на каждый триггер ЛЭ, для отключения их работы, когда это не нужно. И вообще понизить тактовую частоту.
-
Тонкие дорожки питания и земли продублируйте проводами, куда-нибудь поближе к ПЛИС. Складывается впечатление, что не хватает питания. А может, ПЛИС уже сдохла...
-
Заменим во входной последовательности 0011101 каждую единицу на 2 (двухбитовый код). Если коэффициенты фильтра 0 и 1 соответствуют x0 и x1, получим для отсутствия сигнала и полного совпадения числа 0 и 8. Если коэффициенты фильтра соответствуют x1 и -x1, получим числа 0 и -8. Т.е., все равно... upd. Но для коэффициентов 0 и x1 есть одно преимущество - нулевые отводы фильтра вообще не нужны! Схема упрощается.
-
Для приведенного в начале примера, если использовать разные способы "перемножения", получаем следующие значения для отсутствия сигнала и полного совпадения: xor 4 0 !xor 3 7 and 0 4 в любом случае разница равна 4, количеству единиц в коде. При использовании знаковых чисел, наверное, будет что-то подобное, только смещенное.
-
Глядя в приведенный выше код, понял, что, кажется, я кое-чего не дописал в RCC. Спасибо! Теперь направление, куда рыть, определилось.
-
У меня ситуация подобная, только еще хуже. STM32F103, есть устройства на внешней шине, в том числе, контроллер ЖКИ. В симуляторе Keil как-то проходит программа. Только когда обращаюсь к контроллеру ЖКИ, почему-то останавливается и идет только по-шагам. В микроконтроллер с помощью ULINK-ME зашивается, верификация проходит. И генератор на 8 MHz запускается. Но дальше - никаких признаков жизни, в отладчике вываливается в Hard Fault. Даже не дойдя до инициализации ЖКИ. Боюсь и спрашивать... Тут такие "монстры ARM"...
-
Верно, будет работать фильтр и на xor. Только пик пойдет вниз, к нулю. Когда входная последовательность совпадает с коэффициентами фильтра, все xor дадут 0, и сумма станет равна 0. В-принципе, что xor, что !xor, что and дают одинаковую разницу на выходе фильтра между отсутствием сигнала и присутствием. Вы правы. И на ПЛИС реализация тоже одинаковая - все равно через LUT пропускать.
-
Попробуйте посчитать нарисованный на картинке фильтр по вашему алгоритму. У меня не получилось пика корреляции. С каким порогом будете сравнивать? У Вас получается не "нужно прибавлять единицу, или нет", а "прибавить единицу или отнять". upd. Нет, пожалуй, и не так - как-то "размазывается" по времени, точнее не подберу слова.
-
Я предлагаю делать то, что требуется от фильтра. Где нужно умножить на 0 - не передавать ничего, где нужно умножить на 1 - передать, как есть. Если бы нужно было умножить на -1 - проинвертировать :)
-
А почему нужно ксорить? Разве умножение на 1 - то же, что проинвертировать сигнал? А умножить на 0 - оставить сигнал без изменений?
-
Больше всего похоже на неисправный осциллограф :) Выходы с ПЛИС куда идут, и далеко ли? А еще проверьте, чтобы на всех нужных ногах было питание и земля.
-
А далеко ли тянутся цепи с ПЛИС? Может быть "осциллографами"? Чем смотрели? Землю осциллографа не забыли подключить? Легко!
-
:bb-offtopic: Будет до той поры, пока будет это, мягко говоря, "неумное" разделение на начинающих и продвинутых. Да еще так, что в раздел начинающих сходу и не попасть. Сам побывал в этом положении несколько раз.
-
А Вам действительно надо, чтобы были разные такты, адреса? Наверное, так автоматически сделать не удастся.
-
Насколько я понимаю, мегафункцию нужно сначала приготовить визардом, получить нужное графическое представление, затем использовать.
-
100 Ом последовательно на выход MAXII, который выдает такты для "второй" ПЛИС. И для первой ПЛИС не помешает.
-
В свое время я находил более старые версии стандарта в Интернете. Размер данного файла 11.5 MB, он сюда не прилепится. Да и правилами форума это, наверное, запрещено. Пообщаетесь здесь, наберете нужное количество сообщений, и вам откроются "закрома".
-
Я в этом совсем "зеленый". Вот код из startup_stm32f10x_hd.s ; Reset handler routine Reset_Handler PROC EXPORT Reset_Handler [WEAK] IMPORT __main LDR R0, = SystemInit_ExtMemCtl; initialize external memory controller BLX R0 LDR R1, = __initial_sp ; restore original stack pointer MSR MSP, R1 LDR R0, =__main BX R0 ENDP После сброса стек в 0x20000400. После команды MSR в MSP загружается 0x64000400. Потому что в свойствах проекта я задал, что есть внешнее ОЗУ по адресу 0x64000000 размером 0x40000. Есть и еще пара устройств на шине. Почему стек прицепился к этой области, мне невдомек. Потом скачет в main и где-то там заскакивает в HardFault.
-
Так ведь коэффициенты, на которые умножаются ваши выборки перед БПФ, вычисляются по формулам. Эти формулы известны для каждого окна. Вычисляете. Умножаете ваши выборки. Вот и весь Verilog :)
-
Ответы на все ваши вопросы находятся в стандарте IEEE Std 1800 - 2009 IEEE Standard for SystemVerilog— Unified Hardware Design, Specification, and Verification Language Я тоже не сразу "распробовал" этот документ, но общение на форуме наставило меня на путь истины!
-
По-умолчанию программа зацикливается там, насколько я понимаю. Поставив там точку останова, получаю: R13(SP)=0x64000398 R14(LR)=0xfffffff9 Т.е., стек почему-то организовался во внешнем ОЗУ. А программа залетела в HardFault_Handler из несуществующего адреса.