【问题标题】:Getting Beaglebone PRUs to work using PASM使用 PASM 让 Beaglebone PRU 工作
【发布时间】:2016-03-10 07:44:25
【问题描述】:

我一直试图让 PRU 以一种对我有意义的方式工作,而此时我完全一无所知。我可以让这些例子发挥作用,但每当我做出改变或尝试从头开始写东西时,我都会把头撞到墙上。我只想作为开始访问任何 USRLEDS 并以某种速度关闭或打开它们,或者作为第一次通过打开 LED 并使其保持打开状态。这是我从网上下载的 PASM 代码(找到后会发布链接):

.origin 0
.entrypoint START
#define PRU0_ARM_INTERRUPT 19
#define AM33XX
#define GPIO1 0x4804c000 //Trying to access the GPIO1
#define GPIO_CLEARDATAOUT 0x190 //writing 1 to the bit you want cleared in GPIO_DATAOUT register (what does that mean?)
#define GPIO_SETDATAOUT 0x194 (set a value for GPIO output pins, which pins am I even writing to? GPIO1?
#define GPIO_OE 0x134 //enable the pins output capabilities
START:
        //clear that bit
        lbco r0, c4, 4, 4 //This creates a constant offset and stores in c4, but why do you need that?
        CLR r0, r0, 4 //if you copied the data why do you need to clear it?
        SBCO r0, C4, 4, 4 //What is this for?

        //MOV r1, 10
        MOV r2, 0x00000000 //store address 0x00 into r2, why?
        MOV r3, GPIO1 //Store GPIO1 address in r3
        MOV r4, GPIO_OE //place address of GPIO_OE into r4
        MOV r5, GPIO_SETDATAOUT //store address of GPIO_SETDATAOUT in r5
        MOV r6, GPIO_CLEARDATAOUT //store addres of GPIOCLEARDATAOUT in r6
        SBBO r2, r3, r4,4 //What is this even doing? Copying 4 bytes from r2 into r3+r4, but why do you want to copy that way and if not why not?

        MOV r1, 10 

        MOV r2, 0xFFFFFFFF //Suppossedly this turn the GPIO1 ON and OFF?
        SBBO r2, r3, r6, 4 and again the storage stuff?
HALT

我还附上了我正在使用的 C 代码:

#include <stdio.h>
#include <pruss/prussdrv.h>
#include <pruss/pruss_intc_mapping.h>

#define PRU_NUM 0 //defining which PRU to use

int main() {
    int ret;
    tpruss_intc_initdata intc = PRUSS_INTC_INITDATA;

    //initialize the PRU by using init command from prussdrv.h
    ret = prussdrv_init();
    if(ret != 0) {
        printf("Error returned: %d\n",ret);
        printf("PRU unable to be initialized");
        return -1;
    }
    ret = prussdrv_open(PRU_EVTOUT_0);
    if(ret != 0) {
        printf("Error returned for prussdrv_open(): %d\n",ret);
        printf("PRU can't open PRU_EVTOUT_0");
        return -1;
    }
    //Map PRUS's INTC
    ret = prussdrv_pruintc_init(&intc);
    if (ret != 0) {
        printf("Error returned for prussdrv_pruintc_int\n");
        printf("PRU doesn't work");
        return -1;
    }

    //load and execute binary on PRU 
    prussdrv_exec_program(PRU_NUM, "./ashwini_test.bin");

    prussdrv_pru_wait_event(PRU_EVTOUT_0);

    prussdrv_pru_clear_event(PRU_EVTOUT_0,PRU0_ARM_INTERRUPT);

    /*Disable PRU and close memory mappings*/
    prussdrv_pru_disable(PRU_NUM);
    prussdrv_exit();
    //prussdrv_pru_wait_event(PRU_EVTOUT_0);
    return 0;
    }

我浏览过 TRM 和 https://groups.google.com/forum/#!topic/beaglebone/98eF1wQE_QA,以及 elinux 和 derekmolloy,我只是觉得我缺少一些关于地址方案如何工作或如何思考这些事情的基本知识。再次感谢您的帮助!

【问题讨论】:

    标签: beagleboneblack beagleboard


    【解决方案1】:

    当您说这是您的 PASM 代码时...您的意思是它是您从其他地方获得并尝试使用的代码吗?因为大多数行上的 cmets 都在询问他们做了什么,这使得它看起来不太可能是你的代码......

    无论如何,除非您有具体问题,否则无法真正回答,但有大量关于如何在 BeagleBone 的 AM335x 处理器上使用 GPIO 子系统的信息。不久前我在一篇文章中谈到了它:https://graycat.io/tutorials/beaglebone-io-using-python-mmap/

    我在这里也有一些记录在案的 PRU 组装示例:https://github.com/alexanderhiam/PRU-stuffs

    【讨论】:

    • 是的,我是从互联网上得到的,所以我很抱歉说它是“我的代码”。我真的没有问题,更多的是关于这件事甚至在做什么(很高兴地说我不知道​​我在做什么)。我相信我终于弄清楚了它的含义,我会先浏览你的网站,看看我是否有更具体的问题。感谢您链接您的网站,这对我来说应该是一个很好的开始。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-11-20
    • 1970-01-01
    • 2019-01-05
    • 2018-12-31
    • 2016-03-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多