Easyelectronics.ru

Электроника для всех
Текущее время: 18 окт 2019, 19:12

Часовой пояс: UTC + 5 часов



JLCPCB – Прототипы печатных плат за $2/10pcs (Любой цвет!)
Крупнейший производитель печатных плат и прототипов. Более 600000 клиентов и свыше 10000 заказов в день!
Получите скидку на почтовую отправку при первом заказе в JLCPCB!

Начать новую тему Ответить на тему  [ Сообщений: 20 ] 
Автор Сообщение
 Заголовок сообщения: system_stm32f10x.c и не стандартная частота кварца.
СообщениеДобавлено: 11 июл 2019, 11:21 
Только пришел

Зарегистрирован: 11 июл 2019, 11:13
Сообщения: 10
Здравствуйте. STM32F103C8

Пытаюсь запустится на 12МГц штырьдоски используя стандартный startup в кейле.
Но мне почему то упорно насчитывает с учетом 8МГц кварца.

HSE_VALUE объявляю в настройках проекта (или вне них, результат не меняется).
system_stm32f10x.c мне просто насчитывает 108МГц и зная это заталкивает в регистры.

Я не нашел места в коде, где PLLMUL высчитывается в зависимости от заявленной частоты кристалла, везде неявно берется 8МГц.

ОДНАКО! Во всех примерах использующих родной стартап и кварц 12МГц, все получается спокойно через изменение HSE_VALUE.
Я не хочу писать свой стартап - у меня именно цель заставить работать этот, если это возможно.

Пожалуйста ткните носом, где идет расчет множителя PLL в system_stm32f10x.c в зависимости от HSE_VALUE.

PS я вот тут начал https://electronix.ru/forum/index.php?a ... nt-1635825
Там поподробнее, тут загаживать не хочу.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: system_stm32f10x.c и не стандартная частота кварца.
СообщениеДобавлено: 11 июл 2019, 11:49 
Старожил
Аватара пользователя

Зарегистрирован: 26 окт 2013, 07:58
Сообщения: 2349
Есть утилита (файл экселя с макросами) - она генерит файл system_stm32f10x.c в нужными настройками, в зависимости от того, что ты там натыкаешь.
Гугли.

Вот PLL
Код:
    /*  PLL configuration: PLLCLK = HSE * 6 = 48 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_PLLMULL6);
#endif /* STM32F10X_CL */


RCC_CFGR_PLLMULL6 - множитель

Возможные значения
Код:
RCC_CFGR_PLLMULL2                  ((uint32_t)0x00000000)        /*!< PLL input clock*2 */
#define  RCC_CFGR_PLLMULL3                  ((uint32_t)0x00040000)        /*!< PLL input clock*3 */
#define  RCC_CFGR_PLLMULL4                  ((uint32_t)0x00080000)        /*!< PLL input clock*4 */
#define  RCC_CFGR_PLLMULL5                  ((uint32_t)0x000C0000)        /*!< PLL input clock*5 */
#define  RCC_CFGR_PLLMULL6                  ((uint32_t)0x00100000)        /*!< PLL input clock*6 */
#define  RCC_CFGR_PLLMULL7                  ((uint32_t)0x00140000)        /*!< PLL input clock*7 */
#define  RCC_CFGR_PLLMULL8                  ((uint32_t)0x00180000)        /*!< PLL input clock*8 */
#define  RCC_CFGR_PLLMULL9                  ((uint32_t)0x001C0000)        /*!< PLL input clock*9 */
#define  RCC_CFGR_PLLMULL10                 ((uint32_t)0x00200000)        /*!< PLL input clock10 */
#define  RCC_CFGR_PLLMULL11                 ((uint32_t)0x00240000)        /*!< PLL input clock*11 */
#define  RCC_CFGR_PLLMULL12                 ((uint32_t)0x00280000)        /*!< PLL input clock*12 */
#define  RCC_CFGR_PLLMULL13                 ((uint32_t)0x002C0000)        /*!< PLL input clock*13 */
#define  RCC_CFGR_PLLMULL14                 ((uint32_t)0x00300000)        /*!< PLL input clock*14 */
#define  RCC_CFGR_PLLMULL15                 ((uint32_t)0x00340000)        /*!< PLL input clock*15 */
#define  RCC_CFGR_PLLMULL16                 ((uint32_t)0x00380000)        /*!< PLL input clock*16 */



Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: system_stm32f10x.c и не стандартная частота кварца.
СообщениеДобавлено: 11 июл 2019, 12:09 
Только пришел

Зарегистрирован: 11 июл 2019, 11:13
Сообщения: 10
Pingvin писал(а):
Есть утилита (файл экселя с макросами) - она генерит файл system_stm32f10x.c в нужными настройками, в зависимости от того, что ты там натыкаешь.
Гугли.


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


Pingvin писал(а):
RCC_CFGR_PLLMULL6 - множитель


Так он то должен выбираться и вставляться в зависимости от HSE_VALUE

Код:
  * 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.


Если я правильно это понял, то требуется только подкорректировать HSE_VALUE.
Во многих гайдах по интернету, использующих стандартный стартап так и делают.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: system_stm32f10x.c и не стандартная частота кварца.
СообщениеДобавлено: 11 июл 2019, 12:10 
Старожил

Зарегистрирован: 16 ноя 2012, 07:47
Сообщения: 2866
там изменить то только один дефайн, с RCC_CFGR_PLLMULL9 на RCC_CFGR_PLLMULL6. Править все равно придется. дефайн с HSE_VALUE влияет лишь на значение, получаемое в SystemClock.
В слойлере готовый код на кварц 12 мгц. Не забудьте в stm32f10x.h изменить
Код:
#define HSE_VALUE    ((uint32_t)12000000) /*!< Value of the External oscillator in Hz */

Show system_stm32f10x.c


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: system_stm32f10x.c и не стандартная частота кварца.
СообщениеДобавлено: 11 июл 2019, 12:14 
Только пришел

Зарегистрирован: 11 июл 2019, 11:13
Сообщения: 10
Hold писал(а):
там изменить то только один дефайн, с RCC_CFGR_PLLMULL9 на RCC_CFGR_PLLMULL6. Править все равно придется. дефайн с HSE_VALUE влияет лишь на значение, получаемое в SystemClock.
В слойлере готовый код на кварц 12 мгц. Не забудьте в stm32f10x.h изменить


Спасибо. Мне просто требовался ответ - что я все правильно понял и одним дефайном тут не обходится, иначе просто получалось бы, что я что то серьезное упускал из виду.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: system_stm32f10x.c и не стандартная частота кварца.
СообщениеДобавлено: 11 июл 2019, 12:19 
Старожил

Зарегистрирован: 16 ноя 2012, 07:47
Сообщения: 2866
Единственное на что явно влияет HSE_VALUE - это на Flash Latency. Всё остальное ручками. Достаточно пробежаться по файлу system_stm32f10x.c и посмотреть где там используется HSE_VALUE. А поидее вообще надо весь это system_ выкинуть и написать свой, куда компактнее, там реально не нужно всё.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: system_stm32f10x.c и не стандартная частота кварца.
СообщениеДобавлено: 11 июл 2019, 12:22 
Старожил
Аватара пользователя

Зарегистрирован: 22 июл 2017, 11:48
Сообщения: 3646
А нынче наверно умножение и деление на калькуляторе уже и не проходят?
HCLK = ( (12 МГц кварц) / (HSE Prediv = 1 или 2) ) * (PLL MUL = 2, 3, 4, 5, 6)

HSE_VALUE влияет на правильность работы функции SystemCoreClockUpdate.
Flash Latency - тоже, извините, ручками, ручками. Ибо оное зависит еще и от напряжения питания. В старших МК это хорошо видно.

Касательно файла system_stm32f10x.c - его содержание носит рекомендательный характер. На протяжении времени видно, как изменялось содержание дефолтного файла system_stm32ххххx.c от серии к серии МК. Суть этого файла - настройка используемых источников частот МК и некоторых других вещей, запускаемых только при старте. Просто чтобы всё это не мешалось в основной проге, ведь оно выполняется еще до входа в функцию main()


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: system_stm32f10x.c и не стандартная частота кварца.
СообщениеДобавлено: 11 июл 2019, 12:33 
Только пришел

Зарегистрирован: 11 июл 2019, 11:13
Сообщения: 10
BusMaster писал(а):
HSE_VALUE влияет на правильность работы функции SystemCoreClockUpdate.


А зачем все это, если все один хрен захардкожено на 8МГц и при отличном значении там будет не верный расчет?

Это все и запутывает, куча какого-то кипиша, с дефайнами и препроцессором, а один хрен ничего не поменять, кроме конкретной подстройки под семейство.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: system_stm32f10x.c и не стандартная частота кварца.
СообщениеДобавлено: 11 июл 2019, 12:44 
Старожил
Аватара пользователя

Зарегистрирован: 22 июл 2017, 11:48
Сообщения: 3646
А затем, что понятие частоты МК - непостоянно. Частоту МК можно изменять прямо на ходу во время работы - от 65 кГц и ниже до 180 МГц и выше, причем источников основной частоты может быть до 4 штук - HSE, HSI, MSI, PLL. Вот как раз для того, чтобы узнать, на какой частоте работает МК в данный момент, и предусмотрена функция SystemCoreClockUpdate. Она обновляет переменную SystemCoreClock в точном соответствии с настройками системы тактирования.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: system_stm32f10x.c и не стандартная частота кварца.
СообщениеДобавлено: 11 июл 2019, 13:18 
Только пришел

Зарегистрирован: 11 июл 2019, 11:13
Сообщения: 10
BusMaster писал(а):
А затем, что понятие частоты МК - непостоянно. Частоту МК можно изменять прямо на ходу во время работы - от 65 кГц и ниже до 180 МГц и выше, причем источников основной частоты может быть до 4 штук - HSE, HSI, MSI, PLL. Вот как раз для того, чтобы узнать, на какой частоте работает МК в данный момент, и предусмотрена функция SystemCoreClockUpdate. Она обновляет переменную SystemCoreClock в точном соответствии с настройками системы тактирования.


Исчерпывающе.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: system_stm32f10x.c и не стандартная частота кварца.
СообщениеДобавлено: 11 июл 2019, 20:27 
Старожил
Аватара пользователя

Зарегистрирован: 22 июл 2017, 11:48
Сообщения: 3646
И даже более того, чтобы не путаться в этой каше, поставляемой по дефолту, вы можете написать собственный system_stm32f10x.c (кстати, не совсем правильно называть его стартапом. стартап - это файл startup_stm32f10x_md.s, писанный на ассемблере и содержащий именно первоначальный запуск от первого шага).. .. так вот, свой файл system_stm32f10x.c методом выкидывания всего лишнего из заводского файла.
Создаем файл с таким же именем и переносим в него название функции void SystemInit (void) . Вся идущая в оригинале этой функции требуха нас шибко не интересует вплоть до вызова функции SetSysClock(), а так же нам понадобится перенести 5 строчек ниже этой функции. Получится вот это:
Show SystemInit

Теперь нам надо таким же способом навыдеркивать функцию настройки системной частоты SetSysClock. Предполагаем, что мы будем тактироваться от PLL, запущенного от кварца.
В оригинале там много лишнего, с предположением, что кварц по истечении таймаута не запустился. Мы упростим задачу, полагая, что кварц у нас всегда исправен.
Пишем включение кварца и ожидание его запуска. Потом пишем (или копируем) настройку делителей шин. Копипастим установку коэффициентов PLL. А так же переносим настройку flash latency в том случае, если наша частота будет больше 24 МГц. И переносим включение PLL с ожиданием его готовности. Вот так:
Show SetSysClock


Ну и для работы функции SystemCoreClockUpdate переносим переменные
uint32_t SystemCoreClock = 72000000; // первоначально установленная частота МК
__I uint8_t AHBPrescTable[16] = {0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 6, 7, 8, 9};
и переносим целиком содержимое фунции void SystemCoreClockUpdate (void)

Вот и все дела то. Файл получился компактный и понятный. Теперь по мере необходимости в него мы можем добавлять включение LSE для RTC (часики реального времени), настройку делителей для АЦП, настройку модуля питания, ну и прочее, чего хотим.
Примечание.
При запуске отладки вызов функции SystemInit не виден! Первый брекпоинт по умолчанию ставится на фунции main(). Чтобы видеть работу SystemInit, надо поставить на нее брекпоинт


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: system_stm32f10x.c и не стандартная частота кварца.
СообщениеДобавлено: 11 июл 2019, 21:12 
Старожил
Аватара пользователя

Зарегистрирован: 13 янв 2018, 21:36
Сообщения: 1013
BusMaster писал(а):
Мы упростим задачу, полагая, что кварц у нас всегда исправен.
Эээммм, ну...
Код:
    /* Enable Prefetch Buffer */
    FLASH->ACR |= FLASH_ACR_PRFTBE;

    /* Flash 2 wait state  - это для частоты 72 МГц */
    FLASH->ACR &= (uint32_t)((uint32_t)~FLASH_ACR_LATENCY);
    FLASH->ACR |= (uint32_t)FLASH_ACR_LATENCY_2; 
По что же так скотинку мучишь? Всё намного проще
Код:
FLASH->ACR = FLASH_ACR_PRFTBE | _VAL2FLD(FLASH_ACR_LATENCY,2);

Вот тут вообще не понял. Зачем в RCC->CFGR два разных значения последовательно писать?
Код:
    /* делители шин. AHB = 1:1, APB2 = 1:1, APB1 = 1:2 */
    RCC->CFGR = RCC_CFGR_HPRE_DIV1 | RCC_CFGR_PPRE2_DIV1 | RCC_CFGR_PPRE1_DIV2;

    /*  PLL configuration: PLLCLK = HSE * 9 = 72 MHz */
    RCC->CFGR = (uint32_t)(RCC_CFGR_PLLSRC_HSE | RCC_CFGR_PLLMULL9);    // <<-- Вот тут как раз и сидит этот умножитель! HSE * PLLMUL

Ты же вроде это уже исправлял, сам видел. Переключение источника тактирования с одного на другой через третий.
Код:
    /* Select PLL as system clock source */
    RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_SW));
    RCC->CFGR |= (uint32_t)RCC_CFGR_SW_PLL;   

Ну и как вишенка на торте - магические числа.
Код:
    /* Wait till PLL is used as system clock source */
    while ((RCC->CFGR & (uint32_t)RCC_CFGR_SWS) != (uint32_t)0x08) { }


Show Предлагаю сделать вот так


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: system_stm32f10x.c и не стандартная частота кварца.
СообщениеДобавлено: 11 июл 2019, 22:04 
Старожил
Аватара пользователя

Зарегистрирован: 22 июл 2017, 11:48
Сообщения: 3646
Тише, тише. Мы все знаем, как надо правильно. Но если минимизировать усилия по переносу кода из дефолтного в свой, то именно так и будет. А вот та паутина дефайнов, предложенная вами - вот там черт ногу сломит.
Кстати, я давно отказался от универсального файла на все случаи жизни. Поскольку случаи бывают чаще всего какие-то специфические, под которые, один хрен, приходится писать так, как надо именно в этом случае. Всё чаще в моей практике попадаются задачи с динамическим управлением тактовой частотой и питанием. Переключение частоты или источника тактирования тянет за собой переключение делителей шин периферии, изменение коэфф.PLL, переключение режимов питания, флеша, индивидуальных предделителей периферии. Да еще и не просто так, а с проверкой условий запуска. Вобщем, пишем только то, что канкретна нада.

В "дефолтной заводской" функции настройки кажущиеся лишними на первый взгляд действия - всего лишь напоминание о том, что при вызове этой функции пользователем из программы (а не стартовым кодом после состояния Reset) - регистры не будут сброшены в дефолтное состояние и битовые поля нуждаются в предварительном их сбросе в 0. В дефолтном файле просто не до конца раскрыта суть, не дописано. Но практический случай - запуск по POR на частоте HSI, проверка каких-то условий и если условия удовлетворяют, запуск от HSE-PLL со всеми вытекающими. Например, устройство с батарейным питанием: вставили батарейки, питание подалось, но основной запуск устройства не должен происходить до нажатия кнопки "ВКЛ".
То, что тебе кажется на первый взгляд лишним в дефолтном файле, на деле может быть разнесено по разным функциям. Поэтому "лишние" записи - это напоминание о том, что "не забывайте, что остальные биты могли быть установлены в других функциях". То есть, изменение делителя одной шины еще не означает изменение делителя другой шины.
Это я к тому, что я "исправил" лишь в угоду "общественному мнению", памятуя о диких визгах "очень грамотных, но не очень опытных", ибо случаи бывают оой какие разные :)) Нельзя подогнать всё под одну гребенку.


Последний раз редактировалось BusMaster 11 июл 2019, 22:22, всего редактировалось 1 раз.

Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: system_stm32f10x.c и не стандартная частота кварца.
СообщениеДобавлено: 11 июл 2019, 22:21 
Старожил
Аватара пользователя

Зарегистрирован: 13 янв 2018, 21:36
Сообщения: 1013
BusMaster писал(а):
А вот та паутина дефайнов, предложенная вами - вот там черт ногу сломит.
Что, простите? Как не запускал CTRL-F, так ни одного дефайна и не нашёл. Голый CMSIS.

BusMaster писал(а):
Но если минимизировать усилия по переносу кода из дефолтного в свой, то именно так и будет.
Не верю, ибо работать так оно не будет.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: system_stm32f10x.c и не стандартная частота кварца.
СообщениеДобавлено: 11 июл 2019, 22:24 
Старожил
Аватара пользователя

Зарегистрирован: 22 июл 2017, 11:48
Сообщения: 3646
Эээ, давай-ка без визгов на этот раз. Мы все знаем, "как надо правильно", но далеко не все имеют разносторонний опыт, о котором я написал выше.

Цитата:
Не верю, ибо работать так оно не будет.

Кто это там сказал, что "работать не будет"? В дефолтном виде "от производителя" - работает же! Так что плюньте в того, кто говорит, что дефолт с "лишними" действиями не будет работать :)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: system_stm32f10x.c и не стандартная частота кварца.
СообщениеДобавлено: 11 июл 2019, 22:40 
Старожил
Аватара пользователя

Зарегистрирован: 13 янв 2018, 21:36
Сообщения: 1013
BusMaster писал(а):
Переключение частоты или источника тактирования тянет за собой переключение делителей шин периферии, изменение коэфф.PLL, переключение режимов питания, флеша, индивидуальных предделителей периферии. Да еще и не просто так, а с проверкой условий запуска. Вобщем, пишем только то, что канкретна нада.
А вот тут я полностью согласен. Количество вариантов тактирования в одной прошивке конечно и известно на этапе программирования. Лучше переход из одного состояния в другое чётко описывать самому, а не надеяться на универсальные функции.

BusMaster писал(а):
Кто это там сказал, что "работать не будет"? В дефолтном виде "от производителя" - работает же! Так что плюньте в того, кто говорит, что дефолт с "лишними" действиями не будет работать :)
Лень искать, но никогда не поверю что индус мог написать вот так
Код:
/* делители шин. AHB = 1:1, APB2 = 1:1, APB1 = 1:2 */
    RCC->CFGR = RCC_CFGR_HPRE_DIV1 | RCC_CFGR_PPRE2_DIV1 | RCC_CFGR_PPRE1_DIV2;

    /*  PLL configuration: PLLCLK = HSE * 9 = 72 MHz */
    RCC->CFGR = (uint32_t)(RCC_CFGR_PLLSRC_HSE | RCC_CFGR_PLLMULL9);    // <<-- Вот тут как раз и сидит этот умножитель! HSE * PLLMUL
RCC_CFGR_PPRE1_DIV2 не равно нулю. Вторая запись его обнуляет. Это не будет работать.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: system_stm32f10x.c и не стандартная частота кварца.
СообщениеДобавлено: 11 июл 2019, 22:51 
Старожил
Аватара пользователя

Зарегистрирован: 22 июл 2017, 11:48
Сообщения: 3646
а, про ЭТО? Хе, да эт я просто неправильно перекопипастил :) Обычная очепятка, а ты тут развел "правдорубство" очередное. Тьфуты, епта. Ты че, меня совсем за дурака считаешь, чтоль?
Епт, если уж так докапываться, то посмотри на вот этот текст, епт, и найди тут опечатку :))))
Цитата:
/* Wait till PLL is used as system clock source */


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: system_stm32f10x.c и не стандартная частота кварца.
СообщениеДобавлено: 11 июл 2019, 23:08 
Старожил
Аватара пользователя

Зарегистрирован: 13 янв 2018, 21:36
Сообщения: 1013
Ни разу не видел, чтобы программа не работала из-за ошибки в комментарии, а вот из-за говнокода сколько угодно. Так давай не будем его плодить даже копипастой.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: system_stm32f10x.c и не стандартная частота кварца.
СообщениеДобавлено: 12 июл 2019, 00:19 
Старожил

Зарегистрирован: 11 сен 2012, 11:19
Сообщения: 5690
Вот жеж вы заголосили, и ладно бы это был F4 или F7. Здесь свой инит тактовой писать раз плюнуть...
Вы лучше мне оба два скажите - ковыряли заводские буты в F1?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: system_stm32f10x.c и не стандартная частота кварца.
СообщениеДобавлено: 12 июл 2019, 00:27 
Старожил
Аватара пользователя

Зарегистрирован: 13 янв 2018, 21:36
Сообщения: 1013
Я нет, никогда не прошивал F1 заводским загрузчиком. Либо SWD, либо уже свой.


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 20 ] 

Часовой пояс: UTC + 5 часов


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB