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