Перейти к содержанию
    

STM32 Использование стандартной библиотеки

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

 

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

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А как компиллятор узнает ядро?

Ключики -mcpu=cortex-m3 -mthumb присутствуют?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А как компиллятор узнает ядро?

Ключики -mcpu=cortex-m3 -mthumb присутствуют?

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Добавьте в начале файла строчку

#include "stm32f10x.h"

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

 

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

 

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

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ну чудес-то не бывает:)

GPIOA описан в файле stm32f10x.h. Поэтому при выполнении двух условий:

1. Вы включили stm32f10x.h в свой Си-файл;

2. Компилятор нашёл файл stm32f10x.h.

всё должно быть нормально.

Как сейчас у вас ругается компилятор? Не пишет ли он случайно, что не нашёл stm32f10x.h?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Как сейчас у вас ругается компилятор? Не пишет ли он случайно, что не нашёл stm32f10x.h?

нет. вот моя ошибка которая внизу в окошке видна:

Description Resource Path Location Type

Type 'GPIOA' could not be resolved main.c /armtest1 line 13 Semantic Error

 

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Может там ещё что-то компилятор выдаёт, до этой строчки.

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

Кстати, если мне не изменяет память, для корректной работы stm32f10x.h нужно определить тип используемого процессора, что-то типа

#define STM32F10X_HD

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Изменить расширение файла на cpp или попробовать (*PORTA).CRL = 0; // как то так

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

 

А ругается он на __IO, надо полагать.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Может там ещё что-то компилятор выдаёт, до этой строчки.

Вы переключитесь внизу на вкладку "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 ****

 

Попробуйте ещё поместить файл stm32f10x.h в тот же каталог, где находится ваша программа.

так он в том же каталоге и находится, и в директории проекта где сама программа.

 

Кстати, если мне не изменяет память, для корректной работы stm32f10x.h нужно определить тип используемого процессора, что-то типа

#define STM32F10X_HD

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

**** 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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

как же нет когда он в другой вкладке выдает:

Type 'GPIOA' could not be resolved main.c /armtest1 line 11 Semantic Error

 

?

 

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

 

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

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Простите что влезаю, но в вашем скрипте ошибка.

 

Обратите внимание на строки:

    .data : AT (_etext)
    {

и

        _etext = .;
        _sidata = _etext;
        PROVIDE(etext = .);   
             _fini = .;
                *(.fini)

т.е. если в вашей программе что-то попадет в секцию .fini, то данные секции .data наложатся на это что-то. Я не знаю откуда пошла эта мода указывать начало секции через абсолютный адрес методом ".data : AT (_etext)", хотя можно более прямо и логично сказать "положи это в конец региона"

    .data
    {
        ...........
    } >sram AT > flash
    _sidata = LOADADDR(.data);

И данные всегда лягут куда надо вне зависимости что еще было напихано в регион флеша.

 

По основному вопросу: согласен с AHTOXA, надо определить символ STM32F10X_HD или подобный исходя из типа вашего процессора. Удобнее всего это сделать в makefile, добавив CFLAGS+=DSTM32F10X_HD

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...