Jump to content

    

Структура проекта 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 устарели, где взять новые и как понять, что они новые?

 

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

Share this post


Link to post
Share on other sites

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

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

#include <stdint.h>

Share this post


Link to post
Share on other sites
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 как то не правильно, они из коробки работать должны.

Share this post


Link to post
Share on other sites

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

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

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

Share this post


Link to post
Share on other sites
6 минут назад, ViKo сказал:

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

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

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

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

Edited by Solonovatiy

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites
2 минуты назад, ViKo сказал:

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

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

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

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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites
9 минут назад, ViKo сказал:

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

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

Share this post


Link to post
Share on other sites

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

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

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

 

 

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites
10 минут назад, ViKo сказал:

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

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

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

Share this post


Link to post
Share on other sites
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)

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

Share this post


Link to post
Share on other sites

Нашел 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 и ни к чему не приводят.

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

Share this post


Link to post
Share on other sites
8 minutes ago, Solonovatiy said:

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

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

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this