STM32
Прерывания в STM32. Регистры.
Прерывания играют огромную роль в работе современных управляющих систем. Трудно представить сколь-нибудь сложное приложение, не использующее механизм приостановки основной программы для исполнения более приоритетных задач. Учитывая большое количество источников прерываний, микроконтроллеры STM32 получили развитые средства их обработки, позволяющие гибко настраивать систему под конкретную задачу.
Если открыть техническую документацию на какой-либо процессор из серии STM32, то раздел, посвященный прерываниям, покажется самым коротким и простым. К сожалению это не совсем так, и связано в первую очередь с наличием встроенного контроллера NVIC в ядрах ARM Cortex. Данный контроллер выполняет основную работу, а все остальные блоки обеспечивают лишь расширение числа запросов на прерывание и повышение удобства работы.
Модуль вложенных векторных прерываний NVIC
Модуль вложенных векторных прерываний NVIC стал одним из нововведений ARM, при создании процессорного ядра Cortex. До этого задача обработки прерываний решалась блоками конкретных производителей микропроцессоров. С введением NVIC процедура обработки получила единообразие для разных процессоров, уменьшились требования к программному коду обработки исключительных ситуаций.
Система прерываний в STM32 |
На уровне контроллера NVIC все прерывания делятся на два типа – прерывания от периферийных устройств или внешние и дополнительные или внутренние. К внутренним относятся разнообразные процессорные исключения, события системного таймера, и встроенного отладчика. Для разработки конечных приложений эти элементы используются редко, гораздо больший интерес представляют внешние прерывания. Данные сигналы поступают в контроллер NVIC по отдельным линиям, каждая из которых имеет свой номер и приоритет. Для расширения возможностей и повышения гибкости настроек часть периферийных устройств STM32 подключена не напрямую к NVIC, а к внешнему контроллеру EXTI.
Стандартные характеристики NVIC:
- до 240 маскируемых прерываний (в зависимости от конкретной модели процессора)
- программируемый уровень приоритета 0-15 для каждого прерывания. Более высокий уровень соответствует более низкому приоритету. Уровень 0 соответствует прерыванию с наивысшим приоритетом
- обнаружение сигналов прерываний по фронтам и импульсного типа
- 1 немаскируемое прерывание
- динамическое изменение приоритетов прерываний
- группировка приоритета в приоритетную группу
- цепочки прерываний
- внешнее немаскируемое прерывание (NMI)
Регистры NVIC
Большое количество векторов прерываний в Cortex-M3 не позволяет разместить их все в одном регистре. Поэтому в составе NVIC имеется по три регистра каждого типа с номерами 1,2,3. Учитывая, что все они практически одинаковы и отличаются только обслуживаемыми номерами векторов прерываний, нет смысла описывать все регистры. Ниже приведена информация только по элементам с номером 1.
Вектор прерывания |
0..31 |
32..63 |
64..67 |
Регистр |
NVIC_ISER1 |
NVIC_ISER2 |
NVIC_ISER3 |
Регистр установки разрешения прерываний NVIC_ISERx
Значение после сброса: 0x00000000
Бит |
31 |
30 |
29 |
28 |
27 |
26 |
25 |
24 |
23 |
22 |
21 |
20 |
19 |
18 |
17 |
16 |
Регистр |
SETENA[31..16] |
|||||||||||||||
Доступ |
rs |
rs |
rs |
rs |
rs |
rs |
rs |
rs |
rs |
rs |
rs |
rs |
rs |
rs |
rs |
rs |
Бит |
15 |
14 |
13 |
12 |
11 |
10 |
9 |
8 |
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
Регистр |
SETENA[15..0] |
|||||||||||||||
Доступ |
rs |
rs |
rs |
rs |
rs |
rs |
rs |
rs |
rs |
rs |
rs |
rs |
rs |
rs |
rs |
rs |
Биты 31:0 SETENA[31:0]: Биты установки разрешения соответствующих векторов прерываний.
Запись:
0: Нет эффекта
1: Разрешение прерывания
Чтение:
0: Прерывание запрещено
1: Прерывание разрешено.
Регистр сброса разрешения прерываний NVIC_ICERx
Значение после сброса: 0x00000000
Бит |
31 |
30 |
29 |
28 |
27 |
26 |
25 |
24 |
23 |
22 |
21 |
20 |
19 |
18 |
17 |
16 |
Регистр |
CLRENA [31.16] |
|||||||||||||||
Доступ |
rc_w1 |
|||||||||||||||
Бит |
15 |
14 |
13 |
12 |
11 |
10 |
9 |
8 |
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
Регистр |
CLRENA [15..0] |
|||||||||||||||
Доступ |
rc_w1 |
Биты 31:0 CLRENA[31:0]: Биты сброса разрешения соответствующих векторов прерываний.
Запись:
0: Нет эффекта
1: Запрет прерывания
Чтение:
0: Прерывание запрещено
1: Прерывание разрешено.
Регистр установки ожидания обработки прерываний NVIC_ISPRx
Значение после сброса: 0x00000000
Показывает, какие прерывания находятся на рассмотрении
Бит |
31 |
30 |
29 |
28 |
27 |
26 |
25 |
24 |
23 |
22 |
21 |
20 |
19 |
18 |
17 |
16 |
Регистр |
SETPEND[31.16] |
|||||||||||||||
Доступ |
rs |
rs |
rs |
rs |
rs |
rs |
rs |
rs |
rs |
rs |
rs |
rs |
rs |
rs |
rs |
rs |
Бит |
15 |
14 |
13 |
12 |
11 |
10 |
9 |
8 |
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
Регистр |
SETPEND[15..0] |
|||||||||||||||
Доступ |
rs |
rs |
rs |
rs |
rs |
rs |
rs |
rs |
rs |
rs |
rs |
rs |
rs |
rs |
rs |
rs |
Запись:Биты 31:0 SETPEND[31:0]: Биты установки состояния ожидания прерываний.
0: Нет эффекта
1: Перевод состояния прерывания в режим ожидания
Чтение:
0: Прерывание не находится в состоянии ожидания
1: Прерывание ждет обработки
Регистр сброса ожидания обработки прерываний NVIC_ICPRx
Значение после сброса: 0x00000000
Бит |
31 |
30 |
29 |
28 |
27 |
26 |
25 |
24 |
23 |
22 |
21 |
20 |
19 |
18 |
17 |
16 |
Регистр |
CLRPEND [31.16] |
|||||||||||||||
Доступ |
rc_w1 |
|||||||||||||||
Бит |
15 |
14 |
13 |
12 |
11 |
10 |
9 |
8 |
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
Регистр |
CLRPEND [15..0] |
|||||||||||||||
Доступ |
rc_w1 |
0: Нет эффекта
Запись:Биты 31:0 CLRPEND[31:0]: Биты сброса состояния ожидания.
1: Сброс состояния ожидания
Чтение:
0: Прерывание не находится в состоянии ожидания
1: Прерывание ждет обработки
Регистр действующих прерываний NVIC_IABRx
Значение после сброса: 0x00000000
Показывает, какие прерывания находятся в активном состоянии или ожидают обработки
Бит |
31 |
30 |
29 |
28 |
27 |
26 |
25 |
24 |
23 |
22 |
21 |
20 |
19 |
18 |
17 |
16 |
Регистр |
ACTIVE[31..16] |
|||||||||||||||
Доступ |
r |
r |
r |
r |
r |
r |
r |
r |
r |
r |
r |
r |
r |
r |
r |
r |
Бит |
15 |
14 |
13 |
12 |
11 |
10 |
9 |
8 |
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
Регистр |
ACTIVE[15..0] |
|||||||||||||||
Доступ |
r |
r |
r |
r |
r |
r |
r |
r |
r |
r |
r |
r |
r |
r |
r |
r |
Биты 31:0 ACTIVE[31:0]: Биты прерывания
Чтение:
0: Прерывание не активно
1: Прерывание активно
Регистр установки приоритетов NVIC_IPRx
Значение после сброса: 0x00000000
Показывает, какие прерывания находятся в активном состоянии или ожидают обработки.
Переопределение приоритета прерываний возможно с помощью 17-ти регистров NVIC_IPRx. Каждый такой регистр имеет байтовую организацию, т.е. содержит значение приоритетов 4 прерываний. Для смены приоритета достаточно занести в соответствующее поле число от 0 до 255.
Бит |
31 |
30 |
29 |
28 |
27 |
26 |
25 |
24 |
23 |
22 |
21 |
20 |
19 |
18 |
17 |
16 |
Регистр |
IP(4x +3) [31..24] |
IP(4x +2) [23..16] |
||||||||||||||
Доступ |
r |
r |
r |
r |
r |
r |
r |
r |
r |
r |
r |
r |
r |
r |
r |
r |
Бит |
15 |
14 |
13 |
12 |
11 |
10 |
9 |
8 |
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
Регистр |
IP(4x +1)[15..8] |
IP(4x)[7..0] |
||||||||||||||
Доступ |
r |
r |
r |
r |
r |
r |
r |
r |
r |
r |
r |
r |
r |
r |
r |
r |
Биты 23:16 IP[23:16]: Приоритет прерывания c номером 4x+1Биты 31:24 IP[31:24]: Приоритет прерывания c номером 4x
Биты 15:8 IP[15:8]: Приоритет прерывания c номером 4x+2
Биты 7:0 IP[7:0]: Приоритет прерывания c номером 4x+3
Х – номер регистра NVIC_IPRx
Регистр программного вызова прерываний NVIC_STIR
Значение после сброса: 0x00000000
Запись в регистр номера прерывания выполняет генерацию программного прерывания (SGI). Доступ к регистру ограничен по типу исполнения программ. На непривилегированном уровне доступ открыт если установлен бит USERSETMPEND в регистре SCB_CCR.
Бит |
31 |
30 |
29 |
28 |
27 |
26 |
25 |
24 |
23 |
22 |
21 |
20 |
19 |
18 |
17 |
16 |
Регистр |
Reserved |
|||||||||||||||
Доступ |
r |
r |
r |
r |
r |
r |
r |
r |
r |
r |
r |
r |
r |
r |
r |
r |
Бит |
15 |
14 |
13 |
12 |
11 |
10 |
9 |
8 |
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
Регистр |
Reserved |
INTID[7..0] |
||||||||||||||
Доступ |
r |
r |
r |
r |
r |
r |
r |
r |
r |
r |
r |
r |
r |
r |
r |
r |
Биты 7:0 INTID[7:0]: Номер вызываемого прерывания
Внешний контроллер прерываний EXTI
Основная работа по настройке запросов прерываний делится между NVIC и встроенными модулями микроконтроллера. Например, модуль таймера общего назначения может формировать один глобальный запрос на основе 7 разных событий. Для портов ввода/вывода, реализован отдельный контроллер внешних прерываний EXTI. Он позволяет разрешить запрос на обработку по конкретной линии, задать фронт срабатывания прерывания, сформировать программный запрос.
Модуль EXTI в STM32 |
Микроконтроллеры STM32 способны генерировать прерывание от любой линии любого порта ввода/вывода. Но одновременно к EXTI может быть подключена только одна линия из всех имеющих одинаковый номер. Линии портов ввода-вывода с номерами от 0 до 3 формируют собственные вектора прерываний. Линии с номерами 4..15 мультиплексированы на 1 вектор.
Кроме портов GPIO через контроллер прерываний реализованы запросы от некоторых периферийных устройств. В частности через EXTI осуществляются такая функция, как вывод процессора из «спящего» режима. Конкретные варианты реализации запросов отличаются в разных моделях STM32, что требует уточнения по документации.
Регистры EXTI
Регистр маски прерываний EXTI_IMR
Значение после сброса: 0x00000000
Показывает, какие прерывания разрешены
Бит |
31 |
30 |
29 |
28 |
27 |
26 |
25 |
24 |
23 |
22 |
21 |
20 |
19 |
18 |
17 |
16 |
Регистр |
Reserved |
MR[23..16] |
||||||||||||||
Доступ |
|
rw |
rw |
rw |
rw |
rw |
rw |
rw |
rw |
|||||||
Бит |
15 |
14 |
13 |
12 |
11 |
10 |
9 |
8 |
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
Регистр |
MR[15..0] |
|||||||||||||||
Доступ |
rw |
rw |
rw |
rw |
rw |
rw |
rw |
rw |
rw |
rw |
rw |
rw |
rw |
rw |
rw |
rw |
Биты 23:0 MR[23:0]: Биты маскирования прерываний по соответствующим линиям EXTI
0: Прерывание не активно
1: Прерывание активно
Регистр маски событий EXTI_EMR
Значение после сброса: 0x00000000
Показывает, какие события разрешены
Бит |
31 |
30 |
29 |
28 |
27 |
26 |
25 |
24 |
23 |
22 |
21 |
20 |
19 |
18 |
17 |
16 |
Регистр |
Reserved |
MR[23..16] |
||||||||||||||
Доступ |
|
rw |
rw |
rw |
rw |
rw |
rw |
rw |
rw |
|||||||
Бит |
15 |
14 |
13 |
12 |
11 |
10 |
9 |
8 |
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
Регистр |
MR[15..0] |
|||||||||||||||
Доступ |
rw |
rw |
rw |
rw |
rw |
rw |
rw |
rw |
rw |
rw |
rw |
rw |
rw |
rw |
rw |
rw |
Биты 23:0 MR[23:0]: Биты маскирования событий по соответствующим линиям EXTI
0: Прерывание не активно
1: Прерывание активно
Регистр разрешения срабатывания по переднему фронту EXTI_RTSR
Значение после сброса: 0x00000000
Устанавливает реакцию каждой линии на передний фронт сигнала
Бит |
31 |
30 |
29 |
28 |
27 |
26 |
25 |
24 |
23 |
22 |
21 |
20 |
19 |
18 |
17 |
16 |
Регистр |
Reserved |
TR[23..16] |
||||||||||||||
Доступ |
|
rw |
rw |
rw |
rw |
rw |
rw |
rw |
rw |
|||||||
Бит |
15 |
14 |
13 |
12 |
11 |
10 |
9 |
8 |
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
Регистр |
TR[15..0] |
|||||||||||||||
Доступ |
rw |
rw |
rw |
rw |
rw |
rw |
rw |
rw |
rw |
rw |
rw |
rw |
rw |
rw |
rw |
rw |
0: Передний фронт не формирует событийБиты 23:0 TR[23:0]: Биты задания реакции на передний фронт сигнала EXTI
1: Прерывание генерируется по переднему фронту на соответствующей линии
Регистр разрешения срабатывания по заднему фронту EXTI_FTSR
Значение после сброса: 0x00000000
Устанавливает реакцию каждой линии на задний фронт сигнала
Бит |
31 |
30 |
29 |
28 |
27 |
26 |
25 |
24 |
23 |
22 |
21 |
20 |
19 |
18 |
17 |
16 |
Регистр |
Reserved |
TR[23..16] |
||||||||||||||
Доступ |
|
rw |
rw |
rw |
rw |
rw |
rw |
rw |
rw |
|||||||
Бит |
15 |
14 |
13 |
12 |
11 |
10 |
9 |
8 |
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
Регистр |
TR[15..0] |
|||||||||||||||
Доступ |
rw |
rw |
rw |
rw |
rw |
rw |
rw |
rw |
rw |
rw |
rw |
rw |
rw |
rw |
rw |
rw |
0: Задний фронт не формирует событийБиты 23:0 TR[23:0]: Биты задания реакции на задний фронт сигнала EXTI
1: Прерывание генерируется по заднему фронту на соответствующей линии
Регистр программного прерывания EXTI_SWIER
Значение после сброса: 0x00000000
Позволяет программно вызывать любое прерывание или событие EXTI
Бит |
31 |
30 |
29 |
28 |
27 |
26 |
25 |
24 |
23 |
22 |
21 |
20 |
19 |
18 |
17 |
16 |
Регистр |
Reserved |
SWIER[23..16] |
||||||||||||||
Доступ |
|
rw |
rw |
rw |
rw |
rw |
rw |
rw |
rw |
|||||||
Бит |
15 |
14 |
13 |
12 |
11 |
10 |
9 |
8 |
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
Регистр |
SWIER[15..0] |
|||||||||||||||
Доступ |
rw |
rw |
rw |
rw |
rw |
rw |
rw |
rw |
rw |
rw |
rw |
rw |
rw |
rw |
rw |
rw |
Запись 1 в любой бит приведет к установке соответствующего бита в EXTI_PR. Если данное прерывание или событие разрешено в EXTI_IMR или EXTI_EMR, то будет сформирован запрос к NVICБиты 23:0 SWIER[23:0]: Биты программного прерывания
Биты в SWIER сбрасываются при установке битов EXTI_PR в 0.
Регистр ожидания прерываний EXTI_PR
Значение после сброса: 0x00000000
Бит |
31 |
30 |
29 |
28 |
27 |
26 |
25 |
24 |
23 |
22 |
21 |
20 |
19 |
18 |
17 |
16 |
Регистр |
Reserved |
PR [31..16] |
||||||||||||||
Доступ |
|
|
|
|
|
|
rc_w1 |
|||||||||
Бит |
15 |
14 |
13 |
12 |
11 |
10 |
9 |
8 |
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
Регистр |
PR[15..0] |
|||||||||||||||
Доступ |
rc_w1 |
0: Запрос на прерывание отсутствуетБиты 23:0 PR[23:0]: Биты состояния EXTI.
1: Запрос обнаружен. Данный бит устанавливается в 1 по событию на внешних линиях. Сбрасывается записью 1 в данный регистр, либо сменой состояния детектора уровня (EXTI_RTSR, EXTI_FTSR).