а ваша - extern "C"? void TIM2_IRQHandler(void) везде, хотя первый вариант указан в подключаемых стандартных библиотеках, в чем шутка юмора?
В стартапе и инициализационном коде С-ной библиотеки все функции поименованы по стандарту Си. Стартап вообще частенько на асме писан, там всё так же. А проект IAR создаёт с настройками компилятора по умолчанию на С++. А в С++ после компиляции функции меняют свои имена. К ним добавляется тип аргумента, чтобы механизм перегрузки работал. Можно написать стартап на плюсах, но тогда из Си-шного кода без бубна не обойтись. В принципе даже удобно - сразу видно в коде что это прерывание по extern "C".
В самом конце две строки я так понимаю записи в FSMC, на них ругается иар, говорит Error[Li005]: no definition for "FSMC_NORSRAMInit" Error[Li005]: no definition for "FSMC_NORSRAMCmd" Кто то знает от чего так может быть?
Попробуй найти в своём проекте объявление/определение функций FSMC_NORSRAMInit() и FSMC_NORSRAMCmd(). Вот и компилятор не может.
Я конечно понимаю, что хочется всего и сразу. Но, надо идти от простого к сложному. И "на регистрах" программируют для того чтобы код был эффективным и понятным. А пока что, извини, но это говнокод. Спойлер
Не говоря уже о том, что при включении питания там и так нули и этот код в принципе не нужен. И открой для себя регистр GPIOx->BSRR для "дрыгания ногами".
Добавлено after 2 hours 50 minutes: 2ALL: Если абстрагироваться от того что состояние OTYPER при включении известно и в подавляющем большинстве случаев туда можно просто константу записать один раз и навсегда. Допустим, стартанули мы из какого-то "недоверенного" загрузчика и надо все эти биты сбросить для надёжности. Как-то так
Вот спасибо! Дело в том что я не в курсе как канонично должен выглядеть код в данном случае, вариантов много, но Ваш вариант и взаправду удобнее, буду пользоваться им. По крайней мере, где перечисляются порты, с асмом я пока не дружу, хотя честно пытался несколько раз. Функции FSMC_NORSRAMInit() и FSMC_NORSRAMCmd() объявлены в подключенном файле stm32f4xx_fsmc.h, и компилятор по команде Go to Definition of '' исправно туда прыгает, а все равно кидает ошибку
Функции FSMC_NORSRAMInit() и FSMC_NORSRAMCmd() объявлены в подключенном файле stm32f4xx_fsmc.h, и компилятор по команде Go to Definition of '' исправно туда прыгает, а все равно кидает ошибку
Объявлены это замечательно. А тело функций где определено? Наверное в каком-то неподключенном в проект stm32f4xx_fsmc.с?
А это равнозначные инструкции, т.е. на асме 5 строк настраивают весь порт Д?
Это вместо 11 операций чтения-модификации-записи регистра GPIOD->OTYPER я написал всего одну, делающую то же самое. Оптимизировал твой код на порядок. С остальными регистрами надо сделать то же самое.
Вы знаете я находил как причину ошибки на форуме отсутствие именно этого файла, но подумал, что это опечатка, потому что интернет не знает о нем, только о .h, где вообще можно взять все стандартные библиотеки? В архиве с примерами от стм их нет(
где вообще можно взять все стандартные библиотеки?
Сгенерить кубом проект под свой микроконтроллер - они их все в проект скопирует. Но у вас ещё есть шанс не ступить на этот скользкий путь. Без них можно жить, надо только не лениться RM читать. Та же конфигурация FSMC это запись двух регистров вместо той безумной портянки. Это по коду проще чем GPIO настроить, надо лишь почитать внимательно.
Добавлено after 2 hours 22 minutes 17 seconds: Короче пытаюсь выдрать весь код дисплея из примера в один заглавный лист, упразднив бесконечные переименования и дефайны. Нашел очень неприятный момент. Я переменные свои переименовываю и подменяю ими стоковые, чтобы в любой момент можно было что то проверить в стоке примера, но при этом избежать дублирования. Есть такой код
Потом вот эта фигня, так как все из разных файлов.
Код:
LCD_DrvTypeDef1 ST007_drv;
LCD_DrvTypeDef1 *LcdDrv1;
LCD_DrvTypeDef1 ST007_drv = { ST007_Init, //тактирование, настройка фсмс и дисплея ST007_ReadID,// Еще раз? ST007_DisplayOn,//rab i bez onogo ST007_DisplayOff,//rab i bez onogo ST007_SetCursor,//nad ST007_WritePixel,//nad ST007_ReadPixel,//rab i bez onogo ST007_SetDisplayWindow,//rab i bez onogo ST007_DrawHLine,//nad ST007_DrawVLine,//nad ST007_GetLcdPixelWidth, ST007_GetLcdPixelHeight, ST007_DrawBitmap, ST007_DrawRGBImage, };
И запись
Код:
LcdDrv1 = &ST007_drv; LcdDrv1->Init();
Я головой то понимаю что это масло масленое, но все мои потуги по сокращению приводят к ошибке, отложил бы пока, так эта мерзавка не работает. Хотя все структуры ST007_ я тоже принес и переименовал. Десять раз все пролез, ни чего из структур не ссылается ни куда, ошибок нет, но и не работает. Дисплей запускается со старым содержимым застывшим, по умолчанию там простенькая анимация чтобы понимать работает или нет. Мне кажется тут что то не так
Даже мысли не было такими страшными вещами пользоваться) Если верить примерам из интернета по использованию FSMC + дисплей. Надо настроить порты Настроить FSMC Передать морзянку инициации дисплею И должно произойти чудо.
Инициализацию портов я проверил по рабочему примеру, подменив на свою. FSMC тоже подменял, на разные варианты, там вообще чтобы что то сломать надо ее удалить целиком. Морзянку я с примера слизал. А чуда нет =(
Добавлено after 34 minutes 53 seconds: Есть там стремная строчка, без нее оригинал не работает, но она абсурдна если проследить переменные. Там через халовские доки дефанйнами расходятся с сходятся в один файл 4 переменные.
Отсутствие сна сказывается( Спасибо большое! Попробую вникнуть в книгу)
Добавлено after 4 minutes 32 seconds: Все равно ругается( Говорит Error[Pe137]: expression must be a modifiable lvalue FSMC_Bank1->BTCR = FSMC_Bank1; FSMC_Bank1E->BWTR = FSMC_Bank1E;
Ну просто уж очень много неопределённости получается когда не знаешь ни языка, ни железа. Так можно долго биться об стену.
А по поводу инициализации дисплея. Надо взять логический анализатор. Проверить диаграмму выполнения простейших команд записи/чтения на шине. То что код скомпилировался ещё не означает, что он работает как задумано. А уж затем инициализационные последовательности в него пихать.
Как к её полю можно обратиться? Мне думается как-то так?
Код:
FSMC_Bank1->BTCR[x] = y;
Добавлено after 22 minutes 58 seconds: СпойлерРади хохмы. Я когда впервые столкнулся с FSMC честно попытался по RM все параметры написать. Но диаграмма хоть ты тресни не получалась и всё тут. Подключил ЛА, запустил отладчик и начал "на живую" менять поля регистров FSMC, благо их всего два, пока не получил требуемую диаграмму. Записал значения регистров в код. До сих пор эти две строчки в проекте для напоминания как писать не надо жирно светятся
Код:
//Инициализация FMC для доступа к регистрам CPLD FMC_Bank1->BCR1 = 0x1091; FMC_Bank1->BTR1 = 0x0FFF01F2;
Там регистры в FSMC в адовом количестве и мягко говоря не очень однозначные все( Можно как то посмотреть в режиме отладки какие регистры записываются из примера?
Добавлено after 8 minutes 25 seconds: Вроде нашел, но он показывает BCR BTR и прочие все забитыми 0xFFFFFFFFFFFF/ Разве может так быть или это глюк?
Там регистры в FSMC в адовом количестве и мягко говоря не очень однозначные все(
Если просто проверить, то FSMC инитится одной строкой(FSMC_Bank1->BTCR[bank * 2] = ...), не считая настройки портов. И еще в двух регистрах тайминги которые по умолчанию выставлены на максимум, потому там и 0x0FFFFFFF...
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 16
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения