Администрация форума не несёт ответственности за достоверность информации и оставляет за собой право редактировать или в особых случаях даже удалять посты без предупреждения. Спасибо за понимание.

Программирование ATMEL в BASCOM.

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » Программирование ATMEL в BASCOM. » Не пора ли нам попробовать ARM? » Разгон микроконтроллера


Разгон микроконтроллера

Сообщений 1 страница 13 из 13

1

Микроконтроллер как и процессор компьютера можно разогнать. :) И как в случае с процессором компа есть как минимум два способа разгона - увеличением частоты внешнего тактового генератора (в компе эквивалент этому поднятие частоты шины FSB) или увеличение множителя. Применительно к МК первый вариант не очень удобный, т. к. требует подбора кварцевого резонатора, а второй удобнее, т. к. не меняя резонатор можно получить нужную частоту. :)
Посмотрим на фрагмент системы тактирования STM32F030F4P6. Фирма ST заявляет что у этого МК максимальная частота ядра 48 МГц.

http://s7.uploads.ru/tcUBA.png

На картинке показан путь тактового сигнала и его частота в ключевых точках, которые устанавливаются по умолчанию при инициализации МК. Видно что тактовая частота с генератора HSE (высокочастотный внешний генератор) через переключатель "PLL Source Mux" поступает в модуль PLL, который умножает частоту на заданное значение (в пределах 1 - 16), в данном случае на 6. На его выходе частота 48 МГц, которая поступает на еще один переключатель "System Clock Mux", после которого идет на ядро процессора и периферийные шины.
Думаю уже догадались что для разгона микроконтроллера нужно увеличить умножение частоты в модуле PLL. :)
Это можно сделать как при инициализации МК так и в процессе его работы. Последнее интересно тем, что можно динамически управлять частотой ядра и периферии, повышая частоту когда нужна высокая производительность или понижая когда важна экономия электроэнергии. Периферия также тактируется от ядра, но у нее есть делители частоты и если в результате разгона она начнет сбоить, то можно ей снизить частоту, сохранив высокую частоту ядра. :)

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

http://s9.uploads.ru/F0cR4.gif

По миганию светодиода будем определять что МК все еще нормально работает.

Тестовый код.

Код:
int main(void)
{

    Overclocking();          // Разгон микроконтроллера.

    SysTim_Init(100);        // Инициализация системного таймера.

    RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOB, ENABLE); // Включаем тактирование порта PB.

    {
        GPIO_InitTypeDef GPIO_InitStruct;

        GPIO_InitStruct.GPIO_Pin = GPIO_Pin_1;      // Настройка вывода PB1.
        GPIO_InitStruct.GPIO_Mode = GPIO_Mode_OUT;  // Вывод работает как выход.
        GPIO_InitStruct.GPIO_OType = GPIO_OType_PP; // Двухтактный выход (т. е. не открытый сток).
        GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_NOPULL; // Подтягивающие резисторы отключены.
        GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;

        GPIO_Init(GPIOB, &GPIO_InitStruct);  // Инициализация порта.
    }

    while(1)
    {
        GPIO_SetBits(GPIOB, GPIO_Pin_1); // Лог. 1 на выходе PB1.
        SysTim_DelayMS(500); // Ждем 500 миллисекунд.
        GPIO_ResetBits(GPIOB, GPIO_Pin_1); // Лог. 0 на выходе PB1.
        SysTim_DelayMS(500); // Ждем 500 миллисекунд.
    }
}

Код довольно простой. Сначала вызывается функция разгона МК (будет рассмотрена позже), потом настраивается системный таймер на 100 прерываний в секунду, используемый для формирования задержек и отсчета времени. Затем включается тактирование порта GPIOB и настраивается вывод PB1 на выход. После в цикле каждые 500 миллисекунду включается и выключается светодиод.
Прежде чем рассматривать код функции Overclocking() посмотрим на рисунок тактирования МК. Для разгона нужно увеличить множитель PLL. Чем он будет больше тем выше частота ядра. Допустимые значения от 1 до 16, что дает теоретическую возможность разогнать МК до 128 МГц при 8 МГц-овом кварце. Но есть один нюанс - на момент начала выполнения функции Overclocking() умножитель частоты уже активен и через него тактируется ядро МК с периферией, а значит просто так поменять множитель не получится. Сперва необходимо отключить умножитель, а затем менять множитель. Если при той цепочке тактирования что есть сейчас попытаться его отключить то ничего из этого не выйдет. Сперва нужно изменить цепочку тактирования исключив из нее умножитель. Взглянув на картинку тактирования становится очевидно что для этого потребуется изменить состояние переключателя "System Clock Mux", выбрав тактовым сигналом HSI или HSE. После уже можно выключить умножитель и изменить множитель. Включать нужно в обратном порядке - сначала включаем умножитель, а затем переключаем источник тактового сигнала в "System Clock Mux" на PLL. :)
Собственно функция Overclocking() именно это и делает.

Код:
void Overclocking(void) // Разгон микроконтроллера.
{
  RCC_HSICmd(ENABLE); // Включаем внутренний RC генератор.
  RCC_SYSCLKConfig(RCC_SYSCLKSource_HSI); // Выбираем источником такторования внутренний RC генератор.
  RCC_PLLCmd(DISABLE); // Выключаем умножитель частоты.
  RCC_PLLConfig(RCC_PLLSource_HSE, RCC_CFGR_PLLMULL12); // На сколько будем умножать частоту.
  RCC_PLLCmd(ENABLE); // Включаем умножитель частоты.
  while ((RCC->CR & RCC_CR_PLLRDY) == 0);     // Ждем запуска умножителя частоты.
  RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK); // Выбираем источником такторования умножитель частоты.

  SystemCoreClockUpdate(); // Вычисление тактовой частоты ядра.
}

Мои эксперименты с разгоном показали следующее: МК стабильно работает до частоты 96 МГц, т. е. до умножения на 12 при исходной  частоте 8 МГц. Дальнейшее повышение частоты сперва приводило к нестабильной работе с последующим сваливанием в прерывание HardFault (прерывание происходит при серьезной "железной" ошибке) и чем больше частота без быстрее происходил сбой. При частоте 112 МГц еще кое-как работала отладка, а при дальнейшем увеличении частоты, отладка уже не функционировала. Из этого можно сделать вывод что в случае необходимости МК можно разогнать до почти 100 МГц, что неплохо для микроконтроллера стоимостью 40 центов или 28 рублей по текущему курсу. :D

Файлы. http://pure-basic.narod.ru/forum_files/ … ocking.zip

+3

2

Возможно кому-то будет интересно сколько потребляет микроконтроллер при разной тактовой частоте ядра и периферии.
Проверил потребление на нескольких частотах и результаты таковы (без учета потребления светодиода).

Частота - Потребление
16 МГц - 3.8 мА.
48 МГц - 10 мА.
96 МГц - 18.5 мА

Если в функции SysTim_DelayMS() на время задержки переводить МК в режим Sleep (остановлен только процессор, а вся включенная периферия продолжает работать) то потребление тока становится таким.

Частота - Потребление
16 МГц - 2.2 мА.
48 МГц - 5 мА.
96 МГц - 9.2 мА

По моему хороший результат особенно если сравнивать с мегами. :tomato:  Помню раньше измерял сколько потребляет ATmega8 при тактировании от кварца на 12 МГц.  Потребляла если не ошибаюсь около 15 мА. :dontknow:

+1

3

Пётр написал(а):

МК можно разогнать до почти 100 МГц

Маньяк !

+1

4

100 МГц это не предел. Некоторые МК серии STM32 штатно работают на частотах больше 200 МГц. :)  В разгоне будет еще выше! :)

0

5

)))))))

0

6

Пётр написал(а):

100 МГц это не предел. Некоторые МК серии STM32 штатно работают на частотах больше 200 МГц.   В разгоне будет еще выше!

Маниакальный извращенец !  :cool:

0

7

Главное чтобы были мегагерцы, а применение им найдем. :D

0

8

STM32F103C8T6 удалось успешно разогнать до 136 МГц. Работает стабильно. Дальнейшему разгону мешает относительно низкая часта кварца - 8МГц, которую можно умножить максимум на 17... :dontknow:  Кстати этот коэффициент умножения не документирован. Официально доступно умножение только до 16.
Если перепаять кварц на более высокочастотный, думаю дальнейший разгон будет удачным. :)

0

9

Пётр написал(а):

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

Как успехи с 20 МГц кварцем, да на 17 ?

Даёшь 340 МГц !?

0

10

ещё eeprom проверяй, работает или нет на такой частоте (впрочем если с задержками..)

0

11

sasha_1973 написал(а):

Как успехи с 20 МГц кварцем

Допустимо максимум 16. Пока не перепаивал.

sasha_1973 написал(а):

Даёшь 340 МГц !?

Столько наверное не потянет. :D

RDW написал(а):

ещё eeprom проверяй

EEPROM нет (кроме серии STM32L). А flash работает. Из нее выполняется прошивка.

0

12

Пётр написал(а):

Пока не перепаивал.

Перепаял поставив 16 МГц. Но дальше МК разгонятся не захотел. Уже при частоте 144 МГц начинал работать нестабильно через несколько секунд.

Заодно проверил сколько потребляет STM32F030F4P6 в экономичном STANDBY режиме. Вместе с часами реального времени (тактируется от внутреннего RC генератора с частотой 40 кГц) потребление составило 5 мкА.

+1

13

Протестировал STM32G030 на разгон и потребление. Эти МК позиционируются как бюджетные, производительные и низкопотребляющие.
Результаты таковы.
Без перехода в Sleep.

Код:
Частота - Потребление
16 МГц  - 1.2 мА
48 МГц  - 3.5 мА
64 МГц  - 4.4 мА
96 МГц  - 6.4 мА
128 МГц - 8.4 мА

С переходом в Sleep (ядро отключено, а все остальное работает).

Код:
Частота - Потребление
16 МГц  - 0.6 мА
48 МГц  - 1.7 мА
64 МГц  - 2.0 мА
96 МГц  - 2.8 мА
128 МГц - 3.6 мА

Номинальная частота 64 МГц. То что выше это разгон.
Если сравнить с результатами из сообщения 2 ток действительно меньше.
Серия G0 это объединение F0 и L0 (видимо с переходом на более тонкий техпроцесс чем объясняется меньшее потребление при большей частоте). То есть производительность даже превышает F0, но при этом есть расширенные функции экономии энергии из серии L0 (Sleep это только одна из возможный обеспечивающая минимальную экономию).

Кому интересно можете прочитать статью на компэле.
https://www.compel.ru/lib/131770?utm_so … term=part1
https://www.compel.ru/lib/132561?utm_so … term=part2
https://www.compel.ru/lib/133135?utm_so … term=part3

+2


Вы здесь » Программирование ATMEL в BASCOM. » Не пора ли нам попробовать ARM? » Разгон микроконтроллера