Перейти к содержанию

SCB (блок управления системой)

Таблицу векторов переносят через SCB->VTOR, программный сброс делают через SCB->AIRCR, причину отказа читают из SCB->CFSR. Все эти регистры принадлежат одному блоку ядра Cortex-M — блоку управления системой.

Обновлено Редакция GAW

SCB (System Control Block, блок управления системой) — набор регистров ядра Cortex-M, через которые программа узнаёт о процессоре и управляет системными исключениями, сном и обработкой отказов. Основная часть блока лежит в области PPB по адресам 0xE000ED00–0xE000ED3F, а вспомогательный регистр ACTLR — отдельно, по адресу 0xE000E008 (DUI 0552A, табл. 4-1 и 4-12). Блок одинаков у всех кристаллов на одном ядре, будь то STM32, GD32 или любой другой (DUI 0552A, разд. 4.3).

Регистры Cortex-M3

АдресРегистрНазначение
0xE000E008ACTLRвспомогательное управление: отключение отдельных функций ядра
0xE000ED00CPUIDкод ядра: 0x412FC230 у Cortex-M3 r2p0
0xE000ED04ICSRожидающие исключения, вызов NMI и PendSV
0xE000ED08VTORадрес таблицы векторов
0xE000ED0CAIRCRгруппировка приоритетов, программный сброс
0xE000ED10SCRSLEEPDEEP, SLEEPONEXIT, SEVONPEND
0xE000ED14CCRловушки деления на ноль и невыровненного доступа, выравнивание стека
0xE000ED18–0xE000ED20SHPR1–SHPR3приоритеты системных исключений
0xE000ED24SHCSRвключение MemManage, BusFault и UsageFault
0xE000ED28CFSRпричина отказа MemManage, BusFault и UsageFault
0xE000ED2CHFSRпричина HardFault
0xE000ED30DFSRпричина остановки для отладчика
0xE000ED34, 0xE000ED38MMFAR, BFARадрес отказа
0xE000ED3CAFSRвспомогательный регистр отказов

По табл. 4-12 DUI 0552A; DFSR в ней нет, его адрес — по ARMv7-M ARM (табл. C1-8). Сюда же относятся таблица векторов через VTOR, группировка приоритетов через поле PRIGROUP, sleep-on-exit через бит SCR и регистр CFSR с причиной отказа.

Как с ним работать

В CMSIS блок описан структурой, и код пишут через указатель SCB:

SCB->VTOR = 0x08004000U;                /* vector table of the application */
SCB->CCR |= SCB_CCR_DIV_0_TRP_Msk;      /* UsageFault on division by zero */

Правила из руководства Arm:

  • Только привилегированно. Непривилегированный код к SCB, NVIC и SysTick доступа не имеет (разд. 2.1.1).
  • Ключ для AIRCR. Запись принимается, только если в поле VECTKEY записано 0x5FA (разд. 4.3.5).
  • Выровненные слова. Ко всем регистрам, кроме CFSR и SHPR1–SHPR3, обращаются только выровненными 32-битными словами (разд. 4.3.15).

У Cortex-M0 блок урезан: нет VTOR, SHCSR и регистров отказов, а CCR доступен только для чтения (DUI 0497A, табл. 4-10). Полная карта регистров ядра — в статье «Cortex-M3».

Частые вопросы

Что такое SCB в коде STM32?

Это указатель из заголовков CMSIS на структуру регистров блока управления системой ядра Cortex-M. SCB->VTOR задаёт адрес таблицы векторов, SCB->AIRCR — группировку приоритетов и программный сброс, SCB->SCR — режимы сна, SCB->CCR — ловушки деления на ноль и невыровненного доступа, SCB->CFSR и SCB->HFSR — причину отказа. Регистры одинаковы у всех кристаллов на этом ядре.

Почему запись в SCB->AIRCR ничего не меняет?

В старшие 16 бит нужно записать ключ 0x5FA, иначе ядро игнорирует запись. Поэтому AIRCR меняют чтением-модификацией-записью с подстановкой ключа, как делают функции CMSIS NVIC_SetPriorityGrouping и NVIC_SystemReset.

Можно ли обращаться к SCB из непривилегированного кода?

Нет. По руководству Arm непривилегированный код не имеет доступа к SysTick, NVIC и блоку управления системой; попытка вызывает отказ. В программах без ОС ядро всё время работает привилегированно, и вопрос не возникает.

Источники

  1. Arm. Cortex-M3 Devices Generic User Guide, DUI 0552A, 2010 — разд. 4.3, табл. 4-12: SCB даёт сведения о реализации и управление системой, в том числе настройку и состояние системных исключений; ACTLR 0xE000E008, CPUID 0xE000ED00 (сброс 0x412FC230), ICSR 0xE000ED04, VTOR 0xE000ED08, AIRCR 0xE000ED0C (0xFA050000), SCR 0xE000ED10, CCR 0xE000ED14 (0x00000200), SHPR1–SHPR3 0xE000ED18–0xE000ED20, SHCSR 0xE000ED24, CFSR 0xE000ED28, HFSR 0xE000ED2C, MMFAR 0xE000ED34, BFAR 0xE000ED38, AFSR 0xE000ED3C; все требуют привилегированного доступа; разд. 4.3.5: запись в AIRCR требует ключа 0x5FA в VECTKEY, бит SYSRESETREQ запрашивает системный сброс; разд. 4.3.15: кроме CFSR и SHPR1–SHPR3, к регистрам SCB обращаются только выровненными словами; разд. 2.1.1: непривилегированный код не имеет доступа к SysTick, NVIC и SCB
  2. Arm. ARMv7-M Architecture Reference Manual, ARM DDI 0403C_errata_v3, 2010 — табл. C1-8: Debug Fault Status Register (DFSR) по адресу 0xE000ED30 — причина входа в отладочное состояние; таблица регистров SCB: CFSR 0xE000ED28, HFSR 0xE000ED2C
  3. Arm. CMSIS 6, CMSIS-Core core_cm3.h (v6.4.0) — структура SCB_Type и указатель SCB, маски вида SCB_SCR_SLEEPONEXIT_Msk, SCB_CCR_DIV_0_TRP_Msk, SCB_CFSR_IMPRECISERR_Msk; функция __NVIC_SetPriorityGrouping пишет поле PRIGROUP регистра AIRCR
  4. Arm. Cortex-M0 Devices Generic User Guide, DUI 0497A, 2009 — разд. 4.3, табл. 4-10: SCB Cortex-M0 — CPUID (0x410CC200), ICSR, AIRCR, SCR, CCR (только чтение, 0x00000208), SHPR2, SHPR3; VTOR, SHPR1, SHCSR и регистров отказов нет

Нашли ошибку?