Easyelectronics.ru

Электроника для всех
Текущее время: 25 май 2020, 23:58

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



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

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

Зарегистрирован: 11 июл 2019, 11:13
Сообщения: 11
Здравствуйте. 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
Сообщения: 2566
Есть утилита (файл экселя с макросами) - она генерит файл 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
Сообщения: 11
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
Сообщения: 2870
там изменить то только один дефайн, с 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
Сообщения: 11
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
Сообщения: 2870
Единственное на что явно влияет HSE_VALUE - это на Flash Latency. Всё остальное ручками. Достаточно пробежаться по файлу system_stm32f10x.c и посмотреть где там используется HSE_VALUE. А поидее вообще надо весь это system_ выкинуть и написать свой, куда компактнее, там реально не нужно всё.


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

Зарегистрирован: 22 июл 2017, 11:48
Сообщения: 4198
Откуда: Чобля - долбаный кетайец
А нынче наверно умножение и деление на калькуляторе уже и не проходят?
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
Сообщения: 11
BusMaster писал(а):
HSE_VALUE влияет на правильность работы функции SystemCoreClockUpdate.


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

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


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

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


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

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


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


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

Зарегистрирован: 22 июл 2017, 11:48
Сообщения: 4198
Откуда: Чобля - долбаный кетайец
И даже более того, чтобы не путаться в этой каше, поставляемой по дефолту, вы можете написать собственный 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
Сообщения: 1430
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
Сообщения: 4198
Откуда: Чобля - долбаный кетайец
Тише, тише. Мы все знаем, как надо правильно. Но если минимизировать усилия по переносу кода из дефолтного в свой, то именно так и будет. А вот та паутина дефайнов, предложенная вами - вот там черт ногу сломит.
Кстати, я давно отказался от универсального файла на все случаи жизни. Поскольку случаи бывают чаще всего какие-то специфические, под которые, один хрен, приходится писать так, как надо именно в этом случае. Всё чаще в моей практике попадаются задачи с динамическим управлением тактовой частотой и питанием. Переключение частоты или источника тактирования тянет за собой переключение делителей шин периферии, изменение коэфф.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
Сообщения: 1430
BusMaster писал(а):
А вот та паутина дефайнов, предложенная вами - вот там черт ногу сломит.
Что, простите? Как не запускал CTRL-F, так ни одного дефайна и не нашёл. Голый CMSIS.

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


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

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

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

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


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

Зарегистрирован: 13 янв 2018, 21:36
Сообщения: 1430
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
Сообщения: 4198
Откуда: Чобля - долбаный кетайец
а, про ЭТО? Хе, да эт я просто неправильно перекопипастил :) Обычная очепятка, а ты тут развел "правдорубство" очередное. Тьфуты, епта. Ты че, меня совсем за дурака считаешь, чтоль?
Епт, если уж так докапываться, то посмотри на вот этот текст, епт, и найди тут опечатку :))))
Цитата:
/* Wait till PLL is used as system clock source */


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

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


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

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


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

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


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


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


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

Сейчас этот форум просматривают: BARS_, Eddy_Em, x893, Порфирий


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

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

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