proton8489

Системная частота SystemCoreClock

20 сообщений в этой теме

proton8489    2

Дорогие гуру, прошу помощи в освоении SystemCoreClock. Как я понимаю это некая функци в STM32, которая возвращает значение установившейся частоты микроконроллера. Но при прямом использовании IAR ругается на то, что эта функция не объявлена. Конечно можно использовать SPL, но мне крайне необходима максимальная скорость и микрозадержки, поэтому хочется получать значение частоты без SPL и HAL. Спасибо за любую наводку.

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


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

Интересно, а как МК может узнать на какой частоте он работает ?
Как Вы себе это представляете ?

 

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


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

Возможно и никак, но согласно документации это значение обновляется с помощью функции SystemCoreClockUpdate при изменении частоты тактирования МК.

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


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

Скорее всего, где-нибудь в каком то модуле имеется обычная статическая переменная, которая с помощью этих функций устанавливается и считывается. Сам по себе МК не может узнать частоту тактирования. 
Чисто теоретически, можно, но для этого нужно иметь ещё одну некую опорную частоту.
 

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


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

Хорошо, допустим. Тогда вопрос такой: я устанавливаю некую частоту МК через PLL, как мне убедиться в том, что она к примеру 72МГц, а не 24, совсем никак?

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


Ссылка на сообщение
Поделиться на других сайтах
Alex    566
2 минуты назад, proton8489 сказал:

совсем никак?

 

8 минут назад, Aleх сказал:

Чисто теоретически, можно, но для этого нужно иметь ещё одну некую опорную частоту.

 

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


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

Ну на самом деле можно считать биты конфигурации и определить состояние делителей / ФАПЧ. Кроме того, в stm32 часто есть дополнительная частота.

Но да, в HAL значение такта определено дефайном при конфигурации и функция вернет дефайн.

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


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

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

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


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

Вообще-то МК стартует с внутреннего генератора 8МГц и только после конфигурации переходит на выбранный режим тактирования.

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


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

Возможно но

11 минуту назад, Геннадий сказал:

Вообще-то МК стартует с внутреннего генератора 8МГц и только после конфигурации переходит на выбранный режим тактирования.

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

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

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


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

@Skyluck В стартап загляни, она железно стартует от RC генератора, а потом уже как программа скажет. Многие из стартапа выкидывают инициализацию системы тактирования и пишут свою более быструю.

@proton8489 неужели ты не знаешь на какой частоте после инициализации будет работать твой МК? придумай дефайн.

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


Ссылка на сообщение
Поделиться на других сайтах
dosikus    11
В 22.05.2017 в 22:10, Alex сказал:

 Сам по себе МК не может узнать частоту тактирования. 

 

С чего это? Кварц известен, флаги готовности осциляторов, PLL, и множители/делители доступны для чтения. И ?

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


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

Народ теме год. ТСу уже не надо!

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


Ссылка на сообщение
Поделиться на других сайтах
proton8489    2
2 часа назад, semic сказал:

Народ теме год. ТСу уже не надо!

:lol: И снова здравствуйте. Я за это время подрос в stm32 и даже узнал, что существует специальное прерывание NMI_Handler, которое вызывается, если HSE отваливается. 

PLL давно в строю, но заметил одну особенность, а скорее баг. MCO должен выдавать частоту проца/2. Я делаю 8*9/1, по идее на MCO должно быть 36 МГц, но там 18, святой осцил не даст соврать.

Подскажите, что не так?

frec.c

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


Ссылка на сообщение
Поделиться на других сайтах
Alex    566
16 часов назад, dosikus сказал:

С чего это? Кварц известен, флаги готовности осциляторов, PLL, и множители/делители доступны для чтения. И ?

Ну вот к чему это, Лёх ? Тему с вопросами ТС прочитай нормально, а не поперёк.

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


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

@proton8489 что-то не так в коде, что ж еще не так. Да только найдуться ли люди которые будут его отлаживать вместо тебя неизвестно. с MCO вроде проблем нет в железе.

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


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

proton8489, если проект в Keil или IAR - выкладывай  минимальный . В наличии 2 дискаверины VL . Одна с 100RB другая с 103RE.

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


Ссылка на сообщение
Поделиться на других сайтах
snn_krs    32
On 5/7/2018 at 11:06 PM, proton8489 said:

PLL давно в строю, но заметил одну особенность, а скорее баг. MCO должен выдавать частоту проца/2. Я делаю 8*9/1, по идее на MCO должно быть 36 МГц, но там 18

Код не полный, поэтому трудно сказать точно, но в коде есть такая строка

    RCC->CFGR |= PLL_HSE_REG |                            // PLL source = PREDIV1
                 PLL_HSE_DIV2_REG |                       // HSE / 2
                 reg_spd;                                 // Умножать частоту на PLLMUL 

На вход  PLL поступает HSE / 2 = 4 MHz.

Получается PLL_CLK = 8*9/2 = 36 MHz и МСО = PLL_CLK / 2 = 18 MHz.

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


Ссылка на сообщение
Поделиться на других сайтах
proton8489    2
22 часа назад, snn_krs сказал:

Код не полный, поэтому трудно сказать точно, но в коде есть такая строка


    RCC->CFGR |= PLL_HSE_REG |                            // PLL source = PREDIV1
                 PLL_HSE_DIV2_REG |                       // HSE / 2
                 reg_spd;                                 // Умножать частоту на PLLMUL 

На вход  PLL поступает HSE / 2 = 4 MHz. 

Этобомба! ))) Спасибо, для эксперимента вначале сам себе этот камень заложил, а по невнимательности каждый раз спотыкаюсь. 

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


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

Ваша публикация должна быть проверена модератором

Гость
Вы не авторизованы. Если у вас есть аккаунт, пожалуйста, войдите.
Ответить в тему...

×   Вставлено в виде отформатированного текста.   Восстановить форматирование

  Разрешено не более 75 смайлов.

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

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

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

Загрузка...

  • Похожие публикации

    • Автор: Prominence
      Здравствуйте, в силу поставленных передо мной ограничений (на плате нет внешнего резонатора), я вынужден пытаться запустить STM32F103 от внутреннего тактирования, да ещё и под 72МГц.
      Правильный ли код?
          RCC_DeInit();  //Сброс
          RCC_HSEConfig(RCC_HSE_OFF); //Выключение внешнего тактирования (на всякий случай)
          RCC_PLLConfig( RCC_PLLSource_HSI_Div1, RCC_PLLMul_9); //использование множителя 9 для получения 72МГц, но компилятор ругается на делитель Div1
      Дескать, минимум можно использовать Div2, а совсем без делителя нельзя, как ещё можно выставить множитель?

          RCC_PLLCmd( ENABLE); //Включение PLL как такового
          RCC_SYSCLKConfig( RCC_SYSCLKSource_PLLCLK); //Использование PLL в качестве основного источника тактирования
      Вышеперечисленная шняга будет вызываться в мэйне, но это совсем другая история, пока что с этим туплю.
    • Автор: Djanger
      Приобрёл "NUCLEO-F030R8, Отладочная плата на базе MCU STM32F030R8T6 (ARM Cortex-M0), ST-LINK/V2-1, Arduino-интерфейс"  хочу приобрести два модуля к ней но не знаю о совместимости , кого спрашиваю сомневаются и не отвечают уверенно, 1 модуль это 3,2 TFT ЖК дисплей сенсорный , а второй 8 бит LED 8 бит цифровой Tube 8-разрядный ключ. Кто что может подсказать или посоветовать прошу помочь 


    • Автор: alexmurphy
      Здравствуйте!

      Разовая работа для программистов из Москвы или московской области.

      Необходимо написать прошивку для отладочной платы на базе чипа BMI055
      Даташит: https://www.mouser.com/ds/2/783/BST-BMI055-DS000-08-786482.pdf

      Более подробное ТЗ вышлю кандидату.
      Железо предоставлю.
      Оплата по договоренности.

      При успешном выполнении, будут регулярные заказы, а также трудоустройство при желании, конкурентная зп по Москве.

      Если заинтересованы, просьба в комментах или в ЛС оставить контакты для связи.
    • Автор: Smith2007
      Исследую платку stm32f103c8t6.
      В качестве ide - Keil mVision v5.
      Проект на Си++
      При работе с UART мне требуется вывести некоторую информацию. Делаю это при помощи следующих функций:
      void USARTSend(char *ptrOutBuf) { while (*ptrOutBuf) { USART_SendData(USART1, *ptrOutBuf++); while(USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET) {} } } void USARTSend(int val) { int i = 0; sprintf(buffer, "%x", val); while (buffer[i]) { USART_SendData(USART1, buffer[i]); i++; while(USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET) {} } } void USARTSend(const unsigned char *ptrOutBuf) { while (*ptrOutBuf) { USART_SendData(USART1, *ptrOutBuf++); while(USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET) { } } } В некоторых строках вывожу текст следующим вызовом:
      USARTSend("\r\nUSART1 is ready.\r\n"); Компилируется без ошибок.
      Вывод сообщений в UART тоже без ошибок.
      Но в редакторе кода Keil  на против последней записи появляется значок warning!

      Код выполняется верно

       
      Как можно избавиться от неприятного предупреждения?
    • Автор: K.A.
      Добрый день. Пытаюсь собрать тахометр на stm32f100c8t6b. Вывод информации - четырехразрядный семисегментный индикатор, счетчик - таймер №1, 1ый канал. На системном таймере висит индикация показаний. Вычисление оборотов - в обработчике таймера 1. Проблема в том, что при подаче импульсов на PB13 (Tim1 Ch1) не происходит прерывания. Скажите, пожалуйста, что я упускаю из виду. Заранее большое спасибо.
       
       
      Taho_2.rar