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

Материал из MIK32 микроконтроллер
Нет описания правки
 
(не показано 8 промежуточных версий этого же участника)
Строка 142: Строка 142:
* SLEEP_MODE[1] = 1 – отключение тактирования EEPROM;
* SLEEP_MODE[1] = 1 – отключение тактирования EEPROM;
* SLEEP_MODE[2] = 1 – отключение тактирования ОЗУ;
* SLEEP_MODE[2] = 1 – отключение тактирования ОЗУ;
* SLEEP_MODE[3] = 1 – отключение тактирования контроллера SPIFI.  
* SLEEP_MODE[3] = 1 – отключение тактирования контроллера SPIFI.
Ниже представлен пример входа в спящий режим, в котором включено тактирование GPIO0, GPIO_IRQ и EPIC. Выход из режима осуществляется, например, по внешнему прерыванию от вывода на порте GPIO0. {{#spoiler:show=Показать пример входа в спящий режим|hide=Скрыть пример входа в спящий режим|
<syntaxhighlight lang="c++" line="1">
void sleepMode()
{
    // Шина APB_P (периферия)
    uint32_t clk_apb_p_mask = 0
                            | PM_CLOCK_APB_P_GPIO_0_M   
                            | PM_CLOCK_APB_P_GPIO_IRQ_M
                            ;


=== Стоп ===
    // Шина 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 (вкл по умолч)
                              | PM_CLOCK_APB_M_EPIC_M
                              ;     
 
    // Шина 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;
 
    PM->AHB_CLK_MUX = PM_AHB_CLK_MUX_HSI32M_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;
 
    /* Вход в спящий режим */
    /* Отключить тактирование SPIFI[3], RAM[2], ROM[1], ядро[0] */
    PM->SLEEP_MODE = 0b1110;
}
</syntaxhighlight>
}}
 
===Стоп===
{| class="wikitable"
{| class="wikitable"
!Состояние процессора
!Состояние процессора
Строка 156: Строка 220:
|Ядро в состоянии sleep.
|Ядро в состоянии sleep.
|Тактирование ОЗУ, EEPROM, SPIFI выключено.
|Тактирование ОЗУ, EEPROM, SPIFI выключено.
|Тактированием периферия выключено  
|Тактированием периферия выключено
|Системный домен включен, батарейный домен включен.  
|Системный домен включен, батарейный домен включен.
|Тактирование системы выключено.  
|Тактирование системы выключено.
|Запись в регистр WAKEUP.STOP  
|Запись в регистр WAKEUP.STOP
| RTC/выводу EXT_WU.
|RTC/выводу EXT_WU.
|}
|}
В режиме “Стоп” автоматически отключается тактирование всех устройств за исключением батарейного домена. Переход осуществляется записью в регистр WAKEUP.STOP.  Выход из режима событию на выводе EXT_WU, будильника, или по сбросу.
В режиме “Стоп” автоматически отключается тактирование всех устройств за исключением батарейного домена. Переход осуществляется записью в регистр WAKEUP.STOP.  Выход из режима событию на выводе EXT_WU, будильника, или по сбросу.
Строка 166: Строка 230:
Для выхода из режима по RTC или выводу EXT_WU следует установить бит WU.SYS_MASK.SYS_UP_RTC или WU.SYS_MASK.SYS_UP_WU соответственно. При этом активный уровень, по которому происходит выход из режима, настраивается в WU.SYS_LEVEL.LVL_RTC и в WU.SYS_LEVEL.LVL_WU.
Для выхода из режима по RTC или выводу EXT_WU следует установить бит WU.SYS_MASK.SYS_UP_RTC или WU.SYS_MASK.SYS_UP_WU соответственно. При этом активный уровень, по которому происходит выход из режима, настраивается в WU.SYS_LEVEL.LVL_RTC и в WU.SYS_LEVEL.LVL_WU.


=== Ожидание ===
Ниже приведен пример кода входа в режим стоп. Выход из режима осуществляется установкой на выводе EXT_WU уровня логической "1".
{{#spoiler:show=Показать пример входа в режим стоп|hide=Скрыть пример входа в режим стоп|
<syntaxhighlight lang="c++" line="1">
void stopMode()
{
    /* Разрешить включение системного домена (из режима СТОП) при активном уровне внешнего вывода ext_wu */
    // WU->SYS_LEVEL &= ~WU_SYS_LEVEL_EXT_LINE_M; // Активный уровень EXT_WU лог. "0"
    WU->SYS_MASK |= WU_MASK_WAKEUP_EXT_M;
    for (volatile int i = 0; i < 100; i++)
        ;
 
    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;
 
    /* Вход в режим стоп */
    WU->STOP = 1;
}
</syntaxhighlight>
}}
===Ожидание===
{| class="wikitable"
{| class="wikitable"
!Состояние процессора
!Состояние процессора
Строка 178: Строка 280:
|Питание выключено
|Питание выключено
|Питание выключено
|Питание выключено
|Питание выключено  
|Питание выключено
|Системный домен выключен, батарейный домен включен  
|Системный домен выключен, батарейный домен включен  
|Тактирование системы выключено.  
|Тактирование системы выключено.
|Запись в регистр WAKEUP. SYS_POWEROFF.  
|Запись в регистр WAKEUP. SYS_POWEROFF.
| По сбросу/RTC/ выводу EXT_WU
|По сбросу/RTC/ выводу EXT_WU
|}
|}
Во всех режимах, кроме ожидания питание всех доменов включено. В режиме ожидания остается включенным только батарейный домен. Системный LDO выключен. Переход осуществляется записью в регистр SYS_POWEROFF. Выход из режима событию на выводе EXT_WU, будильника, или по сбросу.
Во всех режимах, кроме ожидания питание всех доменов включено. В режиме ожидания остается включенным только батарейный домен. Системный LDO выключен. Переход осуществляется записью в регистр SYS_POWEROFF. Выход из режима событию на выводе EXT_WU, будильника, или по сбросу.
Строка 188: Строка 290:
Для выхода из режима по RTC или выводу EXT_WU следует установить бит WU.SYS_MASK.SYS_UP_RTC или WU.SYS_MASK.SYS_UP_WU соответственно. При этом активный уровень, по которому происходит выход из режима, настраивается в WU.SYS_LEVEL.LVL_RTC и в WU.SYS_LEVEL.LVL_WU.
Для выхода из режима по RTC или выводу EXT_WU следует установить бит WU.SYS_MASK.SYS_UP_RTC или WU.SYS_MASK.SYS_UP_WU соответственно. При этом активный уровень, по которому происходит выход из режима, настраивается в WU.SYS_LEVEL.LVL_RTC и в WU.SYS_LEVEL.LVL_WU.


== Потребление в различных режимах работы ==
Ниже приведен пример кода входа в режим ожидания. Выход из режима осуществляется установкой на выводе EXT_WU уровня логической "1".
{{#spoiler:show=Показать пример входа в режим ожидания|hide=Скрыть пример входа в режим ожидания|
<syntaxhighlight lang="c++" line="1">
void standbyMode()
{
 
    /* Разрешить включение системного домена при активном уровне внешнего вывода ext_wu */
    // WU->SYS_LEVEL &= ~WU_SYS_LEVEL_EXT_LINE_M; // Активный уровень EXT_WU лог. "0"
    WU->SYS_MASK |= WU_MASK_WAKEUP_EXT_M;
    for (volatile int i = 0; i < 100; i++)
        ;
 
    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;
 
    /* Вход в режим ожидания */
    WU->SYS_POWEROFF = 1;
}
</syntaxhighlight>
}}
 
==Потребление в различных режимах работы ==
{| class="wikitable"
{| class="wikitable"
!Режим работы
!Режим работы
Строка 204: Строка 346:


Делитель APB_P = 0.
Делитель APB_P = 0.
|OSC32M
|OSC32M  
|F<sub>CPU</sub> = 32 МГц
|F<sub>CPU</sub> = 32 МГц  
|12,54
|12,50÷15,00
|мА
|мА
|-
|-
Строка 220: Строка 362:
|LSI32K
|LSI32K
|F<sub>CPU</sub> = 125 кГц
|F<sub>CPU</sub> = 125 кГц
|1,50
| 1,50÷1,80
|мА
|мА
|-
|-
Строка 236: Строка 378:
|HSI32M
|HSI32M
| rowspan="2" |F<sub>CPU</sub> = 125 кГц
| rowspan="2" |F<sub>CPU</sub> = 125 кГц
|3,26
|3,20÷3,84
|мА
|мА
|-
|-
|OCS32M
| OCS32M
|3,25
|3,20÷3,84
|мА
|мА  
|-
|-
|LSI32K
| LSI32K
|F<sub>CPU</sub> = 125 Гц
|F<sub>CPU</sub> = 125 Гц
|1,50
|1,50÷1,80
|мА
|мА
|-
|-
! rowspan="2" |Стоп
! rowspan="2" |Стоп  
|Источники HSI32M, OSC32K, LSI32K выключены;
|Источники HSI32M, OSC32K, LSI32K выключены;
Делитель AHB = 255;
Делитель AHB = 255;
Строка 260: Строка 402:
|F<sub>CPU</sub> = 125 кГц
|F<sub>CPU</sub> = 125 кГц
Ядро в состоянии sleep
Ядро в состоянии sleep
|2,03
|2,00÷2,40
|мА
|мА
|-
|-
Строка 274: Строка 416:
|F<sub>CPU</sub> = 125 Гц
|F<sub>CPU</sub> = 125 Гц
Ядро в состоянии sleep
Ядро в состоянии sleep
|0,78
|0,70÷0,84
|мА
|мА
|-
|-
Строка 287: Строка 429:
Делитель APB_P = 255
Делитель APB_P = 255
|LSI32K
|LSI32K
|F<sub>CPU</sub> = 125 Гц
| F<sub>CPU</sub> = 125 Гц
Питание ядра выключено
Питание ядра выключено
|0,57
|0,50÷0,60
|мА
|мА
|-
|-
Строка 303: Строка 445:
|F<sub>CPU</sub> = 125 Гц
|F<sub>CPU</sub> = 125 Гц
Питание ядра выключено
Питание ядра выключено
|0,17
|0,17÷0,20
|мА
|мА
|-
|-
| colspan="6" |Примечание: В главном цикле инкрементируется переменная, программа выполняется из EEPROM.
| colspan="6" |Примечание: В главном цикле инкрементируется переменная, программа выполняется из EEPROM.
|}
|}

Текущая версия от 11:18, 30 июля 2024

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

Активный

Состояние процессора Состояние памяти Состояние периферии Состояние системного и батарейного домена Тактирование Вход в режим Выход из режима
Процессор работает в нормальном режиме. ОЗУ, 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 МГц с делителем системной шины.

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

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

Спящий

Состояние процессора Состояние памяти Состояние периферии Состояние системного и батарейного домена Тактирование Вход в режим Выход из режима
Ядро в состоянии sleep Тактирование Ядра, ОЗУ, EEPROM, SPIFI может быть выключено при записи в PM.SLEEP_MODE Рекомендуется отключать тактирование неиспользуемых периферийных модулей программно (пользователем) записью в регистры:

PM.CLK_AHB_CLEAR;

PM.CLK_APB_M_CLEAR;

PM.CLK_APB_P_CLEAR.

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

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

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

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

Записью в регистр PM.SLEEP_MODE. По прерыванию.

«Спящий» режим подразумевает автоматическое отключение частоты ядра, некоторых модулей памяти. Переход осуществляется записью в регистр PM. SLEEP_MODE. При записи отключается тактирование ядра и в зависимости от записываемого значения отключается тактирование следующих модулей:

  • SLEEP_MODE[0] = 1 – отключение тактирования ядра;
  • SLEEP_MODE[1] = 1 – отключение тактирования EEPROM;
  • SLEEP_MODE[2] = 1 – отключение тактирования ОЗУ;
  • SLEEP_MODE[3] = 1 – отключение тактирования контроллера SPIFI.

Ниже представлен пример входа в спящий режим, в котором включено тактирование GPIO0, GPIO_IRQ и EPIC. Выход из режима осуществляется, например, по внешнему прерыванию от вывода на порте GPIO0.

Стоп

Состояние процессора Состояние памяти Состояние периферии Состояние системного и батарейного домена Тактирование Вход в режим Выход из режима
Ядро в состоянии sleep. Тактирование ОЗУ, EEPROM, SPIFI выключено. Тактированием периферия выключено Системный домен включен, батарейный домен включен. Тактирование системы выключено. Запись в регистр WAKEUP.STOP RTC/выводу EXT_WU.

В режиме “Стоп” автоматически отключается тактирование всех устройств за исключением батарейного домена. Переход осуществляется записью в регистр WAKEUP.STOP.  Выход из режима событию на выводе EXT_WU, будильника, или по сбросу.

Для выхода из режима по RTC или выводу EXT_WU следует установить бит WU.SYS_MASK.SYS_UP_RTC или WU.SYS_MASK.SYS_UP_WU соответственно. При этом активный уровень, по которому происходит выход из режима, настраивается в WU.SYS_LEVEL.LVL_RTC и в WU.SYS_LEVEL.LVL_WU.

Ниже приведен пример кода входа в режим стоп. Выход из режима осуществляется установкой на выводе EXT_WU уровня логической "1".

Ожидание

Состояние процессора Состояние памяти Состояние периферии Состояние системного и батарейного домена Тактирование Вход в режим Выход из режима
Питание выключено Питание выключено Питание выключено Системный домен выключен, батарейный домен включен Тактирование системы выключено. Запись в регистр WAKEUP. SYS_POWEROFF. По сбросу/RTC/ выводу EXT_WU

Во всех режимах, кроме ожидания питание всех доменов включено. В режиме ожидания остается включенным только батарейный домен. Системный LDO выключен. Переход осуществляется записью в регистр SYS_POWEROFF. Выход из режима событию на выводе EXT_WU, будильника, или по сбросу.

Для выхода из режима по RTC или выводу EXT_WU следует установить бит WU.SYS_MASK.SYS_UP_RTC или WU.SYS_MASK.SYS_UP_WU соответственно. При этом активный уровень, по которому происходит выход из режима, настраивается в WU.SYS_LEVEL.LVL_RTC и в WU.SYS_LEVEL.LVL_WU.

Ниже приведен пример кода входа в режим ожидания. Выход из режима осуществляется установкой на выводе EXT_WU уровня логической "1".

Потребление в различных режимах работы

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

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

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

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

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

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

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

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

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

LSI32K FCPU = 125 кГц 1,50÷1,80 мА
Спящий Тактирование 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,20÷3,84 мА
OCS32M 3,20÷3,84 мА
LSI32K FCPU = 125 Гц 1,50÷1,80 мА
Стоп Источники HSI32M, OSC32K, LSI32K выключены;

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

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

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

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

OCS32M FCPU = 125 кГц

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

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

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

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

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

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

LSI32K FCPU = 125 Гц

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

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

OSC32M включен;

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

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

Делитель APB_P = 255

LSI32K FCPU = 125 Гц

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

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

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

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

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

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

LSI32K FCPU = 125 Гц

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

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