STM32

Прерывания в STM32. Регистры.

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

Если открыть техническую документацию на какой-либо процессор из серии STM32, то раздел, посвященный прерываниям, покажется самым коротким и простым. К сожалению это не совсем так, и связано в первую очередь с наличием встроенного контроллера NVIC в ядрах ARM Cortex. Данный контроллер выполняет основную работу, а все остальные блоки обеспечивают лишь расширение числа запросов на прерывание и повышение удобства работы.

Модуль вложенных векторных прерываний NVIC

Модуль вложенных векторных прерываний NVIC стал одним из нововведений ARM, при создании процессорного ядра Cortex. До этого задача обработки прерываний решалась блоками конкретных производителей микропроцессоров. С введением NVIC процедура обработки получила единообразие для разных процессоров, уменьшились требования к программному коду обработки исключительных ситуаций.

Система прерываний в STM32
Система прерываний в 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
Модуль 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).

You have no rights to post comments