Режимы работы: различия между версиями

Материал из MIK32 микроконтроллер
Нет описания правки
Строка 182: Строка 182:
|}
|}
Пример
Пример
{{#spoiler:show=Показать main.c|hide=Скрыть main.c|
<syntaxhighlight lang="c++" line="1">
void lowEnergyMode()
{
    // Шина APB_P (периферия)
    uint32_t clk_apb_p_mask = 0;
    // Шина APB_M (модули)
    uint32_t clk_apb_m_mask = 0
                              | PM_CLOCK_APB_M_PAD_CONFIG_M  // контроллер выводов (вкл по умолч)
                              | PM_CLOCK_APB_M_WU_M        // блок  батар. домена WakeUp (вкл по умолч)
                              | PM_CLOCK_APB_M_PM_M        // блок упр. питанием PowerMonitor (вкл по умолч)
                              ;     
    // Шина AHB (главная)
    uint32_t clk_ahb_mask = 0
                            | PM_CLOCK_AHB_CPU_M      // Ядро (вкл по умолч)
                            | PM_CLOCK_AHB_EEPROM_M // EEPROM (вкл по умолч)
                            | PM_CLOCK_AHB_RAM_M    // ОЗУ (вкл по умолч)
                            // | PM_CLOCK_AHB_SPIFI_M  // SPI flash (вкл по умолч)
                            | PM_CLOCK_AHB_TCB_M    // TCB (вкл по умолчанию)
                            // | PM_CLOCK_AHB_DMA_M    // DMA
                            ; 
    // Включить тактирование выбранных блоков и выключить у остальных
    PM->CLK_APB_M_SET = clk_apb_m_mask;
    PM->CLK_APB_M_CLEAR = ~clk_apb_m_mask;
    PM->CLK_APB_P_SET = clk_apb_p_mask;
    PM->CLK_APB_P_CLEAR = ~clk_apb_p_mask;
    PM->CLK_AHB_SET = clk_ahb_mask;
    PM->CLK_AHB_CLEAR = ~clk_ahb_mask;
    /* Вход в режим пониженного энергопотребления переключением на источник LSI32K. */
    PM->AHB_CLK_MUX = PM_AHB_CLK_MUX_LSI32K_M | PM_AHB_FORCE_MUX_FIXED; // Переключиться на LSI32K
    for (volatile int i = 0; i < 100; i++)
        ;
    /* Отключение неиспользуемых источников тактирования */
    /* Источники 32МГц */
    /* Внутренний */
    WU->CLOCKS_SYS |= (1 << WU_CLOCKS_SYS_HSI32M_EN_S); // Выключить HSI32M
    /* Внешний */
    WU->CLOCKS_SYS |= (1 << WU_CLOCKS_SYS_OSC32M_EN_S); // Выключить OSC32M
    /* Источники 32кГц */
    /* Внутренний  */
    // WU->CLOCKS_BU |= (1 << WU_CLOCKS_BU_LSI32K_EN_S); // Выключить LSI32K
    /* Внешний */
    WU->CLOCKS_BU |= (1 << WU_CLOCKS_BU_OSC32K_EN_S); // Выключить OSC32K
    /* Делители частоты */
    PM->DIV_AHB = 255;
    PM->DIV_APB_M = 255;
    PM->DIV_APB_P = 255;
}
</syntaxhighlight>
}}

Версия от 08:27, 30 июля 2024

Потребление в различных режимах
Режим работы Условия Источник тактирования системы Частота ядра Потребление Единицы
Активный Тактирование периферий по умолчанию;

Делитель AHB = 0;

Делитель APB_M = 0;

Делитель APB_P = 0.

OSC32M FCPU = 32 МГц 12,54 мА
Пониженного энергопотребления Тактирование включено только у WU, PM, CPU, EEPROM, RAM, TCB;

Источники OSC32M, OSC32K, HSI32M выключены;

Делитель AHB = 255;

Делитель APB_M = 255;

Делитель APB_P = 255.

LSI32K FCPU = 125 кГц 1,50 мА
Спящий Тактирование RAM, EEPROM, SPIFI выключено записью в PM.SLEEP_MODE = 0b1110;

Тактирование включено только у WU, PM, CPU, TCB;

Источники OSC32M, OSC32K, OSC32K выключены;

Делитель AHB = 255;

Делитель APB_M = 255;

Делитель APB_P = 255.

HSI32M FCPU = 125 кГц 3,26 мА
OCS32M 3,25 мА
LSI32K FCPU = 125 Гц 1,50 мА
Стоп Источники HSI32M, OSC32K, LSI32K выключены;

Делитель AHB = 255;

Делитель APB_M = 255;

Делитель APB_P = 255;

Загрузка из EEPROM.

OCS32M FCPU = 125 кГц

Ядро в состоянии sleep

2,03 мА
Источники OSC32M, HSI32M, OSC32K выключены;

Делитель AHB = 255;

Делитель APB_M = 255;

Делитель APB_P = 255;

Загрузка из EEPROM.

LSI32K FCPU = 125 Гц

Ядро в состоянии sleep

0,78 мА
Ожидание Источники HSI32M, OSC32K выключены;

OSC32M включен;

Делитель AHB = 255;

Делитель APB_M = 255;

Делитель APB_P = 255

LSI32K FCPU = 125 Гц

Питание ядра выключено

0,57 мА
Источники OSC32M, HSI32M, OSC32K выключены;

OSC32M не установлен, вывод XI заземлен;

Делитель AHB = 255;

Делитель APB_M = 255;

Делитель APB_P = 255.

LSI32K FCPU = 125 Гц

Питание ядра выключено

0,17 мА
Примечание: В главном цикле инкрементируется переменная, программа выполняется из EEPROM.

Описание режимов

Активный

Состояние процессора Состояние памяти Состояние периферии Состояние системного и батарейного домена Тактирование Вход в режим Выход из режима
Процессор работает в нормальном режиме ОЗУ, EEPROM, SPIFI работают в нормальном режиме Периферия работает в нормальном режиме. Системный домен включен;

батарейный домен включен

От внешнего осциллятора с частотой до 32 МГц OSC32M;

От встроенного осциллятора с частотой до 32 МГц HSI32M.

Режим после сброса/подачи питания -

Режим «Активный» подразумевает режим с максимальной производительностью: максимальная системная частота, минимальные делители, тактирование всех задействованных устройств включено.

Пониженного энергопотребления

Состояние процессора Состояние памяти Состояние периферии Состояние системного и батарейного домена Тактирование Вход в режим Выход из режима
Процессор работает в нормальном режиме ОЗУ, EEPROM, SPIFI работают в нормальном режиме.

Рекомендуется отключать тактирование неиспользуемых модулей памяти записью в регистры:

PM.CLK_AHB_CLEAR

Рекомендуется отключать тактирование неиспользуемых периферийных модулей программно (пользователем) записью в регистры:

PM.CLK_AHB_CLEAR

PM.CLK_APB_M_CLEAR

PM.CLK_APB_P_CLEAR

Системный домен включен,


батарейный домен включен

От внешнего часового осциллятора


от встроенного часового осциллятора


От внешнего осциллятора с частотой до 32 МГц с делителем системной шины

Программно, переключившись на нужный источник тактирования или выставив необходимый делитель Программно, переключившись на нужный источник тактирования или выставив необходимый делитель

Пример