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

Структура проекта Keil 5, его родные паки и не родные инклуды.

Здравствуйте. У меня что то голова кругом идет, пытаюсь перетащить проект пример (USB-VirtualCOM, но думаю это не важно) в новый чистый.

На компиляции получаю гору ошибок о неизвестных типах, включая (uint8_t и тп). Хотя CMSIS и startup подключен через стандартный "кейловский пак" и сделан #include "stm32f10x.h"  
В мейне все стандартные типы после включения stm32f10x.h становятся видимы, а вот в других файлах похоже нефига.

Ок... посмотрел примеры, в настройках проекта объявлены дефайны "USE_STDPERIPH_DRIVER,STM32F10X_HD".
Попробовал объявить их - получил еще в довесок пару ошибок. 

На этом форуме, нашел тему, где упоминается, что кейловский CMSIS - не CMSIS, а StdPerif устаревший. В "уроках" много людей делает по разному, никак не комментируя свой выбор (кто то родными паками кейла, кто то качает с ST.com, кто то дефайнит контроллер в настройках проекта, кто то через инклуд).

Вот тут у меня начала кипеть голова, так же еще я ударился об невозможность делать вложенные папки в структуре проекта, что совершенно случайно оголило мое незнание о видимых и невидимых проектом файлах и их структуре\путях.

Нужны разъяснения, только не посылайте на родные мануалы кейла пожалуйста, у меня тогда точно череп треснет...

ВОПРОСЫ:

1. Я могу добавить "Include patchs" через опции проекта. Какие файлы станут видимыми для проекта в этом случае? *.h или *.c тоже?
2. Я могу добавить папки и файлы через окошко структуры проекта слева. Я всегда видел, что туда пихают только *.c файлы, они после этого становятся видимыми, а вот *.h похоже нет. Не буду спрашивать почему, спрошу, что правильно туда пихать?
3. "#include" файла я должен делать по его реальному адресу или по адресу структуры проекта слева?
4. Чем вот эти два способа различаются? Как ими правильно пользоваться?

5. Что за родные паки кейла, они какие то "свои" или служат заменой родных файлов производителя?
6. Почему, Startup я просто добавляю паком и ошибка (не определена секция) уходит, а для тех же стандартных типов я должен еще объявлять stm32f10x.h 
7. Если флаги USE_STDPERIPH_DRIVER,STM32F10X_HD устарели, где взять новые и как понять, что они новые?

 

Чет хотел структурировано, но получилась каша, наверно потому, что в голове тоже каша. Ну м.б. кто нибудь хоть пару пунктов прояснит, уже легче станет.

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


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

Слева в проект закидываете c файлы, а в опциях для проекта задаёте пути для h файлов (там же написано Include Paths).

Чтобы понимать uint8_t и т.п., нужно включить 

#include <stdint.h>

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


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

5 минут назад, ViKo сказал:

Слева в проект закидываете c файлы, а в опциях для проекта задаёте пути для h файлов (там же написано Include Paths).

Как сейчас нагуглил, поправьте меня, если где то не верно:

1. Файлы в структуре проекта, это собственно файлы исходников, которые компилятор будет пытаться обработать. Т.е. *.c *.cpp *.s файлы.
Файлы *.h смысла туда включать нету, потому, что они будут проигнорированы компилятором. 
И! Включение их туда для удобства (открытия например) ни на что не влияет, они просто там висят.

2. Файлы в "Include patchs" это собственно папки с хидерами, все хидеры которые лежат в этих папках, видны всем (*.c *.cpp *.s) файлам, что объявлены в структуре проекта, причем без требований указать их реальные пути вроде (../folder/subfolder/header.h)

3. Реальная структура папок, да и структура папок проекта абсолютно не важна, т.к. если ты включаешь файл методом(#include folder/subfolder/header.h) — ты что то делаешь не так. (ну либо это какой то очень частный случай)

5 минут назад, ViKo сказал:

Чтобы понимать uint8_t и т.п., нужно включить 

#include <stdint.h>

Но вот тут такое дело, что он в core_cm3.h включен уже. (вроде бы, но к чему-то, что подключено к  stm32f10x.h точно включен)
Однако другие файлы ругаются, а в них пихать stdint как то не правильно, они из коробки работать должны.

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


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

1. Смысла нет. Они подключатся директивами #include. Игнорироваться компилятором не будут, а будут добавлены по месту в c-файлах.

2. Хидеры видны тем, у кого они добавлены с помощью #include. Пути задавать не надо, для того Include Paths и задаются.

3. Надо пихать stdint.h во все файлы, где используются такие типы. Возможно, новые стандарты C++xx не требуют, не проверял.

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


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

6 минут назад, ViKo сказал:

3. Надо пихать stdint.h во все файлы, где используются такие типы. Возможно, новые стандарты C++xx не требуют, не проверял.

Ммм но файлы жалующиеся на типы, это файлы из примеров с ST.com
Может быть там через хидеры везде зависимость, которая приводит к включению stdint

Но тогда у мнея все таже проблема, почему когда, я включаю Keil Pack CMSIS и ставлю preprocessor symbol STM32F10X_LD_VL, мне все равно требуется делать #include  stm32f10x.h , хотя во всех примерах в мейне его нет.

Нахрен вообще эти стандартные кейловские паки подключать, если все равно пути прокидывать до файлов?

Изменено пользователем Solonovatiy

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


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

Достаточно, чтобы stdint.h подключился до того, как будут компилироваться переменные такого типа. Компилятор будет знать их определения. Значит, где-то в примерах были эти инклюды.

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


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

2 минуты назад, ViKo сказал:

Достаточно, чтобы stdint.h подключился до того, как будут компилироваться переменные такого типа. Компилятор будет знать их определения. Значит, где-то в примерах были эти инклюды.

Ок. Спасибо, по cmsis не просветите? 

Если отдельно от всей мешанины сверху.

Я видел как люди сами скачивают и подключают инклудами CMSIS и видел как его берут из софтварных паков.
Вот если я беру его из софтварных паков, мне его как то надо тоже полкючать и инклудить? 

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


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

У вас Keil современный, 5.хх? Тогда ходите в Manage Run-Time Environment (зеленый ромб на панели), и там выбирайте, что возжелаете, а менеджер подскажет, чего не хватает. Само вставится в проект.

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


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

9 минут назад, ViKo сказал:

У вас Keil современный, 5.хх? Тогда ходите в Manage Run-Time Environment (зеленый ромб на панели), и там выбирайте, что возжелаете, а менеджер подскажет, чего не хватает. Само вставится в проект.

Да вот то ли не вставляется, то ли лыжи не едут... Ок, ушел разбираться.

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


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

Ок, вроде разобрался. Учебные ссылались на хидер evaluate board'ов, а т.к. у меня штырьдоска2 пришлось заменять хидером контроллера. (stm32f10x.h ).

Остался вопрос
Зачем в Preprocessor Symbols объявляют контроллер (в виде STM32xxxx_xx_xx) что это дает? Отсутствие или присутствие этой директивы в Keil 5 не дало никаких изменений.

Я перелез с AVR, там в настройках проекта объявление устройства и частоты позволяло библиотекам подсасывать их и использовать в своих нуждах. Здесь же пришлось stm32f10x.h закидывать, так все таки что дает объявление контроллера в препроцессоре? 

 

 

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


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

Во вкладке Device если задали микроконтроллер, то в Preprocessor Symbols уже и не надо. В Compiler control string увидите свой микроконтроллер. По имени МК выбирается конкретный заголовочный файл для МК.

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


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

10 минут назад, ViKo сказал:

По имени МК выбирается конкретный заголовочный файл для МК.

Ветвление внутри самого stm32f10x.h?

Ок, спасибо за разъяснения.

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


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

3 часа назад, ViKo сказал:

 

Спрошу мелочь не по теме, у меня стандартный SysInit() кейла, при настройке в проекте кварца 12МГц, делает PLLMUL - 0x07, что по мануалу х9, т.е. в итоге получается 108Мгц.

В Configuration Wizard'e (т.е. файле RTE_Device.h, подключенном через софтварный пак "Startup" кейла)  HSE выставлен 12MHz, а SystemClock, HCLK, APB2 - 72Mhz. 
По идее он должен устанавливать PLLMUL в (x6) ака 0x04, но почему то это не делает. 

Проверил, PLLXTPRE не включен, а SW 0x02, что соответствует источнику SystemClock - PLL.

Получается, он намерено задирает множитель ради непонятно чего, такое ощущение, что переключаясь с HSI оно не меняет PLLMUL (что тоже не сходится, т.к. c HSI по диаграмме на PLLMUL приходит HSI/2)

Вот сижу уже час в это смотрю и не могу понять.

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


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

Нашел 2 вещи:

1) RTE_Device.h никак не связан с проектом, пусть он и добавляется вместе с system_stm32f10x.c стартап файлом.

2) В "system_stm32f10x.c" частота выбирается в зависимости от макро HSE_VALUE, который задает в "stm32f10x.h" , вот как это выглядит там:

/**
 * @brief In the following line adjust the value of External High Speed oscillator (HSE)
   used in your application 
   
   Tip: To avoid modifying this file each time you need to use different HSE, you
        can define the HSE value in your toolchain compiler preprocessor.
  */           
#if !defined  HSE_VALUE
 #ifdef STM32F10X_CL   
  #define HSE_VALUE    ((uint32_t)25000000) /*!< Value of the External oscillator in Hz */
 #else 
  #define HSE_VALUE    ((uint32_t)8000000) /*!< Value of the External oscillator in Hz */
 #endif /* STM32F10X_CL */
#endif /* HSE_VALUE */

Но попытки задефайнить HSE_VALUE до или после выдают redefinition warning и ни к чему не приводят.

Где его надо объявлять, если ни в настройках проекта, ни в макро не дает?

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


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

8 minutes ago, Solonovatiy said:

попытки задефайнить HSE_VALUE до или после выдают redefinition warning

Значит он где-то уже определен. Сделайте поиск по проекту и найдите тот файл.

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


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

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

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

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

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

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

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

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

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

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