IO Functions
PRU↔Header pin mappings
R30 Register bit (Output) | R31 Register bit (Input) | Header pin |
---|---|---|
- | 16 | P1_20 |
7 | 7 | P1_29 |
4 | 4 | P1_31 |
1 | 1 | P1_33 |
0 | 0 | P1_36 |
- | 15 | P2_18 |
15 | - | P2_33 |
- | 14 | P2_22 |
14 | - | P2_24 |
6 | 6 | P2_28 |
3 | 3 | P2_30 |
2 | 2 | P2_32 |
5 | 5 | P2_34 |
R30 Register bit (Output) | R31 Register bit (Input) | Header pin |
---|---|---|
9 | 9 | P1_02 |
11 | 11 | P1_04 |
15 | 15 | P1_30 |
14 | 14 | P1_32 |
10 | 10 | P1_35 |
- | 16 | P2_31 |
8 | 8 | P2_35 |
R30 Register bit (Output) | R31 Register bit (Input) | Header pin |
---|---|---|
- | 15 | P8_15 |
15 | - | P8_11 |
- | 14 | P8_16 |
14 | - | P8_12 |
7 | 7 | P9_25 |
5 | 5 | P9_27 |
3 | 3 | P9_28 |
1 | 1 | P9_29 |
2 | 2 | P9_30 |
0 | 0 | P9_31 |
6 | 6 | P9_41 |
4 | 4 | P9_42 |
R30 Register bit (Output) | R31 Register bit (Input) | Header pin |
---|---|---|
13 | 13 | P8_20 |
12 | 12 | P8_21 |
8 | 8 | **P8_27 |
10 | 10 | **P8_28 |
9 | 9 | **P8_29 |
6 | 6 | **P8_39 |
7 | 7 | **P8_40 |
4 | 4 | **P8_41 |
5 | 5 | **P8_42 |
2 | 2 | **P8_43 |
3 | 3 | **P8_44 |
0 | 0 | **P8_45 |
1 | 1 | **P8_46 |
** Before using these pins, you need to disable HDMI functionality.
You can read how to do this here
R30 Register bit (Output) | R31 Register bit (Input) | Header pin |
---|---|---|
- | 15 | P8_15 |
15 | - | P8_11 |
- | 14 | P8_16 |
14 | - | P8_12 |
7 | 7 | P9_25 |
5 | 5 | P9_27 |
3 | 3 | P9_28 |
1 | 1 | P9_29 |
2 | 2 | P9_30 |
0 | 0 | P9_31 |
6 | 6 | P9_41 |
4 | 4 | P9_42 |
R30 Register bit (Output) | R31 Register bit (Input) | Header pin |
---|---|---|
13 | 13 | P8_20 |
12 | 12 | P8_21 |
8 | 8 | **P8_27 |
10 | 10 | **P8_28 |
9 | 9 | **P8_29 |
6 | 6 | **P8_39 |
7 | 7 | **P8_40 |
4 | 4 | **P8_41 |
5 | 5 | **P8_42 |
2 | 2 | **P8_43 |
3 | 3 | **P8_44 |
0 | 0 | **P8_45 |
1 | 1 | **P8_46 |
** Before using these pins, you need to disable HDMI functionality.
You can read how to do this here
R30 Register bit (Output) | R31 Register bit (Input) | Header pin |
---|---|---|
3 | 3 | P8_12 |
4 | 4 | P8_11 |
5 | 5 | P9_15 |
17 | 17 | P9_26 |
R30 Register bit (Output) | R31 Register bit (Input) | Header pin |
---|---|---|
1 | 1 | P9_20 |
2 | 2 | P9_19 |
3 | 3 | P9_41 |
5 | 5 | P8_18 |
6 | 6 | P8_19 |
7 | 7 | P8_13 |
9 | 9 | P8_14 |
10 | 10 | P9_42 |
11 | 11 | P9_27 |
14 | 14 | P9_14 |
15 | 15 | P9_16 |
16 | 16 | P8_15 |
17 | 17 | P8_26 |
18 | 18 | P8_16 |
R30 Register bit (Output) | R31 Register bit (Input) | Header pin |
---|---|---|
10 | 10 | P8_33 |
11 | 11 | P8_31 |
6 | 6 | P8_38 |
7 | 7 | P8_36 |
20 | 20 | P8_08 |
15 | 15 | P9_13 |
3 | 3 | P8_39 |
2 | 2 | P8_42 |
9 | 9 | P8_35 |
8 | 8 | P8_34 |
5 | 5 | P8_37 |
4 | 4 | P8_40 |
17 | 17 | P8_28 |
18 | 18 | P8_29 |
19 | 19 | P8_30 |
1 | 1 | P8_41 |
0 | 0 | P8_44 |
14 | 14 | P9_11 |
R30 Register bit (Output) | R31 Register bit (Input) | Header pin |
---|---|---|
0 | 0 | P8_32 |
5 | 5 | P9_25 |
6 | 6 | P8_09 |
10 | 10 | P9_31 |
8 | 8 | P9_18 |
16 | 16 | P8_07 |
15 | 15 | P8_10 |
17 | 17 | P8_27 |
20 | 20 | P8_43 |
18 | 18 | P8_45 |
19 | 19 | P8_46 |
9 | 9 | P9_17 |
13 | 13 | P9_28 |
11 | 11 | P9_29 |
12 | 12 | P9_30 |
** Before using these pins, you need to disable HDMI functionality.
You can read how to do this here
- All Header pins are
constant integer variable
by default, with its value equal to respective R30/R31 register bit - Example:
P1_20
is an constant integer variable with value16
, similaryP1_02
is an constant integer variable with value9
Digital Write
digital_write
is a function which enables PRU to write given logic level at specified output pin. It is a function with void return type and it's parameters are integer
and boolean
, first parameter is the pin number to write to or PRU R30 register bit and second parameter is boolean
value to be written. true
for HIGH and false
for LOW.
Syntax
digital_write(pin_number, value);
Parameters
pin_number
is an integer. It must be a header pin name which supports output, or PRU R30 Register bit.value
is a boolean. It is used to set logic level of the output pin,true
for HIGH andfalse
for LOW.
Return Type
void
- returns nothing.
Example
int a := 32;
if : a < 32 {
digital_write(P1_29, true);
}
else {
digital_write(P1_29, false);
}
If the value of a < 32, then pin P1_29
is set to HIGH
or else it is set to LOW
.
Digital Read
digital_read
is a function which enables PRU to read logic level at specified input pin. It is a function with return type boolean
and it's parameter is a integer
whose value must be the pin number to be read or PRU R31 register bit.
Syntax
digital_read(pin_number);
Parameters
pin_number
is an integer. It must be a header pin name which supports input, or PRU R31 Register bit.
Return Type
boolean
- returns the logic level of the pin number passed to it. It returnstrue
for HIGH andfalse
for LOW.
Example
if digital_read(P1_20) {
digital_write(P1_29, false);
}
else {
digital_write(P1_29, true);
}
Logic level of pin P1_20
is read. If it is HIGH, then pin P1_29
is set to LOW
, or else it is set to HIGH
.
Delay
delay
is a function which makes PRU wait for specified milliseconds. When this is called PRU does absolutely nothing, it just sits there waiting.
Syntax
delay(time_in_ms);
Parameters
time_in_ms
is an integer. It is the amount of time PRU should wait in milliseconds. (1000 milliseconds = 1 second).
Return Type
void
- returns nothing.
Example
digital_write(P1_29, true);
delay(2000);
digital_write(P1_29, false);
Logic level of pin P1_29
is set to HIGH
, PRU waits for 2000 ms = 2 seconds, and then sets the logic level of pin P1_29
to LOW
.
Start counter
start_counter
is a function which starts PRU's internal counter. It counts number of CPU cycles. So it can be used to count time elapsed, as it is known that each cycle takes 5 nanoseconds.
Syntax
start_counter()
Paramters
- n/a
Return Type
void
- returns nothing.
Example
start_counter();
Stop counter
stop_counter
is a function which stops PRU's internal counter.
Syntax
stop_counter()
Paramters
- n/a
Return Type
void
- returns nothing.
Example
stop_counter();
Read counter
read_counter
is a function which reads PRU's internal counter and returns the value. It counts number of CPU cycles. So it can be used to count time elapsed, as it is known that each cycle takes 5 nanoseconds.
Syntax
read_counter()
Parameters
- n/a
Return Type
integer
- returns the number of cycles elapsed since callingstart_counter
.
Example
start_counter();
while : read_counter < 200000000 {
digital_write(P1_29, true);
}
digital_write(P1_29, false);
stop_counter();
while the value of hardware counter is less than 200000000, it will set logic level of pin P1_29
to HIGH
, after that it will set it to LOW
. Here, 200000000 cpu cycles means 1 second of time, as CPU clock is 200 MHz. So, LED will turn on for 1 second, and turn off after.
Init message channel
init_message_channel
is a function which is used to initialise communication channel between PRU and the ARM core. It is sets up necessary structures to use RPMSG to communicate, it expects a init message from the ARM core to initialise. It is a necessary to call this function before using any of the message functions.
Syntax
init_message_channel()
Parameters
- n/a
Return Type
void
- returns nothing
Example
init_message_channel();
Receive message
receive_message
is a function which is used to receive messages from ARM to the PRU, messages can only be integers
, as only they are supported as of now. It uses RPMSG channel setup by init_message_channel
to receive messages from ARM core.
Syntax
receive_message()
Parameters
- n/a
Return Type
integer
- returns integer data received from PRU
Example
init_message_channel();
int emp := receive_message();
if : emp >= 0 {
digital_write(P1_29, true);
}
else {
digital_write(P1_29, false);
}
Send message
There are six functions which are used to send messages to ARM core from PRU, messages can be integers
, characters
, bools
, integer arrays
, character arrays
, and boolean arrays
. It uses RPMSG channel setup by init_message_channel
to send messages from PRU to the ARM core.
For sending arrays, arrays are automatically converted to a string, for example, [1, 2, 3, 4] would become "1 2 3 4".
Syntax
send_int(expression)
send_char(expression)
send_bool(expression)
send_ints(identifier)
send_chars(identifier)
-
send_bools(identifier)
-
send_message
is an alias forsend_int
to preserve backwards compatibility.
Parameters
- For
send_int
andsend_char
,expression
would be an arithmetic expression. - For
send_bool
,expression
would be a boolean expression - For
send_ints
,identifier
should be an identifier for an integer array. - For
send_chars
,identifier
should be an identifier for a character array. - For
send_bools
,identifier
should be an identifier for a boolean array.
Example
init_message_channel();
if : digital_read(P1_29) {
send_bool(true);
}
else {
send_int(0);
}