-
Постов
1 240 -
Зарегистрирован
-
Посещение
-
Победитель дней
9
Сообщения, опубликованные VladislavS
-
-
А зачем таблицу векторов копировать? Если векторов немного, то проще их устанавливать.
#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);
-
В моём магазине столько попкорна не будет! :)
-
8 часов назад, Rivas сказал:
Я всегда думал, что это , open sourse, компилятор - gcc arm-none-eabi.
Разницу между arm-arm--none-eabi и gcc-arm-none-eabi не наблюдаем?
6 часов назад, Rivas сказал:7TDMI попроще МК, может с него и надо было начинать
Избаловали народ кортексами. Раньше берёшь в руки ARM, даташит на него и первым делом flashloader на внешнюю флэшку пишешь. Сейчас уже большинство и не знает что это такое. Да что далеко холить, скрипт линкера поправить уже целая трагедия. А стартап изменить вообще табу даже для некоторых "профессионалов" стало.
-
1 час назад, Rivas сказал:
arm-arm-none-eabi можно прикрутить к Keil?
Не понял вопроса. Это для компилятора ARM v6 параметры. Он встроен в keil и в последних версиях даже по умолчанию включается.
-
#! 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;
-
Ну раз не пользуетесь, то размещение, которое keil делает по умолчанию, использовать и не выпендриваться.
-
Вообще, организация памяти у этого чипа несколько сложнее. Цитата с сайта производителя
Цитата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
По хорошему, все эти типы памяти надо описать и использовать по назначению.
-
В линкерскрипте есть запись ENTRY(Reset_Handler). Отладчик по ней запускает код. Не важно с какого адреса он расположен. А вот при включении питания загрузчик, расположенный по адресу 0x08000000, должен передать управление куда надо.
-
1 час назад, Rivas сказал:
То есть, это можно сделать, только поправив scatter файл?
Распределение памяти - работа линкера. скатерфайл задаёт правила согласно которым линкер это делает.
-
3 часа назад, ViKo сказал:
Я предпочитаю C++, если после него получится библиотека, которую можно включить в проект на любом языке. Это возможно?
Смотря как написано. Если это библиотека шаблонных классов, то она существует в виде заголовочных файлов. Там нечего инстанцировать в .lib
-
11 часов назад, alexhi сказал:
протоколу UDP шлет пакеты по 100 байт. Чем на стороне PC можно посмотреть какая реально получается скорость передачи байт в секунду?
Программа, которая примет эти пакеты на стороне PC и посчитает их количество в единицу времени что-то около 10 строк будет.
-
2 часа назад, kkmspb сказал:
Но далее не дожидаясь ответа от девайса хост продолжает слать другие команды.
Когда ты принимаешь команды/данные из конечной точки, то ставишь статус RX_VALID. Тем самым говоришь хосту - я готов принимать ещё. Вот он и шлёт. Если задержишь выставление RX_VALID, то точка будет "на паузе".
-
4 часа назад, 1234Alex сказал:
Там и кода как такого-то нет.
На нет и суда нет.
4 часа назад, 1234Alex сказал:А ник - да, не причём.
Вместе с тем, диагностику проблемы именно по нему предлагается прооводить.
-
В вашем нике проблем не вижу, наиболее вероятно она в коде.
-
1 час назад, Alex_7211 сказал:
Работает как переменная и ладно.
Flash как переменная? Барин знает толк в извращениях...
-
1 час назад, Alex_7211 сказал:
Отгородил себе флэш для энергонезависимых настроек:
uint16_t ID[256] __attribute__((at(0x00007E00))) = {0, 1, 0x05E0};
А const где?
-
34 минуты назад, poweroff сказал:
GPIOC->CRH |= 0x00000033;
И что это изменило? При включении питания было состояние 4. 4 |= 3 получаются те же 7. Open Drain.
38 минут назад, poweroff сказал:Вот бинарник который получается,
3 кB код зажигания светодиода? Вы серьёзно? Я же кидал проект. 500 байт бинарник, из которых 256 таблица векторов прерываний.
43 минуты назад, poweroff сказал:вначале и в конце почему то пустой
В начале всё в порядке, там таблица вектров прерываний.
-
У вас же LWIP на борту будет. Вот по нему и ищите примеры. Распространённая штука. Ну и как бы устройство TCP/IP само собой от зубов должно отлетать.
-
18 часов назад, poweroff сказал:
GPIOC->CRH |= 0x00000077;
GPIOC->ODR = 0x00000300;
Даже когда скомпилится диоды не загорятся. В режиме порта Open Drain выход в 1 установлен. Как это может зажечь что-то?
Гляньте приложенный проект. Там ключи компилятора подобраны чтобы по максимуму отключить всё ненужное библиотечное и на CMSIS кодить. make должен на win и linux собрать.
Ну и диоды ваши, скорее всего, замигают. Бонусом это же и в Keil с Iar соберётся.
-
А равенство остальных составляющих соблюдено? Как то частоты, расположение кода/данных/стека в памяти, латентность флэшь, кэши?
Кстати, попробуйте ARMCC v6, он может приятно удивить.
-
-
У меня на чипах с OTG не заводится без VBUS. Точнее, встроенный pullup не включается. Возможно, с внешним и заведётся, но я не пробовал.
-
Они просто не успели доки с компилятора V5 на компилятор V6 переделать. Там много такого у них в доках.
-
11 минут назад, one_eight_seven сказал:
Греп по установке не показывает заголовочник, где это определено?
Угу, показал :)))). Вот оно, суперопределение!
c:\Keil_v5\UV4\armcc_intr.h #define __packed
Разместил таблицу векторов и код обработчика в ОЗУ, при прерывании вылетает в HardFault
в STM
Опубликовано · Пожаловаться
И даже ещё меньше. Только stack pointer и reset - 8 байт. Остальные вектора в ОЗУ, раз уж таблица туда переехала.