STM32

STM32. Работа с базовыми портами ввода/вывода.

Дискретные порты ввода/вывода являются основой любого микроконтроллера. Их наличие выделяет данный тип процессоров среди всех остальных. При изучении каждого нового контроллера, именно дискретные порты рассматриваются в первую очередь. Работа с базовыми портами ввода/вывода или GPIO в микроконтроллерах STM32, отличается от 8-ми битных систем в основном большим количеством используемых регистров. Эти регистры описаны в фирменной документации RM0041 Reference manual STM32F100xx advanced ARM-based 32-bit MCUs. Ниже приведена информация по конфигурации GPIO и работе с ними. 

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

Регистры конфигурации порта.

Port configuration register low (GPIOx_CRL) (x=A..G)

Port configuration register high (GPIOx_CRH) (x=A..G)

Для программирования режимов работы портов ввода/вывода STM32, используются два 32 разрядных регистра для каждого GPIO. Они позволяют произвольно настроить режим работы любой отдельной линии. Регистр GPIOx_CRL отвечает за линии с номерами от 0 до 7, GPIOx_CRH – за линии 8-15. Для каждой из них в регистре имеется два двухразрядных поля CNFy[1:0] и MODEy[1:0]. Первое определяет тип работы линии, второе – направление обмена по линии. все биты доступны для чтения/записи.

Регистр GPIOx_CRL

Бит регистра

31

30

29

28

27

26

25

24

23

22

21

20

19

18

17

16

Поле

CNF7[1:0]

MODE7[1:0]

CNF6[1:0]

MODE6[1:0]

CNF5[1:0]

MODE5[1:0]

CNF4[1:0]

MODE4[1:0]

Линия ввода/вывода

7

6

5

4

Бит регистра

15

14

13

12

11

10

9

8

7

6

5

4

3

2

1

0

Поле

CNF3[1:0]

MODE3[1:0]

CNF2[1:0]

MODE2[1:0]

CNF1[1:0]

MODE1[1:0]

CNF0[1:0]

MODE0[1:0]

Линия ввода/вывода

3

2

1

0

 

Регистр GPIOX_CRH

Бит регистра

31

30

29

28

27

26

25

24

23

22

21

20

19

18

17

16

Поле

CNF15[1:0]

MODE15[1:0]

CNF14[1:0]

MODE14[1:0]

CNF13[1:0]

MODE12[1:0]

CNF12[1:0]

MODE12[1:0]

Линия ввода/вывода

15

14

13

12

Бит регистра

15

14

13

12

11

10

9

8

7

6

5

4

3

2

1

0

Поле

CNF11[1:0]

MODE11[1:0]

CNF10[1:0]

MODE10[1:0]

CNF9[1:0]

MODE9[1:0]

CNF8[1:0]

MODE8[1:0]

Линия ввода/вывода

11

10

9

8

Поле MODEy[1:0] может принимать следующие значения:

  • 00 – линия работает на ввод. Данное состояние устанавливается после сброса.
  • 01 – линия работает на выход, с максимальной частотой переключения 10 МГц
  • 10 – линия работает на выход, с максимальной частотой переключения 20 МГц
  • 11 – линия работает на выход, с максимальной частотой переключения 50 МГц

Поле CNFy[1:0] зависит от направления передачи. При работе на вход (MODEy[1:0]=0) доступны следующие состояния:

  • 00 – аналоговый вход.
  • 01 – вход в третьем состоянии. (Устанавливается после сброса).
  • 10 – вход с подтягивающим резистором
  • 11 – зарезервировано для будущих применений.

При работе на выход (MODEy[1:0]>0) поле CNFy[1:0] может иметь следующие состояния:

  • 00 – цифровой выход
  • 01 – цифровой выход с открытым стоком
  • 10 – цифровой выход, подключенный специализированным блокам
  • 11 – цифровой выход, подключенный специализированным блокам с открытым стоком 

Регистр защиты от изменения настроек

Port configuration lock register (GPIOx_LCKR) (x=A..G)

Бит

31

30

29

28

27

26

25

24

23

22

21

20

19

18

17

16

Поле

Резерв

LCKK

Бит

15

14

13

12

11

10

9

8

7

6

5

4

3

2

1

0

Поле

LCK15

LCK14

LCK13

LCK12

LCK11

LCK10

LCK9

LCK8

LCK7

LCK6

LCK5

LCK4

LCK3

LCK2

LCK1

LCK1

Установить блокируемый бит  в GPIOx_LCKRДля невозможности изменения настроек порта в микроконтроллерах STM32 используется регистр GPIOx_LCKR. Его младщие 15 бит отвечают за соответсвующие линии порта ввода/вывода. Бит 16, установленный в 1, разрешает блокировку изменения настроек. все биты доступны на чтение/запись. Для усложнения жизни пользователям ;-), используется специальный алгоритм установки защиты. Если он применен, то следующее изменение конфигурации доступно только после сброса. Алгоритм установки защиты выглядит следующим образом:

  1. Установить бит 16 GPIOx_LCKR.
  2. Сбросить бит 16 GPIOx_LCKR.
  3. Установить бит 16 GPIOx_LCKR.
  4. Прочитать GPIOx_LCKR
  5. Повторно прочитать GPIOx_LCKR 

Регистры установки состояния линий

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

Выходной регистр порта ввода/вывода

Port output data register (GPIOx_ODR) (x=A..G) 

Бит

31

30

29

28

27

26

25

24

23

22

21

20

19

18

17

16

Поле

Резерв

Бит

15

14

13

12

11

10

9

8

7

6

5

4

3

2

1

0

Поле

ODR15

ODR14

ODR13

ODR12

ODR11

ODR10

ODR9

ODR8

ODR7

ODR6

ODR5

ODR4

ODR3

ODR2

ODR1

ODR0

Данный регистр имеет разрядность 32, но используются только младшие 16 бит. Биты с 16 по 31 не используются. При записи в GPIOx_ODR какого-либо значения, это значение устанавливается на выходных линиях соответствующего порта. Биты регистра доступны только для чтения/записи. 

Входной регистр

Port input data register (GPIOx_IDR) (x=A..G)

Бит31302928272625242322212019181716
Поле Резерв
Бит1514131211109876543211
Поле IDR15 IDR14 IDR13 IDR12 IDR11 IDR10 IDR9 IDR8 IDR7 IDR6 IDR5 IDR4 IDR3 IDR2 IDR1 IDR0

 Аналогично регистру выхода, регистр входа имеет толь 16 младших действующих бит из 32. Чтение GPIOx_IDR возвращает значение состояния всех линий порта. Биты регистра доступны только для чтения. 

Регистр битовых операций

Port bit set/reset register (GPIOx_BSRR) (x=A..G)

Бит31302928272625242322212019181716
Поле BR15 BR14 BR13 BR12 BR11 BR10 BR9 BR8 BR7 BR6 BR5 BR4 BR3 BR2 BR1 BR0
Бит1514131211109876543211
Поле BS15 BS14 BS13 BS12 BS11 BS10 BS9 BS8 BS7 BS6 BS5 BS4 BS3 BS2 BS1 BS0

Данный регистр позволяет обращаться к конкретной линии ввода вывода микроконтроллера STM32. Запись единицы в один из старших разрядов сбрасывает выход линии, а запись единицы в младшие разряды устанавливает высокий уровень сигнала на соответствующей линии. Запись в регистр производится в формате слова, при этом нулевые биты никакого действия не оказывают. Биты регистра доступны только для записи.

 

Регистр сброса

Port bit reset register (GPIOx_BRR) (x=A..G)

Бит31302928272625242322212019181716
Поле Резерв
Бит1514131211109876543211
Поле BR15 BR14 BR13 BR12 BR11 BR10 BR9 BR8 BR7 BR6 BR5 BR4 BR3 BR2 BR1 BR0

Данный регистр производит сброс высокого уровня линии, установленной в регистре GPIOx_ODR. Задействованы только младшие 16 бит, доступных только для записи.

Еще по теме:

STM32. Работа с базовыми портами ввода/вывода. Примеры.
Первый проект на STM32 Discovery.

 

Добавить комментарий