Project

General

Profile

R1 GPIO » History » Version 5

krufter_multiclet, 06/15/2015 06:11 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 5 krufter_multiclet
GPIOC - 24 разряда
7 5 krufter_multiclet
GPIOD - 32 разряда
8 1 krufter_multiclet
GPIOE - 28 разрядов
9 5 krufter_multiclet
GPIOF - 22 разряда
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