Режимы работы
Описание режимов
Активный
Состояние процессора | Состояние памяти | Состояние периферии | Состояние системного и батарейного домена | Тактирование | Вход в режим | Выход из режима |
---|---|---|---|---|---|---|
Процессор работает в нормальном режиме. |
ОЗУ, 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 МГц с делителем системной шины. |
Программно, переключившись на нужный источник тактирования или выставив необходимый делитель. |
Программно, переключившись на нужный источник тактирования или выставив необходимый делитель. |
Режим «Пониженного потребления» предполагает уменьшение производительности и потребления за счет снижения рабочей частоты, временное отключение тактирования устройств, которые временно не используются. Режим «Активный» и режим «Пониженного потребления» достаточно условны, так как отличаются выбранными источником тактирования, установленными делителями частот, отключенным тактированием тех или иных устройств, что определяется конкретной задачей.
Показать пример входа в режим пониженного энергопотребления
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;
}
Спящий
Состояние процессора | Состояние памяти | Состояние периферии | Состояние системного и батарейного домена | Тактирование | Вход в режим | Выход из режима |
---|---|---|---|---|---|---|
Ядро в состоянии 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.
Показать пример входа в спящий режим
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;
}
Стоп
Состояние процессора | Состояние памяти | Состояние периферии | Состояние системного и батарейного домена | Тактирование | Вход в режим | Выход из режима |
---|---|---|---|---|---|---|
Ядро в состоянии 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".
Показать пример входа в режим стоп
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;
}
Ожидание
Состояние процессора | Состояние памяти | Состояние периферии | Состояние системного и батарейного домена | Тактирование | Вход в режим | Выход из режима |
---|---|---|---|---|---|---|
Питание выключено |
Питание выключено |
Питание выключено |
Системный домен выключен, батарейный домен включен |
Тактирование системы выключено. |
Запись в регистр 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".
Показать пример входа в режим ожидания
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;
}
Потребление в различных режимах работы
Режим работы | Условия | Источник тактирования системы | Частота ядра | Потребление |
---|---|---|---|---|
Активный |
Тактирование периферий по умолчанию; Делитель 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 |
FCPU = 125 кГц |
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.