R1 GPIO » History » Version 4
krufter_multiclet, 05/13/2015 05:42 PM
| 1 | 1 | krufter_multiclet | h1. GPIO Мультиклет R1 |
|---|---|---|---|
| 2 | 1 | krufter_multiclet | |
| 3 | 1 | krufter_multiclet | В процессоре R1 реализованы следующие порты GPIO: |
| 4 | 1 | krufter_multiclet | GPIOA - 30 разрядов |
| 5 | 1 | krufter_multiclet | GPIOB - 30 разрядов |
| 6 | 1 | krufter_multiclet | GPIOC - 28 разрядов |
| 7 | 1 | krufter_multiclet | GPIOD - 32 разрядов |
| 8 | 1 | krufter_multiclet | GPIOE - 28 разрядов |
| 9 | 1 | krufter_multiclet | GPIOF - 31 разряд |
| 10 | 1 | krufter_multiclet | |
| 11 | 1 | krufter_multiclet | Выводы портов могут быть сконфигурированы на вход, выход или как альтернативная функция. |
| 12 | 2 | krufter_multiclet | По форме и уровню сигналов на выводах портов может быть задано прерывание(по фронту, спаду; высокому, низкому уровню ). |
| 13 | 2 | krufter_multiclet | |
| 14 | 2 | krufter_multiclet | Для работы с портами GPIO предназначены следующие регистры: |
| 15 | 2 | krufter_multiclet | GPIO_IN - регистр принимаемых данных |
| 16 | 2 | krufter_multiclet | GPIO_OUT - регистр передаваемых данных |
| 17 | 2 | krufter_multiclet | GPIO_DIR - регистр направления передачи данных (вход или выход) |
| 18 | 2 | krufter_multiclet | GPIO_MSK - регистр маски прерываний |
| 19 | 2 | krufter_multiclet | GPIO_POL - регистр настройки прерываний по событию - полярность сигнала |
| 20 | 2 | krufter_multiclet | GPIO_EDG - регистр настройки прерываний по событию - составляющая сигнала |
| 21 | 2 | krufter_multiclet | GPIO_BPS - регистр разрешения альтернативных функций |
| 22 | 2 | krufter_multiclet | |
| 23 | 2 | krufter_multiclet | Рассмотрим пример на Си: |
| 24 | 3 | krufter_multiclet | <pre><code class="c"> |
| 25 | 3 | krufter_multiclet | #include <gpio.h> |
| 26 | 3 | krufter_multiclet | |
| 27 | 3 | krufter_multiclet | main() |
| 28 | 3 | krufter_multiclet | { |
| 29 | 3 | krufter_multiclet | GPIOB->OUT = 1<<20; //устанавливаем в регистре передаваемых данных 20-й бит порта B в "1" |
| 30 | 3 | krufter_multiclet | GPIOB->DIR = (1<<20) | (1<<21); //устанавливаем 20 и 21 биты порта B на выход |
| 31 | 3 | krufter_multiclet | //в результате на порту B 20-й бит будет установлен в "1", 21-й бит в "0". |
| 32 | 3 | krufter_multiclet | } |
| 33 | 3 | krufter_multiclet | </code></pre> |
| 34 | 3 | krufter_multiclet | |
| 35 | 3 | krufter_multiclet | Этот же пример на ассемблере: |
| 36 | 3 | krufter_multiclet | <pre><code class="php"> |
| 37 | 3 | krufter_multiclet | .include R1_pcf.inc |
| 38 | 3 | krufter_multiclet | |
| 39 | 3 | krufter_multiclet | set_port: |
| 40 | 3 | krufter_multiclet | getl 1<<20 |
| 41 | 3 | krufter_multiclet | wrl @1, GPIOB_OUT ;устанавливаем в регистре передаваемых данных 20-й бит порта B в "1" |
| 42 | 3 | krufter_multiclet | getl ((1<<20) | (1<<21)) |
| 43 | 3 | krufter_multiclet | wrl @1, GPIOB_DIR ;устанавливаем 20 и 21 биты порта B на выход |
| 44 | 3 | krufter_multiclet | ;в результате на порту B 20-й бит будет установлен в "1", 21-й бит в "0". |
| 45 | 3 | krufter_multiclet | complete |
| 46 | 3 | krufter_multiclet | </code></pre> |
| 47 | 2 | krufter_multiclet | |
| 48 | 4 | krufter_multiclet | *Примечание:* Если альтернативная функция битов порта GPIO, задаваемая через BPS - выход, то биты порта конфигурируются в соответствии с направлением BPS. Если альтернативная функция битов порта GPIO, задаваемая через BPS - вход, то биты порта конфигурируются в соответствии с направлением DIR. Таким образом, если установлен бит в DIR в "1", то установка в "1" BPS для текущего бита не позволит ему сконфигурироваться на вход(только на выход). В этом случае необходимо сначала сконфигурировать бит в DIR в "0" и из такого положения с помощью BPS регистра бит конфигурируется на любое направление для альтернативной функции. |
| 49 | 2 | krufter_multiclet | |
| 50 | 2 | krufter_multiclet | |
| 51 | 2 | krufter_multiclet | |
| 52 | 2 | krufter_multiclet | |
| 53 | 2 | krufter_multiclet |