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

VladislavS

Свой
  • Постов

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

  • Посещение

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

    9

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


  1. 18 минут назад, MasterElectric сказал:

    короткая таблица это только системные прерывания. т

    И даже ещё меньше. Только stack pointer и reset - 8 байт. Остальные вектора в ОЗУ, раз уж таблица туда переехала. 

  2. А зачем таблицу векторов копировать? Если векторов немного,  то проще их устанавливать.

    #define VTABLE_ADR 0x2000'0000
    
    #define InstallIRQ(name)  void name##Handler(); \
    *(volatile uint32_t *)(VTABLE_ADR + 0x40 + name##n * 4) = (uint32_t)name##Handler
    
    SCB->VTOR = VTABLE_ADR;
              
    InstallIRQ(USB_LP_CAN1_RX0_IRQ);

     

     

  3. 8 часов назад, Rivas сказал:

    Я всегда думал, что это , open sourse, компилятор - gcc arm-none-eabi.

    Разницу между arm-arm--none-eabi  и gcc-arm-none-eabi не наблюдаем?

    6 часов назад, Rivas сказал:

    7TDMI попроще МК, может с него и надо было начинать

    Избаловали народ кортексами. Раньше берёшь в руки ARM, даташит на него и первым делом flashloader на внешнюю флэшку пишешь. Сейчас уже большинство и не знает что это такое. Да что далеко холить, скрипт линкера поправить уже целая трагедия. А стартап изменить вообще табу даже для некоторых "профессионалов" стало. 

  4.  

    #! armclang -E --target=arm-arm-none-eabi -mcpu=cortex-m4 -xc
    
    #define __ROM_BASE     0x08000000
    #define __ROM_SIZE     (1024*256)
    
    #define __RAM_BASE     0x20000000
    #define __RAM_SIZE     (1024*40)
    
    #define __STACK_SIZE       1024
    #define __HEAP_SIZE        0
    
    #define __STACK_TOP    (__RAM_BASE + __RAM_SIZE) /* Stack starts at end of RAM */
    #define __HEAP_BASE    (AlignExpr(+0, 8))        /* Heap starts after RW_RAM section, 8 byte aligned */
    
    #define __RW_SIZE        (__RAM_SIZE - __STACK_SIZE - __HEAP_SIZE)
    
    LR_FLASH __ROM_BASE __ROM_SIZE       ; load region size_region
    {    
      ER_IROM1 __ROM_BASE __ROM_SIZE     ; load address = execution address
      {  
       *.o (RESET, +First)
       *(InRoot$$Sections)
       .ANY (+RO)
       .ANY (+XO)
      }
    
      RW_IRAM1 __RAM_BASE __RW_SIZE      ; RW data
      {  
       .ANY (+RW +ZI)
      }
    
    #if __HEAP_SIZE > 0
      ARM_LIB_HEAP  __HEAP_BASE EMPTY  __HEAP_SIZE  {   ; Reserve empty region for heap
      }
    #endif
    
      ARM_LIB_STACK __STACK_TOP EMPTY -__STACK_SIZE {}  ; Reserve empty region for stack
    }

    В стартапе выкидываем определение стека и кучи. Адрес стека для таблицы векторов прерываний берём так

      #define __STACK_TOP (void *)&Image$$ARM_LIB_STACK$$ZI$$Limit
      extern int Image$$ARM_LIB_STACK$$ZI$$Limit;

     

  5. Вообще, организация памяти у этого чипа несколько сложнее. Цитата с сайта производителя

    Цитата

    Up to 1 Mbyte of RAM: 192 Kbytes of TCM RAM (inc. 64 Kbytes of ITCM RAM + 128 Kbytes of DTCM RAM for time critical routines), Up to 864 Kbytes of user SRAM, and 4 Kbytes of SRAM in Backup domain

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

  6. В линкерскрипте есть запись ENTRY(Reset_Handler). Отладчик по ней запускает код. Не важно с какого адреса он расположен. А вот при включении питания загрузчик, расположенный по адресу 0x08000000, должен передать управление куда надо.

  7. 3 часа назад, ViKo сказал:

    Я предпочитаю C++, если после него получится библиотека, которую можно включить в проект на любом языке. Это возможно? 

    Смотря как написано. Если это библиотека шаблонных классов, то она существует в виде заголовочных файлов. Там нечего инстанцировать  в .lib

  8. 11 часов назад, alexhi сказал:

    протоколу UDP шлет пакеты по 100 байт. Чем на стороне PC можно  посмотреть  какая  реально получается скорость передачи байт  в секунду? 

    Программа, которая примет эти пакеты на стороне PC и посчитает их количество в единицу времени что-то около 10 строк будет.

  9. 2 часа назад, kkmspb сказал:

    Но далее не дожидаясь ответа от девайса хост продолжает слать другие команды.

    Когда ты принимаешь команды/данные из конечной точки, то ставишь статус RX_VALID. Тем самым говоришь хосту - я готов принимать ещё. Вот он и шлёт. Если задержишь выставление RX_VALID, то точка будет "на паузе".

  10. 4 часа назад, 1234Alex сказал:

    Там и кода как такого-то нет.

    На нет и суда нет.

     

    4 часа назад, 1234Alex сказал:

    А ник - да, не причём.

    Вместе с тем, диагностику проблемы именно по нему предлагается прооводить.

  11. 34 минуты назад, poweroff сказал:

    GPIOC->CRH |= 0x00000033;

    И что это изменило? При включении питания было состояние 4. 4 |= 3 получаются те же 7. Open Drain.

     

    38 минут назад, poweroff сказал:

    Вот бинарник который получается,

    3 кB код зажигания светодиода? Вы серьёзно? Я же кидал проект. 500 байт бинарник, из которых 256 таблица векторов прерываний.

    43 минуты назад, poweroff сказал:

    вначале и в конце почему то пустой

    В начале всё в порядке, там таблица вектров прерываний.

  12. 18 часов назад, poweroff сказал:

    GPIOC->CRH |= 0x00000077;

    GPIOC->ODR = 0x00000300;

    Даже когда скомпилится диоды не загорятся. В режиме порта Open Drain выход в 1 установлен. Как это может зажечь что-то?

     

    Гляньте приложенный проект. Там ключи компилятора подобраны чтобы по максимуму отключить всё ненужное библиотечное и на CMSIS кодить. make должен на win и linux собрать.

    Ну и диоды ваши, скорее всего, замигают. Бонусом это же и в Keil с Iar соберётся.

     

    STM32F100.ZIP

  13. 16 минут назад, 1113 сказал:

    детектирование этого сигнала происходит чисто программно

    Это не так.

    vbus.thumb.png.b469edb9d2efb402b2d12b9fc94af0fd.png

    Этот механизм, похоже, не отключается. Поэтому, либо подводите VBUS на PA9, либо заказывайте именной скальпель :)

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