endasm
Jan 23 2013, 19:02
Здравствуйте, после долгого сидения на AVR, решил перейти на STM32F10x. Купил плату STM32F10xVLDISCOVERY, в качестве среды разработки решил выбрать Keil(uVision).
При попытке откомпилировать код - постоянно выдает следующую ошибку: .\Out\test1.axf: Error: L6218E: Undefined symbol assert_failed (referred from stm32f10x_rcc.o).
Я понимаю что причина в неопределенной функции "assert_failed", но ничего поделать с этим не могу. Помогите разобраться. Код ниже:
CODE
#include <stm32f10x.h>
#include <stm32f10x_conf.h>
#include <stm32f10x_rcc.h>
#include <stm32f10x_gpio.h>
void InitAll(void)
{
GPIO_InitTypeDef GPIO_InitStructure; //объявляем инициализационную структуру
GPIO_DeInit(GPIOC); //функция сбрасывающая текущие настройки порта в значения по умолчанию
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE); //включаем тактирование порта С
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8|GPIO_Pin_9; //настройки будут относится к 8 и 9 битам
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //настраиваем порт С на выход push-pull
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //максимальная частота переключения
GPIO_Init(GPIOC, &GPIO_InitStructure); //функция инициализации порта с заданной структурой
}
int main(void)
{
InitAll();
while(1)
{
GPIOC->ODR = 0xFFFF; //выводим в порт С единицы
}
}
flopix
Jan 24 2013, 09:24
Откройте настройки проекта (Alt+F7), вкладка с/с++, и в строке define уберите USE_FULL_ASSERT
Чтобы не писало предупреждение "main\main.c(26): warning: #1-D: last line of file ends without a newline" - добавьте пустую строку в самом конце файла main.c
endasm
Jan 24 2013, 09:24
Я пробовал и с этой строкой и без неё, всё равно не работает(
flopix
Jan 24 2013, 09:26
Работает
Build target 'test1'
linking...
Program Size: Code=2628 RO-data=320 RW-data=40 ZI-data=1632
FromELF: creating hex file...
".\Out\test1.axf" - 0 Error(s), 0 Warning(s).
Там в строке должно остаться только USE_STDPERIPH_DRIVER
endasm
Jan 24 2013, 09:34
Цитата(flopix @ Jan 24 2013, 12:26)

Работает
Build target 'test1'
linking...
Program Size: Code=2628 RO-data=320 RW-data=40 ZI-data=1632
FromELF: creating hex file...
".\Out\test1.axf" - 0 Error(s), 0 Warning(s).
Там в строке должно остаться только USE_STDPERIPH_DRIVER
Хм, с одной строкой не пробовал, позже обязательно отпишусь, сейчас на работе.
endasm
Jan 24 2013, 15:39
Попробовал, действительно компилится, всё хорошо. Но вот только светодиодики на плате не горят, может что то не так с кодом ?
И почему компилятор выдает предупреждение если я переменную объявляю где нибудь в середине мэйна, и не ругается если сразу первой строчкой в мэйне, это нормально?
_Артём_
Jan 24 2013, 16:02
Цитата(endasm @ Jan 24 2013, 17:39)

И почему компилятор выдает предупреждение если я переменную объявляю где нибудь в середине мэйна, и не ругается если сразу первой строчкой в мэйне, это нормально?
Видимо компилируется в каком-то древнем Си-стандарте. Поищите галку в настройках проекта навроде С99...
endasm
Jan 24 2013, 17:29
Так а почему же не загорается светодиод, где может быть ошибка в таком простом коде?
Цитата(_Артём_ @ Jan 24 2013, 19:02)

Видимо компилируется в каком-то древнем Си-стандарте. Поищите галку в настройках проекта навроде С99...
галки такой нет, нужно в опциях компилятора Misc Controls написать --C99
Aleksandr Baranov
Jan 24 2013, 23:20
Цитата(endasm @ Jan 24 2013, 12:29)

Так а почему же не загорается светодиод, где может быть ошибка в таком простом коде?
А конфигурация RCC где-то в другом месте запрограммирована?
allsettingsdone
Jan 25 2013, 05:02
Вы имеете ввиду тактирование порта? Тогда там оно включено:
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE); //включаем тактирование порта С
Aleksandr Baranov
Jan 25 2013, 13:22
Цитата(allsettingsdone @ Jan 25 2013, 00:02)

Вы имеете ввиду тактирование порта? Тогда там оно включено:
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE); //включаем тактирование порта С
Нет, выбор источника клоков, частоты, програмирование PLL и пр.
endasm
Jan 25 2013, 18:46
Такого не выбирал, и, честно сказать, даже не знал что это нужно делать. Подскажите пожалуйста как точно это сделать. Очень важно на первых порах получить хоть какой нибудь результат.
andries5
Jan 25 2013, 19:47
Пробую у себя, все работает. В файле stm32f10x.h у Вас выбран CPU
#define STM32F10X_XL /*!< STM32F10X_XL: STM32 XL-density devices */
а в stm32vldiscovery используется STM32F100RB, это значит
#define STM32F10X_MD_VL */ /*!< STM32F10X_MD_VL: STM32 Medium density Value Line devices */
в остальном работает.
Aleksandr Baranov
Jan 25 2013, 20:19
Цитата(endasm @ Jan 25 2013, 13:46)

Такого не выбирал, и, честно сказать, даже не знал что это нужно делать. Подскажите пожалуйста как точно это сделать. Очень важно на первых порах получить хоть какой нибудь результат.
Можно посмотреть в файле
stm32f10x_rcc.c. А потом сделать по-своему, если захочется.
endasm
Jan 26 2013, 19:58
Ура, светодиодик зажегся!! Да, надо было просто раскоментировать строку с нужным контроллером в stm32f10x.h файле ИЛИ можно просто прописать "STM32F10X_MD_VL" в строке препроцессора С/С++ кейла. Думаю что второй вариант удобнее. Да уж, интересно, но вот зачем столько действий, я же выбирал контроллер для проекта, кейл мог бы запомнить и сам всё сделать. В любом случае спасибо Вам всем, буду продолжать обучение.
Для просмотра полной версии этой страницы, пожалуйста,
пройдите по ссылке.