реклама на сайте
подробности

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> STM32 Использование стандартной библиотеки, Не узнает имя регистров
BlackOps
сообщение Jan 27 2012, 08:07
Сообщение #1


Знающий
****

Группа: Свой
Сообщений: 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 есть корректное описание данного порта, и в основную программу этот файл включен.

когда компилю без этой строчки, то проект собирается нормально и создается исполняемый файл.

что может быть не так?


--------------------
Нажми на кнопку - получишь результат, и твоя мечта осуществится
Go to the top of the page
 
+Quote Post
adnega
сообщение Jan 27 2012, 08:40
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 2 724
Регистрация: 14-05-07
Из: Ярославль, Россия
Пользователь №: 27 702



А как компиллятор узнает ядро?
Ключики -mcpu=cortex-m3 -mthumb присутствуют?
Go to the top of the page
 
+Quote Post
_Ivan_33
сообщение Jan 27 2012, 08:43
Сообщение #3


fpga designer
****

Группа: Свой
Сообщений: 613
Регистрация: 20-04-08
Из: Зеленоград
Пользователь №: 36 928



http://h0rr0rr-drag0n.blogspot.com/2011/08...inux-linux.html


--------------------
Go to the top of the page
 
+Quote Post
BlackOps
сообщение Jan 27 2012, 15:18
Сообщение #4


Знающий
****

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



Цитата(adnega @ Jan 27 2012, 13:40) *
А как компиллятор узнает ядро?
Ключики -mcpu=cortex-m3 -mthumb присутствуют?

да. эта линия прописана в настройках. без линии: GPIOA->CRL = 0x0; все компилится нормально


--------------------
Нажми на кнопку - получишь результат, и твоя мечта осуществится
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Jan 28 2012, 06:34
Сообщение #5


фанат дивана
******

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



Добавьте в начале файла строчку
#include "stm32f10x.h"


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
BlackOps
сообщение Jan 30 2012, 01:07
Сообщение #6


Знающий
****

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



Цитата(AHTOXA @ Jan 28 2012, 11:34) *
Добавьте в начале файла строчку
#include "stm32f10x.h"

не помогло. убрал #include <stdio.h> тоже. т.к. это не нужно.

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

просто сам факт того что файл заголовка с декларацией порта включен а компилер его не хочет принимать непонятен!

что еще может быть упущено?


--------------------
Нажми на кнопку - получишь результат, и твоя мечта осуществится
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Jan 30 2012, 05:39
Сообщение #7


фанат дивана
******

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



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


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
BlackOps
сообщение Jan 30 2012, 09:13
Сообщение #8


Знающий
****

Группа: Свой
Сообщений: 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


А может всетаки дело связано как-то с линкером?


--------------------
Нажми на кнопку - получишь результат, и твоя мечта осуществится
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Jan 30 2012, 09:29
Сообщение #9


фанат дивана
******

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



Может там ещё что-то компилятор выдаёт, до этой строчки.
Вы переключитесь внизу на вкладку "Console", и посмотрите, что там пишется. Попробуйте ещё поместить файл stm32f10x.h в тот же каталог, где находится ваша программа.
Кстати, если мне не изменяет память, для корректной работы stm32f10x.h нужно определить тип используемого процессора, что-то типа
#define STM32F10X_HD


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
редактор
сообщение Jan 30 2012, 12:30
Сообщение #10


Местный
***

Группа: Участник
Сообщений: 356
Регистрация: 9-06-07
Пользователь №: 28 315



Возможно компилятор не понимает обращение -> (через стрелку), поскольку файл main.c (сишный без плюсов), и такой штуки в стандарте нет.
Изменить расширение файла на cpp или попробовать (*PORTA).CRL = 0; // как то так


--------------------
Хорошую систему делают из стандартных блоков нестандартно мыслящие инженеры.
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Jan 30 2012, 12:49
Сообщение #11


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(редактор @ Jan 30 2012, 16:30) *
Возможно компилятор не понимает обращение -> (через стрелку), поскольку файл main.c (сишный без плюсов), и такой штуки в стандарте нет.

"Такая штука" есть.

А ругается он на __IO, надо полагать.
Go to the top of the page
 
+Quote Post
BlackOps
сообщение Jan 31 2012, 02:13
Сообщение #12


Знающий
****

Группа: Свой
Сообщений: 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

это сделано, без этого он бы другую ошибку выдал. с этим проблем нет.


--------------------
Нажми на кнопку - получишь результат, и твоя мечта осуществится
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Jan 31 2012, 02:36
Сообщение #13


фанат дивана
******

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



Цитата(BlackOps @ Jan 31 2012, 08:13) *
**** 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

Так у вас всё в порядке, ошибок-то -- нет sm.gif


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
BlackOps
сообщение Jan 31 2012, 07:06
Сообщение #14


Знающий
****

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



Цитата(AHTOXA @ Jan 31 2012, 06:36) *
Так у вас всё в порядке, ошибок-то -- нет sm.gif

как же нет когда он в другой вкладке выдает:
Type 'GPIOA' could not be resolved main.c /armtest1 line 11 Semantic Error

?

Или...это не ошибка компилера? А может сама среда не может разобратся в этом объявлении?

И кстати, когда я вписываю GPIOA в окне редактора, и ставлю ->, то он дальше сам мне предлагает какие регистры выбирать! т.е. сама среда разработки видит и знает об этих объявлениях!

ну тогда зачем такая ошибка светится!?


--------------------
Нажми на кнопку - получишь результат, и твоя мечта осуществится
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jan 31 2012, 07:14
Сообщение #15


Гуру
******

Группа: Модераторы
Сообщений: 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)
Go to the top of the page
 
+Quote Post

2 страниц V   1 2 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 18th July 2025 - 12:54
Рейтинг@Mail.ru


Страница сгенерированна за 0.015 секунд с 7
ELECTRONIX ©2004-2016