Категории:

  • Программирование


  • Изобразительное искусство


  • Программирование встраиваемых систем


  • Компьютерная графика


  • WEB Разработка


  • Музыка


  • Инженерия


  • iVARIOUS


  • Mobil App


  • STM32. Регистры портов GPIO

    Электроника В этой статье перейдем к разбору действий для управления портами ввода/вывода. В технической документации к плате Discovery с чипом STM32f407VG указано, что светодиоды подключены к порту GPIOD и ножкам 12, 13, 14, 15. Смотрим в RM0090 Reference manual, и видим, что регистры управления порта D (GPIOD) занимают пространство в памяти, начиная с адреса 0x4002 0C00. Дальше в документации идет описания регистров управления GPIOx (где "х" имя порта:A,B,C...). Первый регистр - GPIOx_MODER, адрес смещения - ноль, то есть он первый в блоке и находится по адресу 0x40020C00. Он отвечает за направление тока : на вход , выход , или режим альтернативной функции ( то есть к ножкам можно подключать разные внутренние блоки/интерфейсы передачи\приема данных, а не только использовать для вкл/выкл +3V). Так как нам нужно зажечь светодиод, устанавливаем режим вывода ножек 12,13,14,15 . Записываем "01" в каждую пару битов нужных ножек, и записываем получившееся число в указатель на регистр GPIOD moder:
    *((uint32_t*)0x40020C00)=0х55000000;

    GPIOD
    GPIOD

    Смотрим дальше, следующий регистр GPIOxOTYPER, можно оставить по умолчанию. GPIOxSPEEDR , скорость считывания состояния ножки, можем оставить по умолчанию. GPIOxPUPDR-регистр позволяет "прижать" ножку к положительному или отрицательному значению тока.
    GPIOx_IDR - Регистр только для чтения, указывает на логическое значение на соответствующей ножке. Можно его использовать, например, если нужно узнать нажата ли кнопка, или пришел ли какой нибудь сигнал на ножку.
    GPIOx_ODR - регистр для чтения и записи. Запись "1" в нужный бит подаст логическую единицу на соответствующую ножку. Запись "0" - сбросит бит, и установит на ножке логический ноль.
    GPIOx_BSRR - Регистр устанавливает логический ноль или единицу на ножках. в отличии от регистра GPIOx_ODR, значение которого нужно переписывать целиком ради установки отдельного бита, GPIOx_BSRR - можно точечно устанавливать соответствующие биты регистра GPIOx_ODR, не перезаписывая его значения целиком. Установка "1" в биты 0-15 , установит биты 0-15 в GPIOx_ODR. Установка "1" в биты 16-31 установит "0" в биты 0-15 в GPIOx_ODR. запись "0" в регистр GPIOx_BSRR не дает никакого эффекта.
    GPIOx_LCKR - регистр устанавливающий блокировку на изменение настроек регистров портов.
    GPIOx_AFRL - Регистр альтернативных функций ножек 0-7.
    GPIOx_AFRH - Регистр альтернативных функций ножек 7-15.

    Адреса регистров GPIO

    #define RCC_GPIO *((uint32_t*)0x40023830) //.................
    #define GPIOA_MODER *((uint32_t*)0x40020000)
    #define GPIOA_OTYPER *((uint32_t*)0x40020004)
    #define GPIOA_OSPEEDR *((uint32_t*)0x40020008)
    #define GPIOA_IDR *((uint32_t*)0x40020010)
    #define GPIOA_PUPDR *((uint32_t*)0x4002000C)
    #define GPIOA_ODR *((uint32_t*)0x0x40020014)
    #define GPIOA_BSRR *((uint32_t*)0x40020018)
    #define GPIOA_AFRL *((uint32_t*)0x40020020)
    #define GPIOA_AFRH *((uint32_t*)0x40020024)
    //.................
    #define GPIOB_MODER *((uint32_t*)0x40020400)
    #define GPIOB_OTYPER *((uint32_t*)0x40020404)
    #define GPIOB_OSPEEDR *((uint32_t*)0x40020408)
    #define GPIOB_IDR *((uint32_t*)0x40020410)
    #define GPIOB_PUPDR *((uint32_t*)0x4002040C)
    #define GPIOB_ODR *((uint32_t*)0x40020414)
    #define GPIOB_BSRR *((uint32_t*)0x40020418)
    #define GPIOB_AFRL *((uint32_t*)0x40020420)
    #define GPIOB_AFRH *((uint32_t*)0x40020424)
    //................
    #define GPIOC_MODER *((uint32_t*)0x40020800)
    #define GPIOC_OTYPER *((uint32_t*)0x40020804)
    #define GPIOC_OSPEEDR *((uint32_t*)0x40020808)
    #define GPIOC_IDR *((uint32_t*)0x40020810)
    #define GPIOC_PUPDR *((uint32_t*)0x4002080C)
    #define GPIOC_ODR *((uint32_t*)0x40020814)
    #define GPIOC_BSRR *((uint32_t*)0x40020818)
    #define GPIOC_AFRL *((uint32_t*)0x40020820)
    #define GPIOC_AFRH *((uint32_t*)0x40020824)
    //.................
    #define GPIOD_MODER *((uint32_t*)0x40020C00)
    #define GPIOD_OTYPER *((uint32_t*)0x40020C04)
    #define GPIOD_OSPEEDR *((uint32_t*)0x40020C08)
    #define GPIOD_IDR *((uint32_t*)0x40020C10)
    #define GPIOD_PUPDR *((uint32_t*)0x40020C0C)
    #define GPIOD_ODR *((uint32_t*)0x40020C14)
    #define GPIOD_BSRR *((uint32_t*)0x40020C18)
    #define GPIOD_AFRL *((uint32_t*)0x40020C20)
    #define GPIOD_AFRH *((uint32_t*)0x40020C24)
    //................
    #define GPIOE_MODER *((uint32_t*)0x40021000)
    #define GPIOE_OTYPER *((uint32_t*)0x40021004)
    #define GPIOE_OSPEEDR *((uint32_t*)0x40021008)
    #define GPIOE_IDR *((uint32_t*)0x40021010)
    #define GPIOE_PUPDR *((uint32_t*)0x4002100C)
    #define GPIOE_ODR *((uint32_t*)0x40021014)
    #define GPIOE_BSRR *((uint32_t*)0x40021018)
    #define GPIOE_AFRL *((uint32_t*)0x40021020)
    #define GPIOE_AFRH *((uint32_t*)0x40021024)



    Читайте больше в категории: Программирование встраиваемых систем

    2016-03-14 16:46:27



    Другие статьи:

    STM32

    Линии и пятна

    JavaScript. innerHTML

    Android. Введение

    STM32. Регистры DMA

    Android. HttpURLConnection. Чтение WEB HTML

    Maya. Сглаживание Smooth и по нормалям

    Математика и Программирование

    STM32. ADC (АЦП)

    Java. Создание графических приложений