Программирование STM32. Часть 1. GPIO, порты ввода-вывода STM32. Раздел: STM32 Cortex M3.

Eugene's MCU

Воскресенье, 13.07.2014, 18:54

Главная | | Мой профиль | Выход | RSS
Меню сайта
Категории каталога
Рекламный блок





Рекомендовать этот сайт:

Главная » Статьи » » STM32 Cortex M3


Программирование STM32. Часть 1. GPIO, порты ввода-вывода STM32
§ > Общие сведения
 
     Микроконтроллеры семейства STM32 содержат в своём составе до семи 16-разрядных портов ввода-вывода c именами от PORTA до PORTG. В конкретной модели микроконтроллера без исключений доступны все выводы портов, общее количество которых зависит от типа корпуса и оговорено в DataSheet на соответствующее подсемейство.
     
     Для включения в работу порта x необходимо предварительно подключить его к шине APB2 установкой соответствующего бита IOPxEN в регистре разрешения тактирования периферийных блоков RCC_APB2ENR:
 
    
        RCC->APB2ENR |= RCC_APB2ENR_IOPxEN; // Разрешить тактирование PORTx.
  
   
     Управление портами STM32 осуществляется при помощи наборов из семи 32-разрядных регистров: 

     GPIOx_CRL, GPIOx_CRH – задают режимы работы каждого из битов порта в качестве входа или выхода, определяют конфигурацию входных и выходных каскадов.
     GPIOx_IDR – входной регистр данных для чтения физического состояния выводов порта x.
     GPIOx_ODR– выходной регистр осуществляет запись данных непосредственно в порт.
     GPIOx_BSRR – регистр атомарного сброса и установки битов порта.  
     GPIOx_BSR – регистр сброса битов порта.
     GPIOx_LCKR – регистр блокировки конфигурации выводов.
  
  
§ > Режимы работы выводов GPIO
 
     Режимы работы отдельных выводов определяются комбинацией битов MODEy[1:0] и CNFy [1:0] регистров GPIOx_CRL и GPIOx_CRH (здесь и далее: x-имя порта, y- номер бита порта).
  
     GPIOx_CRL  - регистр конфигурации выводов 0...7 порта x:

      Структура регистра GPIOx_CRH аналогична структуре GPIOx_CRL и предназначена для управления режимами работы старших выводов порта (биты 8...15). 
  
     Биты MODEy указанных регистров определяют направление вывода и ограничение скорости переключения в режиме выхода:
     MODEy[1:0] = 00: Режим входа (состояние после сброса);
     MODEy[1:0] = 01: Режим выхода, максимальная скорость – 10МГц;
     MODEy[1:0] = 10: Режим выхода, максимальная скорость – 2МГц;
     MODEy[1:0] = 11: Режим выхода, максимальная скорость – 50МГц.
 
     Биты CNF задают конфигурацию выходных каскадов соответствующих выводов:
     в режиме входа:
     CNFy[1:0] = 00: Аналоговый вход;
     CNFy[1:0] = 01: Вход в третьем состоянии (состояние после сброса);
     CNFy[1:0] = 10: Вход с притягивающим резистором pull-up (если PxODR=1) или pull-down (если PxODR=0);
     CNFy[1:0] = 11: Зарезервировано.
 
     в режиме выхода:
     CNFy[1:0] = 00: Двухтактный выход общего назначения;
     CNFy[1:0] = 01: Выход с открытым стоком общего назначения;
     CNFy[1:0] = 10: Двухтактный выход с альтернативной функцией;
     CNFy[1:0] = 11: Выход с открытым стоком с альтернативной функцией.

     С целью повышения помехоустойчивости все входные буферы содержат в своём составе триггеры Шмидта. Часть выводов STM32, снабженных защитными диодами, соединёнными с общей шиной и шиной питания, помечены в datasheet как FT (5V tolerant) - совместимые с напряжением 5 вольт.
  
  
§ > Защита битов конфигурации GPIO
  
      Для защиты битов в регистрах конфигурации от несанкционированной записи в STM32 предусмотрен регистр блокировки настроек GPIOx_LCKR:
  
     GPIOx_LCKR - регистр блокировки настроек вывода порта:
     Для защиты настроек отдельного вывода порта необходимо установить соответствующий бит LCKy. После чего осуществить последовательную запись в разряд LCKK значений "1” - "0” - "1”  и две операции чтения регистра LCKR, которые в случае успешной блокировки дадут для бита LCKK значения  "0” и "1” . Защита настроечных битов сохранит своё действие до очередной перезагрузки микроконтроллера.

     Файл определений для периферии микроконтроллеров STM32  stm32f10x.h определяет отдельные группы регистров, объединённые общим функциональным назначением (в том числе и GPIO), как структуры языка Си, а сами регистры как элементы данной структуры. Например: GPIOC->BSRR – регистр BSRR установки/сброса порта GPIOC. 
 
     Воспользуемся определениями из файла stm32f10x.h для иллюстрации работы с регистрами ввода-вывода микроконтроллера STM32F100RB установленного в стартовом наборе STM32DISCOVERY:
  
    
   #include "stm32F10x.h"
   u32 tmp;
   int main (void)
   {
        RCC->APB2ENR |= RCC_APB2ENR_IOPCEN; // Разрешить тактирование PORTC.
        GPIOC->CRH |= GPIO_CRH_MODE8; // Вывод светодиода LED4 PC8 на выход.
        GPIOC->CRH &=~GPIO_CRH_CNF8; // Двухтактный выход на PC8.
        GPIOC->CRH |= GPIO_CRH_MODE9; // Вывод светодиода LED3 PC9 на выход.
        GPIOC->CRH &=~GPIO_CRH_CNF9; // Двухтактный выход на PC9.
        GPIOA->CRL&=~GPIO_CRL_MODE0; // Кнопка "USER" PA0 - на вход.
         // Заблокировать настройки выводов PC8, PC9.
        GPIOC->LCKR = GPIO_LCKR_LCK8|GPIO_LCKR_LCK9|    GPIO_LCKR_LCKK;
        GPIOC->LCKR = GPIO_LCKR_LCK8|GPIO_LCKR_LCK9;
        GPIOC->LCKR = GPIO_LCKR_LCK8|GPIO_LCKR_LCK9|    GPIO_LCKR_LCKK;
        tmp=GPIOC->LCKR; tmp=GPIOC->LCKR;
   } 
  
   
  
§ > Запись и чтение GPIO  
  
     Для записи и чтения портов предназначены входной GPIOx_IDR и выходной GPIOx_ODR регистры данных.
  
     Запись в выходной регистр ODR порта настроенного на вывод осуществляет установку выходных уровней всех разрядов порта в соответствии с записываемым значением. Если вывод настроен как вход с подтягивающими резисторами, состояние соответствующего бита регистра ODR активирует подтяжку вывода к шине питания (pull-up, ODR=1) или общей шине микроконтроллера (pull-down, ODR=0). 
  
     Чтение регистра IDR возвращает значение состояния выводов микроконтроллера настроенных как входы:
    
       
   // Если кнопка нажата (PA0=1), установить биты порта C, иначе сбросить.
   if (GPIOA->IDR & GPIO_IDR_IDR0) GPIOC->ODR=0xFFFF; else GPIOC->ODR=0x0000;
  

  
§ > Сброс и установка битов порта
 
     Для атомарного сброса и установки битов GPIO в микроконтроллерах STM32 предназначен регистр GPIOx_BSRR. Традиционный для архитектуры ARM способ управления битами регистров не требующий применения операции типа "чтение-модификация-запись” позволяет устанавливать и сбрасывать биты порта простой записью единицы в биты установки BS (BitSet) и сброса BR (BitReset)  регистра BSRR. При этом запись в регистр нулевых битов не оказывает влияния на состояние соответствующих выводов.
  
     GPIOx_BSRR – регистр сброса и установки битов порта:
STM32 GPIO BSRR

       
   GPIOC->BSRR=GPIO_BSRR_BS8|GPIO_BSRR_BR9; // Зажечь LED4 (PC8), погасить LED3.
   GPIOC->BSRR=GPIO_BSRR_BS9|GPIO_BSRR_BR8;
// Зажечь LED3 (PC9), погасить LED4.
  

  
§ > Альтернативные функции GPIO и их переназначение (remapping)
 
     Практически все внешние цепи специального назначения STM32 (включая выводы для подключения  кварцевых резонаторов, JTAG/SWD и так далее) могут быть разрешены на соответствующих выводах микроконтроллера, либо отключены от них для возможности их использования в качестве выводов общего назначения. Выбор альтернативной функции вывода осуществляется при помощи регистров с префиксом "AFIO_”.
  
      Помимо этого регистры AFIO_ позволяют выбирать несколько вариантов расположения специальных функций на выводах микроконтроллера. Это в частности относится к выводам коммуникационных интерфейсов, таймеров (регистры AFIO_MAPR), выводам внешних прерываний (регистры AFIO_EXTICR) и т. д.
 
     Подробнее смотрите документы "Reference manual” на соответствующую подгруппу микроконтроллеров.

     Проекты к статье:
     µVision 4.13a  >> STM32GPIO_emcu_uV.rar
     IAR ARM 6.0    >> STM32GPIO_emcu_iar.rar
     IAR ARM 6.21  >> STM32GPIO_emcu_iar_V6.21.rar


     Для управления GPIO STM32 Вы можете применить макросы написанные автором для собственного использования как альтернативу далеко не оптимальным по мнению многих библиотекам от ST:
     >> gpio_emcu.h.rar 
     
§ > Источники:
 
  
     3. ”STM32F100x4, STM32F100x6, STM32F100x8, STM32F100xB Data Sheet”.
     6. ”Руководство по созданию проектов для STM32DISCOVERY в MDK-ARM, uVision”.

     


При использовании материалов сайта ссылка на данный источник обязательна.

Категория: STM32 Cortex M3 | Добавил: eugenemcu (09.12.2010) | Автор:

Просмотров: 61385 | Комментарии: 13 | Рейтинг: 5.0/13 |
Всего комментариев: 13
0 Спам
* 1 (13.12.2010 00:26) [Материал]
Отличная статья! Всё понятно и доходчиво изложено.
Спасибо!!!!

0 Спам
* 2 (12.01.2011 10:30) [Материал]
И главное все работает! Спасибо.

0 Спам
* 3 (04.02.2011 20:06) [Материал]
Вы молодец. Пара вопросов:
1.Главный- откуда брали CMSIS ? Запускаю с CMSIS скачанным у STM-ов компилится но не работает. С вашим- все отлично. Просветите.
2. Почему в кейловском проекте не используете кейловский же файл инициализации? Там тоже подводные камни?

0 Спам
* 4 eugenemcu (06.02.2011 09:32) [Материал]
1. CMSIS, если не ошибаюсь, брал из ST-шных примеров для discovery, которые тут >> http://eugenemcu.ru/load/18-1-0-96
2. Кейлом практически не пользуюсь и особо не разбирался с ним, привычнее IAR. Хотя ещё не решил окончательно с чем работать дальше.

0 Спам
* 5 (03.04.2011 04:54) [Материал]
Приветствую Вас снова.
Сидел разбирался со своим ЖКИ и в результате практических "исследований" параллельно возник вопрос по поводу частот портов GPIO, решил у Вас поинтересоваться, может уже сталкивались с таким и меня направите на путь истинный. Как известно они могут работать в трех режимах частот: 2, 10 и 50 МГц, но если в цикле устанавливать и сбрасывать выход любого порта, из-за конвейера ядра (это мои догадки), у меня частота получилась в районе 1,4 МГц при том, что частота контроллера установлена 24МГц. Как можно проверить и что нужно выводить, чтоб увидеть возможности порта на 2 МГц и 10, о 50 МГц речь не идет, т.к. выше частоты ядра я не перепрыгну (хотя я не удивлюсь если и это не так).
Спасибо.

0 Спам
* 6 eugenemcu (03.04.2011 10:48) [Материал]
А зачем в цикле? В каждый импульс будет добавляться проверка для цикла и переход на начало.
В своё время на kazus-е пытался проверить максимальную скорость дрыганья ногами на тесте с частотой 24МГц, ограничением 50 МГц и десятком последовательных команд сброса и установки (при включенной оптимизации (IAR), константы отправляытся в BSRR за 1 такт):
GPIOC->BSRR=GPIO_BSRR_BS0;
GPIOC->BSRR=GPIO_BSRR_BR0;

Получили частоту переключения выводов 12МГц:

Почему не 24МГц и почему она всегда делится на два, хотя все делители на один, я так и не понял.
В документе "STM32 MCU family" есть такая загадочная фраза ”GPIO Up to 18 MHz”.


0 Спам
* 7 (03.04.2011 17:11) [Материал]
С циклом, согласен, недочет вышел. Ради интереса попробую также десяток команд записать установки, сброса и посмотреть, что выходит. Я понимаю, что ребята с ST для этих целей таймеры с прерываниями предусмотрели или еще что-то (я просто еще не сильно глубоко влез в контроллер), но почему есть до сих пор непонятки с портами, это не есть хорошо.

0 Спам
* 8 (29.04.2011 18:53) [Материал]
ОЧень хорошая статья, но хотелось бы еще чуть чуть поподробнее для чайников. Например как включить порт на вход с внутренним подтягивающим резистором?

0 Спам
* 9 eugenemcu (09.05.2011 22:59) [Материал]
В файле gpio_emcu.h макросы Input Pull Up и Input Pull Down.

0 Спам
* 10 (01.08.2011 13:05) [Материал]
Салют!
Использую Ваш gpio_emcu.h
При вызове pinOutAF_b() любого порта с ногами номер 7 либо 15 компилятор матерится что "Warning[Pe068]: integer conversion resulted in a change of sign"
Это есть ничего страшного?

0 Спам
* 11 eugenemcu (01.08.2011 13:09) [Материал]
Это ничего страшного, но я в какой-то версии добавлял приведение типов, чтобы этого не было.
В той версии, которая выложена сейчас, этого не должно быть, но она как-то скачивается странно с извращением кодировки.

0 Спам
* 12 (10.10.2011 17:41) [Материал]
Спасибо за статью !
Интересно еще узнать о различных режимах работы портов .
Те описать кратко каждый режим и как его можно использовать.

0 Спам
* 13 (12.11.2011 05:06) [Материал]
Спасибо огромное!!! Неделю пытался разобраться как же выводы конфигурировать.. и как входы читать.. Правда, неделю! А тут, настолько доходчиво все, что через полчасика у меня уже на терминал по кнопочке привет печатается)))) Спасибо!

Статистика

Наш магазин




Какую среду разработки Вы используете?

[ Результаты · Архив опросов ]
Всего ответов: 1556



Им нужна Ваша помощь: