Jump to content

    
Sign in to follow this  
billidean

STM32F4::Discovery -> Помогите с таймером

Recommended Posts

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

Share this post


Link to post
Share on other sites

Да, есть полное соответствие. Ничего больше определять не надо. Разве что частоту резонатора.

А что, на светодиод вывести, что я предложил, не катит? printf - это здорово, но сложнее, чем таймер запустить.

Share this post


Link to post
Share on other sites
Да, есть полное соответствие. Ничего больше определять не надо. Разве что частоту резонатора.

А что, на светодиод вывести, что я предложил, не катит? 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МГц, или я ошибаюсь??

Share this post


Link to post
Share on other sites
А вот почему на "заводе" HSI_VALUE 16000000 поставили, это мне не понятно, вроде для этих кристаллов должна быть внутренняя частота 8МГц, или я ошибаюсь??

В руководстве на F40x показана частота 16000000 MHz.

Share this post


Link to post
Share on other sites
В руководстве на F40x показана частота 16000000 MHz.

Да, нашел это место, спасибо. Тогда получается, что при НЕвызове функции SystemInit() таймер_6 тактируется просто внутренней частотой, а не удвоенной (где-то это вычитал в инете и оказалось, что это обман).

Share this post


Link to post
Share on other sites
Да, нашел это место, спасибо. Тогда получается, что при НЕвызове функции SystemInit() таймер_6 тактируется просто внутренней частотой, а не удвоенной (где-то это вычитал в инете и оказалось, что это обман).

Не совсем...

post-10362-1392280519_thumb.jpg

Share this post


Link to post
Share on other sites

Кстати, нашел еще один параметр, который надо поменять под свой внешний кварц:

#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 в коде не был установлен).

 

Я правильно рассуждаю?

Share this post


Link to post
Share on other sites
Я правильно рассуждаю?

К PLL прескалеры периферийных шин не имеют отношения. В остальном - правильно.

 

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

Нужно открыть Руководство, и медленно водя мышой по битам регистров, осознать их магическое влияние на то или иное... :rolleyes:

Share this post


Link to post
Share on other sites

...да... вместо PLL-prescaler нужно понимать prescaler для шин (АРВ1 и АРВ2), которые задаются в RCC->CFGR.

 

UPD: спасибо за помощь.

 

Сейчас занимаюсь переводом главы USB on-the-go full-speed (OTG_FS) из Референса, Никто не встречал уже переведенной версии(?), иначе жалко будет потраченного времени.

Если перевод не найдется, то постараюсь аккуратно оформить и выложить в сеть.

Edited by billidean

Share this post


Link to post
Share on other sites

Конфигурация тактовой частоты и первоначальных настроек происходит в файле system_stm32f4xx.c, функция SystemInit().

Поищите на сайте такую тулзу STM32F4xx_Clock_Configuration_V1.0.1.xls. Это эксель файл, где вы набором галочек конфигурируйте схему тактирования и вам автоматически генерируется файл system_stm32f4xx.c. Добавляете его в свой проект и все будет работать.

 

P.S. Ссылку дать не могу, поищите на сайте ST

Share this post


Link to post
Share on other sites

а откуда берется двойная частота без PLL? это скорее единичная и половинная...

 

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

 

Share this post


Link to post
Share on other sites
а откуда берется двойная частота без PLL? это скорее единичная и половинная...

см.:

3. В случае, если мы не используем функцию SystemInit(), то мы не запускаем PLL (если, конечно, отдельно не прописали этот запуск), и следовательно: частота у нас используется внутренняя (16МГц), а таймеры тактируются тоже этой же частотой 16МГц (не удвоенной, т.к. PLL-prescaler в коде не был установлен).

и второй вопрос, а нафига переводить? Вы что ее со словарем переводите? Читать сразу на английском не катит? Не конечно здорово когда она есть в русском варианте, все вам спасибо скажут, но столько времени терять....
- дабы иметь под рукой русскую версию при начальной работе над USB (я еще не реализовывал этот интерфейс на СТМ), да и помочь другим начинающим.
Edited by billidean

Share this post


Link to post
Share on other sites

я просто пытался обратить ваше внимание на то что x1 x2 - это значение prescaller, то есть пред делителя, это разделить на 1 или на 2 частоту, а не умножить...

Share this post


Link to post
Share on other sites
я просто пытался обратить ваше внимание на то что x1 x2 - это значение prescaller, то есть пред делителя, это разделить на 1 или на 2 частоту, а не умножить...

Нет, это "умножить". Это для простоты показано. На самом деле, надо думать, при x2 подается удвоенная частота, с PLL (которая работает, для максимальной рабочей, на удвоенной 168 MHz, а не на 168 MHz). Может, я нафантазировал... может, просто не делится на 2, 4, 8 после прескалера, а делится на 1, 2, 4.

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this