Home > ARM, Контроллеры, Роботы > Урок 1. GPIO в STM32F100RB

Урок 1. GPIO в STM32F100RB

Всем доброго времени суток!
Приступим – с.

Как же расшифровывается GPIO? А очень просто: General Purpose Input/Output -входы/выходы общего назначения.

У каждого GPIO есть 7 регистров:

  • 2 32-битных конфигурационных регистра: GPIOx_CRL и  GPIOx_CRH (control register low/high)
  • 2 32-битных регистра данных: GPIOx_IDR (input data register),  GPIOx_ODR (output data register)
  • 32-битный  регистр для атомарной работы с битами порта: GPIOx_BSRR (port bit set/reset register)
  • 16-битный регистр сброса GPIOx_BRR (reset register)
  • 32-битный блокирующий регистр GPIOx_LCKR (lock register)

Каждый бит порта может быть запрограммирован, однако взаимодействие с 32-битными регистрами может осуществляться только с помощью 32-битных слов. Чтобы обеспечить побитовый доступ, существуют регистры GPIOx_BSRR  и  GPIOx_BRR. Поэтому можно не опасаться того, что прерывание помешает изменить какой-либо бит.

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

31

30

29

28

27

26

25

24

23

22

21

20

19

18

17

16

CNF7

MODE7

CNF6

MODE6

CNF5

MODE5

CNF4

MODE4

rw

rw

rw

rw

rw

rw

rw

rw

rw

rw

rw

rw

rw

rw

rw

rw

15

14

13

12

11

10

9

8

7

6

5

4

3

2

1

0

CNF3

MODE3

CNF2

MODE2

CNF1

MODE1

CNF0

MODE0

rw

rw

rw

rw

rw

rw

rw

rw

rw

rw

rw

rw

rw

rw

rw

rw

Регистр  GPIOx_CRH имеет такую же структуру и обслуживают пины с 8 по 15.

MODEy[1:0] – управление направлением работы вывода и максимальной скоростью:

  •  00 – вход (режим по-умолчанию)
  • 01 – выход, максимальная скорость работы 10 МГц
  • 10 – выход, максимальная скорость работы 5 МГц
  • 11 – выход, максимальная скорость работы 50 МГц

CNFy[1:0] – биты управления конфигурацией соответствующего вывода порта.
В режиме входа (MODEy[1:0]=00):

  • Аналоговый вход
  • Вход в третьем состоянии (по-умолчанию)
  • Вход с подтягивающим резистором либо к напряжению питания либо к земле
  • Зарезервировано (не используется)

В режиме выхода  (MODEy[1:0]>00):

  • Двухтактный вывод общего назначения
  • Вывод общего назначения с открытым коллектором
  • Двухтактный вывод со специальной функцией
  • Вывод со специальной функцией с открытым коллектором

После сброса регистр инициализируется значением 0x44444444.

Регистры ввода-вывода  GPIOx_IDR и GPIOx_ODR.

Эти регистры также занимают 32 бита, но биты 31-16 не используются, биты 15-0  можно лишь читать (для IDR) или лишь писать (для ODR). Чтение/запись осуществляется только с помощью слова, то-есть 16 бит за раз.

Регистр для побитового доступа к GPIOx GPIOx_BSRR. 

31

30

 

17

16

BR15

BR14

BR1

BR0

w

w

w

w

15

14

 

1

0

BS15

BS14

BS1

BS0

w

w

w

w

Биты BRy – PORTx Reset Bit и BSy – PORTy Bit Set предназначены для установки в 1 или сброса определенного пина порта. Соответственно, чтобы установить 13 вывод порта С в единицу, надо выполнить следующее действие:

GPIOC_BSRR = GPIO_BSRR_BS13;

А для установки в нули вот такое:

  GPIOC_BSRR = GPIO_BSRR_BR13;

В общем виде это можно описать так:

BRy – PORTx Reset Bit: биты предназначены только для записи.

  • Запись единицы приведедет к сбросу вывода с номером y
  • Запись нуля не изменит состояние вывода с номером y

BSy – PORTx Set Bit: биты предназначены только для записи.

  • Запись единицы приведедет к установлению в 1 вывода с номером y
  • Запись нуля не изменит состояние вывода с номером y

Блокирующий регистр  GPIOx_LCKR

Значение после сброса – 0x0000 0000

Этот регистр предназначен для пресечния нежелательных попыток модификации конфигурационных регистров порта.

31

17

16

15

 

0

Reserved

LCKK

LCK15

LCK0

rw

rw

rw

Биты с 31 по 17 не используются, биты с 15 по 0 используются для блокировки регистров конфигурации GPIO. Установка бита LCKy приводит к блокировке 4 битов: MODEy[1:0] и CNFy[1:0] из   GPIOx_CRL или GPIOx_CRH.

LCKK – бит применения блокировки. Чтобы заблокировать, необходимо произвести следующую последовательность опреаций (LOCK key writing sequence):

  1. Запись в LCKK 1
  2. Запись в LCKK 0
  3. Запись в LCKK 1
  4. Чтение LCKK – вернёт 0
  5. Чтение LCKK – вернёт 1.

Последний шаг не является обязательным, но получение 1 из LCKK свидетельствует об успешности блокировки.

Необходимо помнить, что значения регистров LCKy не должны изменяться во время записи последовательности в регистр LCKK. Ошибка в блокирующей последовательности не приведет к блокировке.

Блокировка сохраняется до перезагрузки контроллера.

Небольшой пример (с STM32VLDISCOVERY):

    1. #include "stm32f10x.h"
    2. //Переменная для чтения регистра LCKR
    3. u32 temp;
    4. //Самописная процедура задержки
    5. void Delay( unsigned int Val);
    6. int main( void)
    7. {
    8.  //Разрешаем тактирование порта C - это необходимо, чтобы вс стабильно работало
    9.  RCC->APB2ENR |= RCC_APB2ENR_IOPCEN;
    10.  //Определяем направление PC8 - выход
    11.  GPIOC->CRH |= GPIO_CRH_MODE8;
    12.  //Устанавливаем тип выхода PC8 - двухтактный
    13.  GPIOC->CRH &=~GPIO_CRH_CNF8;
    14.  //Блокируем настройки порта С - чисто ради примера
    15.  //Пишем единицы в биты LCK8 и LCKK
    16.  GPIOC->LCKR = GPIO_LCKR_LCK8 | GPIO_LCKR_LCKK;
    17.  //Пишем единицу в LCK8 и ноль в LCKK
    18.  GPIOC->LCKR = GPIO_LCKR_LCK8;
    19.  //Вновь пищем единицы в LCK8 и LCKK
    20.  GPIOC->LCKR = GPIO_LCKR_LCK8 | GPIO_LCKR_LCKK;
    21.  //Читаем регистр первый раз
    22.  temp=GPIOC->LCKR;
    23.  //Читаем регистр второй раз
    24.  temp=GPIOC->LCKR;
    25.  //Бесконечый цикл для мигания светодиодом
    26.  for(;;)
    27.  {
    28.     //Устанавливаем PC8 в 1
    29.     GPIOC->BSRR=GPIO_BSRR_BS8;
    30.     //Задержка
    31.     Delay(600000);
    32.     //Сбрасываем PC8 в 0
    33.     GPIOC->BSRR=GPIO_BSRR_BR8;
    34.     //Задержка
    35.     Delay(600000);
    36.  }
    37. }
    38. void Delay( unsigned int DelayValue)
    39. {
    40.   for( ; DelayValue > 0; --DelayValue)
    41.   {
    42.      __NOP();
    43.   }
    44. }

Эта программа заставит синий светодиодик мигать 🙂

Advertisements
  1. Yurij
    05.06.2012 at 04:22

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

  1. No trackbacks yet.

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

%d bloggers like this: