Сообщения без ответов | Активные темы
| ПРЯМО СЕЙЧАС: |
| Автор | Сообщение |
|---|---|
|
|
Заголовок сообщения: IAR. Непонятки с target
|
|
Встал на лапы
Карма: 2 Рейтинг сообщения: 0
|
Попробовал написать (точнее, скопировать с интырнета) первую программку для стм32. Цитата: Fatal Error[Pe035]: #error directive: «Please select first the target STM32F10x device used in your application (in stm32f10x.h file)» C:Program FilesIAR SystemsEmbedded Workbench 7.3arminccstm32f10x.h 96 Я весь IAR перерыл сверху донизу, чтоб настроить этот «target», но ничего не нашел. И не нашел и где можно вообще указать микроконтроллер. |
| Вернуться наверх |
Профиль
|
| Реклама | |
|
|
|
|
a5021 |
Заголовок сообщения: Re: IAR. Непонятки с target
|
|
Карма: 20 Рейтинг сообщения: 0
|
Там же ангийским языком написано: в фале stm32f10x.h близ 96 строки. |
| Вернуться наверх | |
| Реклама | |
|
|
|
|
Myp3ik |
Заголовок сообщения: Re: IAR. Непонятки с target
|
||
Карма: 6 Рейтинг сообщения: 0
|
В настройках задефайни свой контроллер, или вручную Код: #define STM32F10X_MD … или какой там у вас…. |
||
| Вернуться наверх | |||
|
dosikus |
Заголовок сообщения: Re: IAR. Непонятки с target
|
||
Карма: 30 Рейтинг сообщения: 0
|
Я весь IAR перерыл сверху донизу, чтоб настроить этот «target», но ничего не нашел. И не нашел и где можно вообще указать микроконтроллер. Вы что нибудь о создании проекта в IAR слышали? Или руководствуетесь опусами кухарок? |
||
| Вернуться наверх | |||
| Реклама | |
|
Выгодные LED-драйверы для решения любых задач КОМПЭЛ представляет со склада и под заказ широкий выбор LED-драйверов производства MEAN WELL, MOSO, Snappy, Inventronics, EagleRise. Линейки LED-драйверов этих компаний, выполненные по технологии Tunable White и имеющие возможность непосредственного встраивания в систему умного дома (димминг по шине KNX), перекрывают практически полный спектр применений: от простых световых указателей и декоративной подсветки до диммируемых по различным протоколам светильников внутреннего и наружного освещения. Подобрать LED-драйвер>> |
Кто сейчас на форуме |
|
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 11 |
| Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения |
У меня при компиляции проекта, содержавшего смешанный код (ассемблер и C — это был проект с использованием библиотеки V-USB. Ассемблер был нужен для кода, критичного к времени выполнения), происходила следующая ошибка:
Error[e18]: Range error,
PC offset out of range. Valid range is -4096 (-0x1000) to 4094 (0x0FFE).
File: C:asmAVR910-protossusbdrvusbdrvasm.S, Line: 54
Source: rjmp USB_INTR_VECTOR
Where $ = __ATmega128__ + 0x4 [0x4]
in module «usbdrvasm» (c:asmAVR910-protossDebugObjusbdrvasm.r90),
offset 0x4 in segment part 0, segment INTVEC
What: (usbCrc16 + 0x32) — ($ + 2) [0x1182]
Allowed range: 0xFFFFF000 — 0xFFF
Operand: usbCrc16Append [0x1188]
in module usbdrvasm (c:asmAVR910-protossDebugObjusbdrvasm.r90),
Offset 0x32 in segment part 1, segment CODE
Проблема была в том, что команда rjmp USB_INTR_VECTOR в таблице векторов прерываний не доставала до нужной её метки (адрес метки был слишком большой для перехода по rjmp).
Метода устранения ошибки два:
a) Заменить команду rjmp на команду jmp — у неё нет тех ограничений, по дальности перехода, как у rjmp, но выполняется jmp на 1 такт дольше. В моем случае это нежелательно — код критичен к времени выполнения прерывания.
b) Поместить код, который находится по метке USB_INTR_VECTOR, ближе к началу памяти, чтобы достала команда rjmp.
Второй способ можно реализовать, добавив перед кодом с меткой, куда прыгает rjmp, директиву назначения сегмента, который размещается линкером ближе к началу памяти, чем сегмент CODE. Порядок сегментов, которого линкер по умолчанию придерживается, следующий (подсмотрел в листинге *.map):
-Z(CODE)INTVEC=0-(_..X_INTVEC_SIZE-1)
-Z(CODE)TINY_F=_..X_FLASH_BASE-FF
-Z(CODE)NEAR_F=_..X_FLASH_BASE-_..X_FLASH_NEND
-Z(CODE)SWITCH=_..X_FLASH_BASE-_..X_FLASH_NEND
-Z(CODE)DIFUNCT=_..X_FLASH_BASE-_..X_FLASH_NEND
-Z(CODE)CODE=_..X_FLASH_BASE-_..X_FLASH_END
-Z(CODE)FAR_F=[_..X_FLASH_BASE-_..X_FLASH_END]/10000
-Z(CODE)INITTAB=_..X_FLASH_BASE-_..X_FLASH_END
-Z(CODE)HUGE_F=_..X_FLASH_BASE-_..X_FLASH_END
-Z(CODE)TINY_ID=_..X_FLASH_BASE-_..X_FLASH_END
-Z(CODE)NEAR_ID=_..X_FLASH_BASE-_..X_FLASH_END
-Z(CODE)CHECKSUM#_..X_FLASH_END
Самый лучший кандидат на нужный сегмент для размещения кода по метке USB_INTR_VECTOR — сегмент NEAR_F. Ошибка пропала, когда я размести перед этим кодом директиву RSEG NEAR_F, вот так (метка USB_INTR_VECTOR как раз та, которая стоит в команде rjmp):
RSEG NEAR_F USB_INTR_VECTOR:
;order of registers pushed: YL, SREG [sofError], YH, shift, x1, x2, x3, cnt push YL ;2 [35] push only what is necessary to sync with edge ASAP in YL, SREG ;1 [37] push YL ;2 [39] ..
Я сохранил прошивку STM в C:/, а в IAR я перехожу к параметрам -> Препроцессор -> выберите папку и выбираю C:STM32Cube_FW_F4_V1.27.0DriversCMSISInclude, и я получаю эту ошибку:
Fatal Error[Pe035]: #error directive: "Please select first the target STM32F4xx device used in your application (in stm32f4xx.h file)"
< Сильный > main.c
#include "stm32f4xx.h"
int main()
{
return 0;
}
Как мне решить эту ошибку?
2 ответа
Сообщение об ошибке в значительной степени говорит, что вы должны сделать: укажите целевое устройство STM32F4xx, прежде чем включать файл stm32f4xx.h. Я объясню, почему и как.
Почему: Как следует из названия, это общий заголовочный файл для всего семейства STM32F4. Однако устройства в этом семействе имеют (незначительные) различия, поэтому для каждого конкретного целевого устройства могут быть включены другие элементы. Это обрабатывается с помощью определения. Вы можете увидеть это в источник. В зависимости от определенной цели также включается соответствующий заголовочный файл для этой конкретной цели.
Как: Поскольку stm32f4discovery использует устройство STM32F407, вы должны определить STM32F407xx. (Если вы используете другой микроконтроллер, используйте другое определение. Доступные/поддерживаемые параметры см. в источнике.) Вы можете сделать это двумя разными способами.
Способ 1: определите макрос препроцессора перед оператором включения.
#define STM32F407xx
#include <stm32f4xx.h>
...
Способ 2 (рекомендуется): добавьте определение в настройки набора инструментов, чтобы параметр -DSTM32F407xx был добавлен в параметры компилятора.
Примечание. НЕ редактируйте файл stm32f4xx.h, так как это (обычно) общесистемный файл библиотеки. Он является общим для всех проектов, поэтому, если вы также захотите скомпилировать что-то для другого устройства STM32F4, у вас возникнут проблемы. Кроме того, при обновлении библиотеки вы потеряете свои изменения и вернется исходная ошибка.
2
wovano
26 Июн 2022 в 23:23
Как говорится в ошибке, «сначала выберите целевое устройство STM32F4xx, используемое в вашем приложении (в файле stm32f4xx.h)».
Откройте stm32f4xx.h, там вы найдете закомментированные имена различных микроконтроллеров. Раскомментируйте «#define STM32F469» (или что там у вас MCU), сохраните файл. Сделанный. Он подключит все файлы, характерные для вашего MCU.
-2
Ilya
21 Июн 2022 в 19:15





