Перейти к содержанию
    

VladislavS

Свой
  • Постов

    1 240
  • Зарегистрирован

  • Посещение

  • Победитель дней

    9

Сообщения, опубликованные VladislavS


  1. 3 минуты назад, Arlleex сказал:

    фиктивное чтение из TIM3->SR или поставить барьер памяти DMB (если буфер записи есть).

    DMB вообще из другой оперы. Читать SR можно, но это бесполезная трата времени (а там 1М прерываний в секунду, если что). Надо всего лишь сброс флага сделать в начале прерывания, а за ним полезные действия.

    2 минуты назад, Vladimir_T сказал:

    На выходе таймера, через PB4  сформирован нормальный, ожидаемый сигнал. 

    Ну вот, что я и предполагал. Осталось подумать зачем вам 1М прерываний, можно ли от этого уйти.

  2. У таймеров флаги статусов прерывания сбрасываются записью нуля. 

     

    Есть одна тонкость, на высокоскоростных контроллерах команда очистки флага не должна быть в конце прерывания. Иначе, можно очистить флаг, выйти из прерывания, а он ещё физически не очистился и залетаем в прерывание снова.

  3. Когда вы подключаете заголовочный файл от микроконтроллера, то он автоматом тянет за собой core_cm7.h, в котором все регистры определены. Не занимайтесь ерундой.

     

    Что касается собственно DWТ, то документация гласит, чтобы CYCCNT тикал надо чтобы два бита были установлены. Проверить что они установлены не трудно.

    cyccnt.thumb.png.8f23769360d5840ea0906d9f7336e19f.png

     

     

     

  4. 1 час назад, jcxz сказал:

    Смысла отлаживать в QSPI-памяти нет никакого, но можно сделать аналогично процедуре с SDRAM.

    Для QSPI наверняка готовый FlashLoader есть, тем более для девборда. 

     

     

      

    2 часа назад, eu1cc сказал:

    Очевидно, вначале должны стартануть процедуры работы с этой памятью, и где-то в теле программы надо сказать какие куски кода куда складывать?

    При штатной работе из Flash, самом собой, стартовый код и будет инициализировать SDRAM. Обратите внимание, чтобы SystemInit() вызывался раньше кода инициализации данных - в нём и включите SDRAM. При отладке перед загрузкой данных в SDRAM отладчик может/должен сделать это сам. Тут есть два пути - написать простенький загрузчик, на подобии того как это делается для QSPI, либо скриптами отладчика. Смотря что для вас проще. А куда что складывать делается через линкерскрипт - он для этого и нужен. Добавляете в него регионы памяти, прописываете какие секции в них размещать. Тут, на самом деле, творческий подход нужен, потому что очень многое зависит от задачи, которую вы решаете. В стартапе всё и разложите по местам согласно таблицами инициализации, которые линкер создаст. Рекомендую стартап на C сразу найти/взять, так будет сильно проще. Для нестандартных конфигураций его править надо будет по любому. Ну и разобраться, в конце концов, придётся - это вам не Cortex-M0.

  5. 2 часа назад, eu1cc сказал:

    Поменял в STM32F750N8HX_FLASH.ld

    1. Это неправильный подход. Посмотрите приложенный скрипт.

    2. Ещё не забудьте в стартапе по Reset_Handler загрузить правильное значение указателя стека. Не все отладчики делают это автоматически. На С это как-то так выглядит. Если у вас стартап на асме (что скорее всего), то поколдуйте.

      void Reset_Handler()
      {
    #ifdef __DEBUG_SRAM__
        __set_MSP((uint32_t)&_estack);
    #endif
    
        SystemInit();
        
        

    3. При отладке из SRAM с тем линкерскриптом, что я приложил, можно/нужно пропустить код копирования инициализированного сегмента данных, он же и так уже в RAM слинкован и загружен. У меня как-то так. В своём стартапе найдите код делающий то же самое.

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

    4. Обязательно проверьте какое значение у вас в  SCB->VTOR загружается. Прежде чем разрешить какие-нибудь прерывания где-нибудь в SystemInit() надо делать что-то типа

    extern void(*__vector_table[])();
    SCB->VTOR = (uint32_t)&__vector_table;

     

    5. Проверьте, чтобы в стартапе таблица векторов прерываний размещалась в той же секции, что указана в линкерскрипте. Сталкивался, что где-то в CMSIS она .isr_vector, где-то просто .vectors - лучше сразу проверить, а не ловить "интересности".

     

    6. Если будете загружать код для отладки в SDRAM, то внимательно прочитайте сообщение jcxz про инициализацию SDRAM перед загрузкой кода.

     

    STM32F750N8_sram.lds

  6. Память бывает разная. Где-то можно код выполнять, где-то нельзя. К одной есть доступ DMA, к другой нет. Одна кешируется, другая нет. Соответственно её и использовать можно по разному. В одной стек лучше разместить, в другой ethernet-пакеты гонять, в третьей прерывания выполнять. Это же Cortex-M7, он чутка посложнее AVR-ки по архитектуре. Курите RM и Cortex-M7 programming manual. Его с наскоку не возьмёшь.

     

    PS: Как там переход на машкоды идёт? :)))

  7. Кстати, название контроллер тайна? А то ведь обычный H750 и двуядерный H745 это две большие разницы. Я может и рассказал бы, какие блоки SRAM у него выключены при включении питания, но продолжайте шифроваться.

×
×
  • Создать...