|
STM32 Использование стандартной библиотеки, Не узнает имя регистров |
|
|
|
Jan 27 2012, 08:07
|

Знающий
   
Группа: Свой
Сообщений: 618
Регистрация: 7-06-08
Из: USSR
Пользователь №: 38 121

|
Использую под Линукс: Eclipse + GNU ARM PLUGIN + CodeSourcery LITE скачал с сайта ST следующие файлы, и включил их в проект: core_cm3.h startup_stm32f10x_hd.s stm32f10x.h system_stm32f10x.h и добавил еще вот такой линкер скрипт: Код MEMORY { sram (W!RX) : ORIGIN = 0x20000000, LENGTH = 64k flash (RX) : ORIGIN = 0x08000000, LENGTH = 512k }
SECTIONS { .text : { . = ALIGN(4); _text = .; PROVIDE(stext = .); KEEP(*(.isr_vector)) KEEP(*(.init)) *(.text .text.*) *(.rodata .rodata.*) *(.gnu.linkonce.t.*) *(.glue_7) *(.glue_7t) *(.gcc_except_table) *(.gnu.linkonce.r.*) . = ALIGN(4); _etext = .; _sidata = _etext; PROVIDE(etext = .); _fini = .; *(.fini)
} >flash
.data : AT (_etext) { . = ALIGN(4); _sdata = .; *(.ramfunc .ramfunc.* .fastrun .fastrun.*) *(.data .data.*) *(.gnu.linkonce.d.*) . = ALIGN(4); _edata = .; } >sram .ARM.extab : { *(.ARM.extab*) } >sram __exidx_start = .; .ARM.exidx : { *(.ARM.exidx*) } >sram __exidx_end = .; .bss (NOLOAD) : { . = ALIGN(4); /* This is used by the startup in order to initialize the .bss secion */ _sbss = .; *(.bss .bss.*) *(.gnu.linkonce.b.*) *(COMMON) . = ALIGN(4); _ebss = .; } >sram end = .; PROVIDE( _estack = 0x20010000 ); } вот простейшая программа где я хочу сконфигурировать порт А: Код #include <stdio.h> #include "stm32f10x.h"
int main () { // int i; // int n;
GPIOA->CRL = 0x0;
while(1); return 0; } почемуто он мне выдает: Type 'GPIOA' could not be resolved main.c /armtest1 line 11 Semantic Errorстранно, ведь в файле stm32f10x.h есть корректное описание данного порта, и в основную программу этот файл включен. когда компилю без этой строчки, то проект собирается нормально и создается исполняемый файл. что может быть не так?
--------------------
Нажми на кнопку - получишь результат, и твоя мечта осуществится
|
|
|
|
2 страниц
1 2 >
|
 |
Ответов
(1 - 15)
|
Jan 30 2012, 01:07
|

Знающий
   
Группа: Свой
Сообщений: 618
Регистрация: 7-06-08
Из: USSR
Пользователь №: 38 121

|
Цитата(AHTOXA @ Jan 28 2012, 11:34)  Добавьте в начале файла строчку #include "stm32f10x.h" не помогло. убрал #include <stdio.h> тоже. т.к. это не нужно. сейчас ковыряю разные ссылки с инструкциями... все пишут по разному, но то как у меня все установлено выглядит правильным и почти как в инструкциях. просто сам факт того что файл заголовка с декларацией порта включен а компилер его не хочет принимать непонятен! что еще может быть упущено?
--------------------
Нажми на кнопку - получишь результат, и твоя мечта осуществится
|
|
|
|
|
Jan 30 2012, 05:39
|

фанат дивана
     
Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684

|
Ну чудес-то не бывает  GPIOA описан в файле stm32f10x.h. Поэтому при выполнении двух условий: 1. Вы включили stm32f10x.h в свой Си-файл; 2. Компилятор нашёл файл stm32f10x.h. всё должно быть нормально. Как сейчас у вас ругается компилятор? Не пишет ли он случайно, что не нашёл stm32f10x.h?
--------------------
Если бы я знал, что такое электричество...
|
|
|
|
|
Jan 30 2012, 09:13
|

Знающий
   
Группа: Свой
Сообщений: 618
Регистрация: 7-06-08
Из: USSR
Пользователь №: 38 121

|
Цитата(AHTOXA @ Jan 30 2012, 10:39)  Как сейчас у вас ругается компилятор? Не пишет ли он случайно, что не нашёл stm32f10x.h? нет. вот моя ошибка которая внизу в окошке видна: Description Resource Path Location Type Type 'GPIOA' could not be resolved main.c /armtest1 line 13 Semantic Error А может всетаки дело связано как-то с линкером?
--------------------
Нажми на кнопку - получишь результат, и твоя мечта осуществится
|
|
|
|
|
Jan 31 2012, 02:13
|

Знающий
   
Группа: Свой
Сообщений: 618
Регистрация: 7-06-08
Из: USSR
Пользователь №: 38 121

|
Цитата(AHTOXA @ Jan 30 2012, 14:29)  Может там ещё что-то компилятор выдаёт, до этой строчки. Вы переключитесь внизу на вкладку "Console", и посмотрите, что там пишется. Вот распечатка из консоли: **** Build of configuration Debug for project armtest1 **** make all Invoking: ARM Sourcery Linux GNU Print Size arm-none-eabi-size --format=berkeley armtest1.elf text data bss dec hex filename 20 0 0 20 14 armtest1.elf Finished building: armtest1.siz **** Build Finished **** Цитата(AHTOXA @ Jan 30 2012, 14:29)  Попробуйте ещё поместить файл stm32f10x.h в тот же каталог, где находится ваша программа. так он в том же каталоге и находится, и в директории проекта где сама программа. Цитата(AHTOXA @ Jan 30 2012, 14:29)  Кстати, если мне не изменяет память, для корректной работы stm32f10x.h нужно определить тип используемого процессора, что-то типа #define STM32F10X_HD это сделано, без этого он бы другую ошибку выдал. с этим проблем нет.
--------------------
Нажми на кнопку - получишь результат, и твоя мечта осуществится
|
|
|
|
|
Jan 31 2012, 07:06
|

Знающий
   
Группа: Свой
Сообщений: 618
Регистрация: 7-06-08
Из: USSR
Пользователь №: 38 121

|
Цитата(AHTOXA @ Jan 31 2012, 06:36)  Так у вас всё в порядке, ошибок-то -- нет  как же нет когда он в другой вкладке выдает: Type 'GPIOA' could not be resolved main.c /armtest1 line 11 Semantic Error ? Или...это не ошибка компилера? А может сама среда не может разобратся в этом объявлении? И кстати, когда я вписываю GPIOA в окне редактора, и ставлю ->, то он дальше сам мне предлагает какие регистры выбирать! т.е. сама среда разработки видит и знает об этих объявлениях! ну тогда зачем такая ошибка светится!?
--------------------
Нажми на кнопку - получишь результат, и твоя мечта осуществится
|
|
|
|
|
Jan 31 2012, 07:14
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
Простите что влезаю, но в вашем скрипте ошибка. Обратите внимание на строки: CODE .data : AT (_etext) { и CODE _etext = .; _sidata = _etext; PROVIDE(etext = .); _fini = .; *(.fini) т.е. если в вашей программе что-то попадет в секцию .fini, то данные секции .data наложатся на это что-то. Я не знаю откуда пошла эта мода указывать начало секции через абсолютный адрес методом ".data : AT (_etext)", хотя можно более прямо и логично сказать "положи это в конец региона" CODE .data { ........... } >sram AT > flash _sidata = LOADADDR(.data); И данные всегда лягут куда надо вне зависимости что еще было напихано в регион флеша. По основному вопросу: согласен с AHTOXA, надо определить символ STM32F10X_HD или подобный исходя из типа вашего процессора. Удобнее всего это сделать в makefile, добавив CFLAGS+=DSTM32F10X_HD
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|