Quantcast
Channel: Processors forum - Recent Threads
Viewing all articles
Browse latest Browse all 17527

Linux/AM3358: PRU General Purpose Register access

$
0
0

Part Number:AM3358

Tool/software: Linux

Hi,

General purpose registers __R30 and __R31 are defined in pru header files and can be used for writing and reading I/O pins. If I want to write to GP R1. Can I use the following expression:

 (*(volatile unsigned int *) 0x00024404) = 300;

-Based on global memory map on page 207 of TRM the PRU1 Debug register is located at: 0x0002_4400

-On page 283 register description provides 0x4 offset to get to GPREG1. That is how I came up with address 0x00024404.

My problem is that I don't get correct behavior. In my C code I use function start() defined in assembly file.

void main(void)
{

//    (*(volatile unsigned int *) 0x00024404) = 300;

    start();
}

//Assembly file:

        .cdecls "perfTestContainer.c"

        .clink
        .global start
start:
	;nop
	LDI	r1, 40	 ; load the DELAY value into r1

MAINLOOP:
	CLR	r30.t5		; 
	CLR	r30.t5		; 
	MOV	r0, r1		; l

DELAYOFF:
	SUB	r0, r0, 1	; 
	QBNE	DELAYOFF, r0, 0	; 
	SET	r30.t5		; 
	MOV	r0, r1		; 

DELAYON:
	SUB	r0, r0, 1	; 
	QBNE	DELAYON, r0, 0	; 
	QBA	MAINLOOP	; 
END:
	HALT			; halt the pru 

If I write manually to r1 (    LDI    r1, 40     ; load the DELAY value into r1) I get expected output. However, using (*(volatile unsigned int *) 0x00024404) doesn't work.

I didn't find that those registers are protected or require some special access. Did I miss anything?

Thanks in advance.


Viewing all articles
Browse latest Browse all 17527

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>