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

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

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

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

Он пишет, что определен в stmf10x.h если определить после его инклуда. А если ДО, то ворнингов нет и ничего не меняется.

Сейчас перепроверил, в HSE_VALUE у меня (после моего дефайна в настройках проекта) лежит 12 000 000. Но startup никак на это не отреагировал.

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


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

13 minutes ago, Solonovatiy said:

Он пишет, что определен в stmf10x.h если определить после его инклуда. А если ДО, то ворнингов нет и ничего не меняется.

Логично, так и должно быть.

А что должно меняться? Особенно в стартапе. Сделайте поиск по всему проекту и найдите, где этот макрос используется. Вот там и должно что-то меняться при его (пере)определении. Он используется, например, при настройке скорости обмена по UART.

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


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

1 минуту назад, Darth Vader сказал:

Логично, так и должно быть.

А что должно меняться? Особенно в стартапе. Сделайте поиск по всему проекту и найдите, где этот макрос используется. Вот там и должно что-то меняться при его (пере)определении. Он используется, например, при настройке скорости обмена по UART.

Если оно объявлено в настройках проекта и потом переназначено, у меня бы был ворнинг. В любом случае, я его в переменную себе вывел и там - 12МГц. HSE_VALUE, а это значит, что через preprocessor symbols в настройках проекта задан верно.

 

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


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

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

Если оно объявлено в настройках проекта и потом переназначено, у меня бы был ворнинг. В любом случае, я его в переменную себе вывел и там - 12МГц. HSE_VALUE, а это значит, что через preprocessor symbols в настройках проекта задан верно.

 

PS а если не объявлять, то будет 8Мгц, что указывает, что HSE_VALUE таки изменяется, но не на что не влияет по какой то причине.

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


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

7 hours ago, Solonovatiy said:

а если не объявлять, то будет 8Мгц, что указывает, что HSE_VALUE таки изменяется, но не на что не влияет по какой то причине.

Расскажите подробно что именно вы делаете в одном и в другом случае.

Случай 1

Вы объявляете #define HSE_VALUE 12000000 в Options -> C/C++ -> Preprocessor Symbols ? Честно говоря, сам такого ни разу не делал, правильный синтаксис не знаю. Сейчас попробовал - ругается на неправильное макроопределение. Поправьте меня, как правильно писать в этой строке. Что именно там должно быть записано?

Случай 2

Вы его явно прописываете (строка #define HSE_VALUE 12000000 ) в файле stmf10x.h либо до, либо после его определения там.

Если после - то у вас предупреждение о переопределении макроса HSE_VALUE. Если до, то предупреждений нет. Но и в том и в другом случае он должен переопределиться на ваше значение (12000000), не важно с предупреждением или без него.

 

Как это обычно делается

Для задания таких параметров обычно делают свой h/hpp-файл (называют обычно board.h или device.h), где прописывают параметры железа - частоты кварца, имена для  выводов портов и т.п. И этот файл инклудят к .c/.cpp файлам проекта, чтобы там использовать эти макроопределения.

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


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

1 час назад, Darth Vader сказал:

Случай 1 HSE_VALUE 12000000 в Options -> C/C++ -> Preprocessor Symbols

Он там через = прописывается и без define (HSE_VALUE =12000000), подсмотрел еще в атмель студии и тут вроде тоже прокатывает.

1 час назад, Darth Vader сказал:

Случай 2

Вы его явно прописываете (строка #define HSE_VALUE 12000000 ) в файле stmf10x.h либо до, либо после его определения там.

Если после - то у вас предупреждение о переопределении макроса HSE_VALUE. Если до, то предупреждений нет. Но и в том и в другом случае он должен переопределиться на ваше значение (12000000), не важно с предупреждением или без него.

Да, но от значения HSE_VALUE судя по всему ничего не зависит.

1 час назад, Darth Vader сказал:

Как это обычно делается

Для задания таких параметров обычно делают свой h/hpp-файл (называют обычно board.h или device.h), где прописывают параметры железа - частоты кварца, имена для  выводов портов и т.п. И этот файл инклудят к .c/.cpp файлам проекта, чтобы там использовать эти макроопределения.

Да я вот хотел именно встроенные фичи кейла осилить, тут цель всей возни именно в этом, а не запуске учебного проекта. Хотелось понять, что и почему.

 

 

Ща сидел щелкал по 1му шагу через житаг (потому, что через симулятор у меня ошибка 65, как я понял - нет модели для симуляции). Блин, может у меня кейл кривой сам?

Вообще в кратце, что у меня происходит. При добавлении кейловского пака Device->Startup, у меня закидываются 3!!! файла

- RTE_Device.h - как я понимаю, ошметок HAL, на него программа во время запуска никогда не попадает, черт знает, зачем он нужен и как запускатся через него.
- startup_stm32f10x_md.s
- system_stm32f10x.c
Вот в последнем я нашел

Спойлер

В начале 


#if defined (STM32F10X_LD_VL) || (defined STM32F10X_MD_VL) || (defined STM32F10X_HD_VL)
/* #define SYSCLK_FREQ_HSE    HSE_VALUE */
 #define SYSCLK_FREQ_24MHz  1000000
#else
/* #define SYSCLK_FREQ_HSE    HSE_VALUE */
/* #define SYSCLK_FREQ_24MHz  24000000 */ 
/* #define SYSCLK_FREQ_36MHz  36000000 */
// #define SYSCLK_FREQ_48MHz  48000000 
//#define SYSCLK_FREQ_56MHz  56000000 
#define SYSCLK_FREQ_72MHz  72000000
#endif

 

Вот это вот вызывается во время инициализации 


static void SetSysClock(void)
{
  #ifdef SYSCLK_FREQ_HSE
    SetSysClockToHSE();
  #elif defined SYSCLK_FREQ_24MHz
    SetSysClockTo24();
  #elif defined SYSCLK_FREQ_36MHz
    SetSysClockTo36();
  #elif defined SYSCLK_FREQ_48MHz
    SetSysClockTo48();
  #elif defined SYSCLK_FREQ_56MHz
    SetSysClockTo56();  
  #elif defined SYSCLK_FREQ_72MHz
    SetSysClockTo72();
  #endif
 }

 

А вот кусок одной из таких функций


#ifdef STM32F10X_CL
    /* Configure PLLs ------------------------------------------------------*/
    /* PLL2 configuration: PLL2CLK = (HSE / 5) * 8 = 40 MHz */
    /* PREDIV1 configuration: PREDIV1CLK = PLL2 / 5 = 8 MHz */
        
    RCC->CFGR2 &= (uint32_t)~(RCC_CFGR2_PREDIV2 | RCC_CFGR2_PLL2MUL |
                              RCC_CFGR2_PREDIV1 | RCC_CFGR2_PREDIV1SRC);
    RCC->CFGR2 |= (uint32_t)(RCC_CFGR2_PREDIV2_DIV5 | RCC_CFGR2_PLL2MUL8 |
                             RCC_CFGR2_PREDIV1SRC_PLL2 | RCC_CFGR2_PREDIV1_DIV5);

#else    
    /*  PLL configuration: PLLCLK = HSE * 9 = 72 MHz */
    RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_PLLSRC | RCC_CFGR_PLLXTPRE |
                                        RCC_CFGR_PLLMULL));
    RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLSRC_HSE | RCC_CFGR_PLLMULL9);

 

 

 

Как видно, HSE_VALUE тут просто не учитывается. А учитывается только в SystemCoreClockUpdate();
Которая:

This file provides two functions and one global variable to be called from 
  *     user application:

......

  *      - SystemCoreClockUpdate(): Updates the variable SystemCoreClock and must
  *                                 be called whenever the core clock is changed
  *                                 during program execution.

.......

 * 4. The default value of HSE crystal is set to 8 MHz (or 25 MHz, depedning on
  *    the product used), refer to "HSE_VALUE" define in "stm32f10x.h" file. 
  *    When HSE is used as system clock source, directly or through PLL, and you
  *    are using different crystal you have to adapt the HSE value to your own
  *    configuration.

Однако, вызов SystemCoreClockUpdate(); из мейна тоже не дал никаких результатов.
Просмотрел, что в ней происходит, там мне вполне себе намерено насчитывают SystemClock на 108МГц и радостно заталкивают.

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

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


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

У меня с кейлом были следующие проблемы. Подключал через инклюд локальный файл (из папки проекта), с целью как раз править HSE_VALUE. Но кейл при компиляции находил такой же файл в своих системных папках первым и использовал его. Лечилось перетасовкой путей к инклюдам. Но это было в 4-м Кейле. (Я на 5-й так и не перешел).

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


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

Только что, Edit2007 сказал:

У меня с кейлом были следующие проблемы. Подключал через инклюд локальный файл (из папки проекта), с целью как раз править HSE_VALUE. Но кейл при компиляции находил такой же файл в своих системных папках первым и использовал его. Лечилось перетасовкой путей к инклюдам. Но это было в 4-м Кейле. (Я на 5-й так и не перешел).

http://forum.easyelectronics.ru/viewtopic.php?f=35&t=40525&p=605178#p605178

Тут пояснили, нет никакой подстройки инита под HSE_VALUE. Хочешь не стандартный кварц - пиши свой или правь текущий инит.

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


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

В stm32f10x_conf.h

после 

/* Define to prevent recursive inclusion -------------------------------------*/
#ifndef __STM32F10x_CONF_H
#define __STM32F10x_CONF_H

добавить

#ifdef HSE_VALUE 
 #ifndef MY_HSE
  #define MY_HSE
  #undef HSE_VALUE
  #define HSE_VALUE ((uint32_t)12000000) // Value of the External oscillator in Hz 
 #endif                                  // MY_HSE
#endif                                   // HSE_VALUE
 

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


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

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

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

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

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

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

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

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

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

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