Golikov 0 13 февраля, 2014 Опубликовано 13 февраля, 2014 · Жалоба ага про него. Посмотрите какой проц в итоге определен, посмотрите сходиться ли это с вашим процом (смотрите все, там участвует и размер флэши и все), а заодно чем равны делители выставляющие частоту. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 13 февраля, 2014 Опубликовано 13 февраля, 2014 · Жалоба Да, есть полное соответствие. Ничего больше определять не надо. Разве что частоту резонатора. А что, на светодиод вывести, что я предложил, не катит? printf - это здорово, но сложнее, чем таймер запустить. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
billidean 0 13 февраля, 2014 Опубликовано 13 февраля, 2014 · Жалоба Да, есть полное соответствие. Ничего больше определять не надо. Разве что частоту резонатора. А что, на светодиод вывести, что я предложил, не катит? printf - это здорово, но сложнее, чем таймер запустить. И светодиод задействую, по-необходимости, но это всё все-равно будет только вечером, дома. А пока на работе есть время поразбирать/подготовить какие-либо коды, в том числе и использование printf'a (он потом все-таки пригодится, и чем быстрее я его зпущу, тем проще будет дальнейшая жизнь и отладка). По настройкам: #if !defined (HSE_VALUE) /** * @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. */ #define HSE_VALUE ((uint32_t)25000000) /*!< Value of the External oscillator in Hz */ #endif /* HSE_VALUE */ /** * @brief In the following line adjust the External High Speed oscillator (HSE) Startup Timeout value */ #if !defined (HSE_STARTUP_TIMEOUT) #define HSE_STARTUP_TIMEOUT ((uint16_t)0x0500) /*!< Time out for HSE start up */ #endif /* HSE_STARTUP_TIMEOUT */ #if !defined (HSI_VALUE) #define HSI_VALUE ((uint32_t)16000000) /*!< Value of the Internal oscillator in Hz*/ #endif /* HSI_VALUE */ Здесь 25000000 нужно заменить на 8000000 (внешний кварц 8МГц вроде стоит). HSE_STARTUP_TIMEOUT - менять думаю не стоит. А вот почему на "заводе" HSI_VALUE 16000000 поставили, это мне не понятно, вроде для этих кристаллов должна быть внутренняя частота 8МГц, или я ошибаюсь?? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 13 февраля, 2014 Опубликовано 13 февраля, 2014 · Жалоба А вот почему на "заводе" HSI_VALUE 16000000 поставили, это мне не понятно, вроде для этих кристаллов должна быть внутренняя частота 8МГц, или я ошибаюсь?? В руководстве на F40x показана частота 16000000 MHz. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
billidean 0 13 февраля, 2014 Опубликовано 13 февраля, 2014 · Жалоба В руководстве на F40x показана частота 16000000 MHz. Да, нашел это место, спасибо. Тогда получается, что при НЕвызове функции SystemInit() таймер_6 тактируется просто внутренней частотой, а не удвоенной (где-то это вычитал в инете и оказалось, что это обман). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 13 февраля, 2014 Опубликовано 13 февраля, 2014 · Жалоба Да, нашел это место, спасибо. Тогда получается, что при НЕвызове функции SystemInit() таймер_6 тактируется просто внутренней частотой, а не удвоенной (где-то это вычитал в инете и оказалось, что это обман). Не совсем... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
billidean 0 13 февраля, 2014 Опубликовано 13 февраля, 2014 · Жалоба Кстати, нашел еще один параметр, который надо поменять под свой внешний кварц: #define PLL_M 25, нужно сделать 8. Не совсем... Так, немного подсоберу все в одну картину: 1. В функции SystemInit() происходит настройка частот системы и PLL на 168МГц(при работе с внешним кварцем), при условии установки правильных дефайнов (HSE_VALUE, PLL_M, и может еще каких..). 2. Если в настройках PLL параметр prescaler не равен 1, то таймеры (на шинах APBx) тактируются удвоенной частотой, иначе НЕудвоенной(прямой). 3. В случае, если мы не используем функцию SystemInit(), то мы не запускаем PLL (если, конечно, отдельно не прописали этот запуск), и следовательно: частота у нас используется внутренняя (16МГц), а таймеры тактируются тоже этой же частотой 16МГц (не удвоенной, т.к. PLL-prescaler в коде не был установлен). Я правильно рассуждаю? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 13 февраля, 2014 Опубликовано 13 февраля, 2014 · Жалоба Я правильно рассуждаю? К PLL прескалеры периферийных шин не имеют отношения. В остальном - правильно. Хороший пример того, что использование библиотечных функций не дает понимания работы узлов микроконтроллера. Нужно открыть Руководство, и медленно водя мышой по битам регистров, осознать их магическое влияние на то или иное... :rolleyes: Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
billidean 0 13 февраля, 2014 Опубликовано 13 февраля, 2014 (изменено) · Жалоба ...да... вместо PLL-prescaler нужно понимать prescaler для шин (АРВ1 и АРВ2), которые задаются в RCC->CFGR. UPD: спасибо за помощь. Сейчас занимаюсь переводом главы USB on-the-go full-speed (OTG_FS) из Референса, Никто не встречал уже переведенной версии(?), иначе жалко будет потраченного времени. Если перевод не найдется, то постараюсь аккуратно оформить и выложить в сеть. Изменено 13 февраля, 2014 пользователем billidean Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
topkin 0 13 февраля, 2014 Опубликовано 13 февраля, 2014 · Жалоба Конфигурация тактовой частоты и первоначальных настроек происходит в файле system_stm32f4xx.c, функция SystemInit(). Поищите на сайте такую тулзу STM32F4xx_Clock_Configuration_V1.0.1.xls. Это эксель файл, где вы набором галочек конфигурируйте схему тактирования и вам автоматически генерируется файл system_stm32f4xx.c. Добавляете его в свой проект и все будет работать. P.S. Ссылку дать не могу, поищите на сайте ST Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Golikov 0 13 февраля, 2014 Опубликовано 13 февраля, 2014 · Жалоба а откуда берется двойная частота без PLL? это скорее единичная и половинная... и второй вопрос, а нафига переводить? Вы что ее со словарем переводите? Читать сразу на английском не катит? Не конечно здорово когда она есть в русском варианте, все вам спасибо скажут, но столько времени терять.... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
billidean 0 13 февраля, 2014 Опубликовано 13 февраля, 2014 (изменено) · Жалоба а откуда берется двойная частота без PLL? это скорее единичная и половинная... см.: 3. В случае, если мы не используем функцию SystemInit(), то мы не запускаем PLL (если, конечно, отдельно не прописали этот запуск), и следовательно: частота у нас используется внутренняя (16МГц), а таймеры тактируются тоже этой же частотой 16МГц (не удвоенной, т.к. PLL-prescaler в коде не был установлен). и второй вопрос, а нафига переводить? Вы что ее со словарем переводите? Читать сразу на английском не катит? Не конечно здорово когда она есть в русском варианте, все вам спасибо скажут, но столько времени терять.... - дабы иметь под рукой русскую версию при начальной работе над USB (я еще не реализовывал этот интерфейс на СТМ), да и помочь другим начинающим. Изменено 13 февраля, 2014 пользователем billidean Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Golikov 0 13 февраля, 2014 Опубликовано 13 февраля, 2014 · Жалоба я просто пытался обратить ваше внимание на то что x1 x2 - это значение prescaller, то есть пред делителя, это разделить на 1 или на 2 частоту, а не умножить... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 13 февраля, 2014 Опубликовано 13 февраля, 2014 · Жалоба я просто пытался обратить ваше внимание на то что x1 x2 - это значение prescaller, то есть пред делителя, это разделить на 1 или на 2 частоту, а не умножить... Нет, это "умножить". Это для простоты показано. На самом деле, надо думать, при x2 подается удвоенная частота, с PLL (которая работает, для максимальной рабочей, на удвоенной 168 MHz, а не на 168 MHz). Может, я нафантазировал... может, просто не делится на 2, 4, 8 после прескалера, а делится на 1, 2, 4. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Golikov 0 13 февраля, 2014 Опубликовано 13 февраля, 2014 · Жалоба ну типа того, в общем периферия системную частоту не обгонит:) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться