Недостаток STM32F103 до 48 МГц

Petertumler
Чт 24 сентября 2015 г. 10:58 утра
Привет, я пытаюсь поднять STM32F103 (Maple Mini) до 48 МГц (по причинам энергоэффективности). В соответствии с таблицей данных (http: // www.ул.com/st-web-ui/static/acti ... 171190.PDF, Раздел 7.2) Это должно быть возможно. Я нашел Алради несколько постов о разгоне (http: // www.STM32duino.com/viewtopic.PHP ... 432&P = 4049) и соответствующий фрагмент кода (https: // Gist.GitHub.com/bnewbold/407140). У кого -то из вас уже есть опыт работы с Nearclocking и, возможно, с помощью рабочего кода Snapplet? Помимо установки PLL Prescaler на 6 в rcc_cfgr и установление F_CPU на платформе.TXT/Доски.TXT до 48000000, которые необходимы дополнительные шаги? Спасибо за вашу помощь. Петр

victor_pv
Чт 24 сентября 2015 г., 13:11
Я успешно снялся.
Вам нужно сделать 2 вещи:
Установите множитель PLL на 6
Установите USB Peripheral Divider /1

Это все для MCU, чтобы бежать в 48. Тогда вам могут понадобиться некоторые другие корректировки для времени и сериала, но вы получите Serialusb на 48 с только изменениями выше.

Найдите это 2 строки в boards_setup:
#define board_rcc_pllmul rcc_pllmul_9
и
RCC_SET_PRESCALER (RCC_PRESCALER_USB, RCC_USB_SYSCLK_DIV_1_5);

И изменить их на:
#define board_rcc_pllmul rcc_pllmul_6
и
RCC_SET_PRESCALER (RCC_PRESCALER_USB, RCC_USB_SYSCLK_DIV_1);

Последний, но тем не менее важный. Убедитесь, что вы используете самое последнее ядро, загруженное из репо Роджера, так как мы внесли несколько изменений для работы. Я добавил несколько вещей, и Роджер добавил тонну.

Стевех
Чт 24 сентября 2015 г. 15:50
Легкая техника сэкономить большую мощность

Я использую код C WFI()

victor_pv
Пт 25 сентября 2015 г. 12:59
Я также отключил бы каждое периферийное устройство, которое вам не нужно в вашем коде.
Libmaple устанавливает часы для большинства, если не все из них (SPIS, UARTS, USB и т. Д.).
Если вы отключите их часы, они не используют никакой власти. Таблица данных показывает энергопотребление в различных режимах сна, скорости и периферийных устройствах или отключении.
Я добавил эту функцию в ядро, чтобы отключить часы, чтобы иметь возможность изменить множитель USB после того, как он включен загрузчиком:
rcc_clk_disable (rcc_usb)

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

Существует еще одна поток о режимах с низкой мощностью, которая показывает некоторые сбережения, используя WFI, как STEVECH, рекомендованный. Если вы используете регулятор напряжения с низким уровнем покоя, он может творить чудеса.

Ахулл
Солнце 25 октября 2015 г. 1:35
Я не был уверен, публиковать ли это здесь или в разделе фрагментов кода, но вот сжатая версия некоторых работ, которые я выполнил по режимам низкой мощности за последние несколько дней.

Эскиз не делает ничего особенно полезного, он просто отслеживает PIR или другой переключатель и делает светодиодную реакцию в соответствии с триггером, который он видит из переключателя. Очевидно, эта идея может быть расширена. Цифры сохранения мощности находятся в комментариях в начале кода. Я добавил функцию infableclocks (), которая, по -видимому, работает, но значительно не снижает мощность.

Без сохранения питания эскиз использует >46 мА или более с экономией питания падает до 12 мА, поэтому он падает примерно до 26% от полной мощности.
Задача теперь заключается в том, чтобы сжать еще несколько сбережений MA, не выходя из режима (DeepSleep).

Мне также нужно работать над тем, чтобы восстановить часы обратно до 72 МГц плавно, без сброса, так как мои попытки до сих пор были немного хитом и пропуска.

Для того, что стоит режим DeepSleep, значительно снижает мощность, но когда мы просыпаемся, доска сбрасывается. Это не идеально для некоторых сценариев, но было бы совершенно нормально для моего триггера камеры Sunset.
// STM32_PIR_Blink - Simple Low Power demo using a PIR or other "button" // // Board speed is reduced to 8MHz, sketch responds to interrupt on pin BOARD_BUTTON and changes the state of the LED. // // At 72 MHz, the sketch consumes between 44.3mA and 46.5mA // Slowing the clock and using WFI, the sketch consumes ~12mA - around 4mA of this will be the voltage regulator + the power LED, // so the STM32F103R8T6 used for testing was only drawing about 8mA, while still running 32 bit ARM code at 8MHz. Not too shabby. // // Ensure you set the correct mode for the input, depending on your "button", one of INPUT, INPUT_PULLUP or INPUT_PULLDOWN // Ths sketch was tested with with a button to ground (set the type to INPUT_PULLUP), and also with an HC-SR591 PIR (set the type to INPUT) // HC-SR591 PIR => http://www.ebay.com/sch/i.html?_from=R40&_sacat=0&_sop=15&_nkw=hc-sr501%20pir%20motion%20sensor&rt=nc&LH_BIN=1&_trksid=p2045573.m1684 // These will generally operate down to 3.3V. Output *should* be 3.3 safe with VCC <20V, but check the spec. of the PIR or you may release the magic smoke. // Defined for power and sleep functions pwr.h and scb.h #include #include int BOARD_LED_PIN = PB0; int BOARD_BUTTON = PA15; //int but = PA4; volatile bool buttonInterruptFlag = false; void buttonInterrupt() { buttonInterruptFlag = true; } void setup() { // Slow down to 8MHz (current drops to ~ 18mA clockARM8(); disableClocks(); pinMode(BOARD_LED_PIN, OUTPUT); digitalWrite(BOARD_LED_PIN, 1); delay(1000); pinMode(BOARD_BUTTON, INPUT); attachInterrupt(BOARD_BUTTON, buttonInterrupt, CHANGE); } void loop() { // WFI - current drops to ~12mA asm("wfi"); if (buttonInterruptFlag) { // Someone pressed or released the button... Do stuff... wake up the dog, photgraph the wild life, switch on the air raid siren.. or whatever. toggleLED(); buttonInterruptFlag = false; } } void toggleLED() { digitalWrite(BOARD_LED_PIN, (!digitalRead(BOARD_LED_PIN))); } void clockARM8() { // Switch to the 8MHz external clock. We loose USB, but we consume 2/3 less power. rcc_switch_sysclk(RCC_CLKSRC_HSE); } void disableClocks() { // Disable all peripheral clocks except GPIOA, GPIOB and TIMER1 rcc_clk_disable(RCC_ADC1); rcc_clk_disable(RCC_ADC2); rcc_clk_disable(RCC_ADC3); rcc_clk_disable(RCC_AFIO); rcc_clk_disable(RCC_BKP); rcc_clk_disable(RCC_CRC); rcc_clk_disable(RCC_DAC); rcc_clk_disable(RCC_DMA1); rcc_clk_disable(RCC_DMA2); rcc_clk_disable(RCC_FLITF); rcc_clk_disable(RCC_FSMC); //rcc_clk_disable(RCC_GPIOA); //rcc_clk_disable(RCC_GPIOB); rcc_clk_disable(RCC_GPIOC); rcc_clk_disable(RCC_GPIOD); rcc_clk_disable(RCC_GPIOE); rcc_clk_disable(RCC_GPIOF); rcc_clk_disable(RCC_GPIOG); rcc_clk_disable(RCC_I2C1); rcc_clk_disable(RCC_I2C2); rcc_clk_disable(RCC_PWR); rcc_clk_disable(RCC_SDIO); rcc_clk_disable(RCC_SPI1); rcc_clk_disable(RCC_SPI2); rcc_clk_disable(RCC_SPI3); rcc_clk_disable(RCC_SRAM); //rcc_clk_disable(RCC_TIMER1); rcc_clk_disable(RCC_TIMER2); rcc_clk_disable(RCC_TIMER3); rcc_clk_disable(RCC_TIMER4); rcc_clk_disable(RCC_TIMER5); rcc_clk_disable(RCC_TIMER6); rcc_clk_disable(RCC_TIMER7); rcc_clk_disable(RCC_TIMER8); rcc_clk_disable(RCC_TIMER9); rcc_clk_disable(RCC_TIMER10); rcc_clk_disable(RCC_TIMER11); rcc_clk_disable(RCC_TIMER12); rcc_clk_disable(RCC_TIMER13); rcc_clk_disable(RCC_TIMER14); rcc_clk_disable(RCC_USART1); rcc_clk_disable(RCC_USART2); rcc_clk_disable(RCC_USART3); rcc_clk_disable(RCC_UART4); rcc_clk_disable(RCC_UART5); rcc_clk_disable(RCC_USB); } void systemHardReset(void) { // Perform a system reset, see ../libmaple/nvic.c for the method nvic_sys_reset(); // We will never get any further than this. }

Daybyter
Пт 06 ноября 2015 г., 23:53
Может это помогает:

http: // электроника.Stackexchange.com/Qu ... -режим стоп

Ахулл
Сб 07 ноября 2015 г., 1:00 утра
Daybyter написал:Может это помогает:

http: // электроника.Stackexchange.com/Qu ... -режим стоп

Daybyter
Пн, 09 ноября 2015 г., 22:56
Хорошо, я написал немного светодиодного кода мигания после вашего примера. Он использует прерывание таймера, чтобы переключить светодиод и позволить процессору спать до конца времени. Без питания светодиод используется около 12,7 млн. Лет, когда светодиод ПК 13 выключен. 14,7, в то время как светодиод включен. Долгий путь.

Также нужен лучший регулятор напряжения.

Я заинтересован в написании на SD -карту и сведу к минимуму ток. Моя идея состоит в том, чтобы использовать конденсатор для коротких тока пиков, в то время как фактическая команда записи выполняется картой.

Mrburnette
Вт 10 ноября 2015 г. 13:19
Ахулл написал:<...>Лучше 3V3 регуляторы LDO

Ахулл
Вт 10 ноября 2015 г., 13:22
Mrburnette написал:Ахулл написал:<...>Лучше 3V3 регуляторы LDO

Mrburnette
Вт 10 ноября 2015 г. 13:27
Ахулл написал:<...>

Насколько эффективны они без нагрузки? Есть много тока утечки?

Ахулл
Вт 10 ноября 2015 г. 14:43
Нет тока ввода нагрузки: 0.282ma Это довольно полезная фигура. Я думаю, мне придется заказать пару из них. У меня есть куча устройств USB Power Bank (18650), взломанные для различных целей, они в порядке только для проектов +5 В, но что -то, что может сделать Rock Solid 3.3V от 5V было бы очень полезным, особенно если он не будет мощностью, когда нагрузка спит. Это также может сделать полезный регулятор солнечной энергии для устройств с микроэнергией.

Кстати, это похоже на мать всех хлебных плат на заднем плане этого клипа на YouTube.

Mrburnette
Вт 10 ноября 2015 г. 16:36
Ахулл написал: <...>
Кстати, это похоже на мать всех хлебных плат на заднем плане этого клипа на YouTube.

Daybyter
Вт 10 ноября 2015 г., 21:12
Просто проверяю, почему мой светодиод так медленно мигает. Я использовал Hardwaretimer.setPeriod () для установки периода 3S. Но так как основные часы установлены на 8 МГц сейчас, а SetPeriod использует определение с платы.H, это не сработает.

https: // github.com/rogerclarkmelbourne/ ... ведущий.CPP#L112

Я думаю, что основные часы должны стать переменной, и нам нужны такие методы

uint32 getMainClock ();
setMainClock (uint32 частота);

Чтобы получить доступ к этому var? В качестве альтернативы тоже сработал класс. Таким образом, мы могли бы добавить методы утилиты, такие как getmaxfreq (), getminfreq (), getavailablefreqs () и т. Д.

больше веселья с C ++, шаблонами и GPIO