Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Проблема с Keil, но скорее всего со мной
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
endasm
Здравствуйте, после долгого сидения на 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
Откройте настройки проекта (Alt+F7), вкладка с/с++, и в строке define уберите USE_FULL_ASSERT

Чтобы не писало предупреждение "main\main.c(26): warning: #1-D: last line of file ends without a newline" - добавьте пустую строку в самом конце файла main.c
endasm
Я пробовал и с этой строкой и без неё, всё равно не работает(
flopix
Работает

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
Цитата(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
Попробовал, действительно компилится, всё хорошо. Но вот только светодиодики на плате не горят, может что то не так с кодом ?
И почему компилятор выдает предупреждение если я переменную объявляю где нибудь в середине мэйна, и не ругается если сразу первой строчкой в мэйне, это нормально?
_Артём_
Цитата(endasm @ Jan 24 2013, 17:39) *
И почему компилятор выдает предупреждение если я переменную объявляю где нибудь в середине мэйна, и не ругается если сразу первой строчкой в мэйне, это нормально?

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

галки такой нет, нужно в опциях компилятора Misc Controls написать --C99
Aleksandr Baranov
Цитата(endasm @ Jan 24 2013, 12:29) *
Так а почему же не загорается светодиод, где может быть ошибка в таком простом коде?

А конфигурация RCC где-то в другом месте запрограммирована?
allsettingsdone
Вы имеете ввиду тактирование порта? Тогда там оно включено:

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE); //включаем тактирование порта С
Aleksandr Baranov
Цитата(allsettingsdone @ Jan 25 2013, 00:02) *
Вы имеете ввиду тактирование порта? Тогда там оно включено:

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE); //включаем тактирование порта С

Нет, выбор источника клоков, частоты, програмирование PLL и пр.
endasm
Такого не выбирал, и, честно сказать, даже не знал что это нужно делать. Подскажите пожалуйста как точно это сделать. Очень важно на первых порах получить хоть какой нибудь результат.
andries5
Пробую у себя, все работает. В файле 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
Цитата(endasm @ Jan 25 2013, 13:46) *
Такого не выбирал, и, честно сказать, даже не знал что это нужно делать. Подскажите пожалуйста как точно это сделать. Очень важно на первых порах получить хоть какой нибудь результат.

Можно посмотреть в файле stm32f10x_rcc.c. А потом сделать по-своему, если захочется.
endasm
Ура, светодиодик зажегся!! Да, надо было просто раскоментировать строку с нужным контроллером в stm32f10x.h файле ИЛИ можно просто прописать "STM32F10X_MD_VL" в строке препроцессора С/С++ кейла. Думаю что второй вариант удобнее. Да уж, интересно, но вот зачем столько действий, я же выбирал контроллер для проекта, кейл мог бы запомнить и сам всё сделать. В любом случае спасибо Вам всем, буду продолжать обучение.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.