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
| Адрес | Регистр | Назначение |
|---|---|---|
| 0xE000E008 | ACTLR | вспомогательное управление: отключение отдельных функций ядра |
| 0xE000ED00 | CPUID | код ядра: 0x412FC230 у Cortex-M3 r2p0 |
| 0xE000ED04 | ICSR | ожидающие исключения, вызов NMI и PendSV |
| 0xE000ED08 | VTOR | адрес таблицы векторов |
| 0xE000ED0C | AIRCR | группировка приоритетов, программный сброс |
| 0xE000ED10 | SCR | SLEEPDEEP, SLEEPONEXIT, SEVONPEND |
| 0xE000ED14 | CCR | ловушки деления на ноль и невыровненного доступа, выравнивание стека |
| 0xE000ED18–0xE000ED20 | SHPR1–SHPR3 | приоритеты системных исключений |
| 0xE000ED24 | SHCSR | включение MemManage, BusFault и UsageFault |
| 0xE000ED28 | CFSR | причина отказа MemManage, BusFault и UsageFault |
| 0xE000ED2C | HFSR | причина HardFault |
| 0xE000ED30 | DFSR | причина остановки для отладчика |
| 0xE000ED34, 0xE000ED38 | MMFAR, BFAR | адрес отказа |
| 0xE000ED3C | AFSR | вспомогательный регистр отказов |
По табл. 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 и блоку управления системой; попытка вызывает отказ. В программах без ОС ядро всё время работает привилегированно, и вопрос не возникает.
Источники
- 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
- 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
- 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
- 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 и регистров отказов нет
Нашли ошибку?
Смотрите также
- Таблица векторов прерыванийАдреса обработчиков прерываний в начале флеш-памяти
- CFSR (регистр состояния отказов)Регистр причины отказа Cortex-M: MMFSR, BFSR, UFSR и адреса отказа
- Группировка приоритетов (PRIGROUP)Деление приоритета на группу вытеснения и подприоритет полем PRIGROUP
- Sleep-on-exit (SLEEPONEXIT)Автоматический сон ядра при возврате из последнего обработчика
- Cortex-M3Регистры, карта памяти, bit-banding, NVIC, SysTick, MPU, старт, пример