This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

AM3358上PRU点亮灯USR1

Other Parts Discussed in Thread: AM3358

 我现在用的开发板是BBB中国版,CPU是AM3358,我现在想做的就是用AM3358上的PRU点亮灯USR1,我现在用的是裸版调试,CCS版本是5.5,仿真器用的是XDS100V2,GEL文件(AM335x_15x15_EVM.GEL和AM335x_PRU_ICSS.GEL)成功加载了,程序很简单,就是往0x4804c194上写0x00400000,其中0x4804c194是GPIO1_SETDATAOUT,因为USR1是GPIO1_22,通过Load Program的方式将编译好的bin文件下载进PRU0 core,我也查看了CCS上的反汇编代码,也是对的,但USR1就是点不亮,我想通过A8 core查看GPIO1_SETDATAOUT寄存器的地址,但提示我Error:unable to read。不知道是哪里出了问题?小白求指教。

  • 看你的描述,有点疑问:你是使用GPIO1_22进行灯的点亮,这是通过GPIO模块进行的操作,和你的PRU程序之间有什么关系呢?

    我想到的一个场景是:PRU写了一个触发式的中断映射到了ARM端,由PRU产生中断,map到ARM端后,通过中断处理函数点亮灯,是这样玩的吗?

    从你上面描述中看到的一些问题:

    1. AM335x_15x15_EVM.GEL这个是给GPEVM板(version1.5)配置的gel文件,原版的BBB的配置文件应该是AM3358_StarterKit_modif_for_BBB.gel,我放在附件中了,先确认一下在使用了GEL文件以后,你的DDR3部分是否能正常读写,可通过CCS仿真写入0x8000_0000地址以后的区域进行测试。

    2. 你先别通过PRU触发,直接测试那个点亮灯的程序,看是否能正常工作,确保在ARM端跑的程序时是对的。然后再加入PRU的部分,这样比较容易辨识出问题在哪儿。

  • 原版BBB上使用的是4Gb的DDR3L,MT41K256M16HA -125:E,和中国版的应该是一样的,你使用这个gel文件试一下。

    DDR3主要配置部分如下:
    //*******************************************************************
    //DDR3 PHY parameters
    //*******************************************************************

    #define CMD_PHY_CTRL_SLAVE_RATIO 0x40
    #define CMD_PHY_INVERT_CLKOUT 0x1

    #define DATA_PHY_RD_DQS_SLAVE_RATIO 0x38 //AB modified
    #define DATA_PHY_FIFO_WE_SLAVE_RATIO 0x94 //RD DQS GATE // AB modified 0x100
    #define DATA_PHY_WR_DQS_SLAVE_RATIO 0x44 //AB modified
    #define DATA_PHY_WR_DATA_SLAVE_RATIO 0x7D //WRITE DATA //AB modified 0xC1

    #define DDR_IOCTRL_VALUE (0x18B)

    //******************************************************************
    //EMIF parameters
    //******************************************************************
    #define ALLOPP_DDR3_READ_LATENCY 0x100007 //AB modified //RD_Latency = (CL + 2) - 1 = 6 + 2 - 1 = 7 // Also the leading 1 seem to linked with IO receiver power down capability of the DDR3L
    #define ALLOPP_DDR3_SDRAM_TIMING1 0x0AAAD4DB //AB modified
    #define ALLOPP_DDR3_SDRAM_TIMING2 0x266B7FDA
    #define ALLOPP_DDR3_SDRAM_TIMING3 0x501F867F

    #define ALLOPP_DDR3_SDRAM_CONFIG 0x61C05332 //termination = 1 (RZQ/4) //AB modified
    //dynamic ODT = 2 (RZQ/2)
    //SDRAM drive = 0 (RZQ/6)
    //CWL = 0 (CAS write latency = 5)
    //CL = 4 (CAS latency = 6)
    //ROWSIZE = 6 (15 row bits)
    //PAGESIZE = 2 (10 column bits)
    #define ALLOPP_DDR3_REF_CTRL 0x00000C30 // AB modified //400 * 7.8us = 0xC30
    #define ALLOPP_DDR3_ZQ_CONFIG 0x50074BE4

    AM3358_StarterKit_modif_for_BBB.gel
  • 您好,我这种做法也是参照一篇博客上去做的,它的目的就是通过PRU写GPIO1的寄存器,使得灯USR1亮,对于PRU来说,AM335x的全局地址是否都是可以配置的?还有就是通过CCS,是否可以直接设置片内寄存器的值?

  • 了解你的应用了。是的,PRU是可以访问ARM的memory map中的寄存器的。

    可以的,通过memory browser中输入相应的地址,就能查看到这些寄存器的值。

  • 额,那就奇怪了,我想查看A8 core中的GPIO1寄存器的值,但都提示Error:unable to read,不知道是什么原因?我的BBB硬件肯定是没问题的,因为我的linux可以正常运行。

  • 你怎么查看的?通过A8?还是PRU?能否提供一下具体的操作方式?(包括系统环境和命令)

    PS:如果你在Linux kernel启动了后,使用CCS去连接A8,查看寄存器的地址,是有问题的,因为Linux有内存管理单元,做了地址映射。

  • 您好,首先我在连JTAG时Linux Kernel是不会运行的,因为我已将放镜像文件的TF卡拔出,另外若Linux Kernel运行时,CCS是无法正常连接A8的。我是尝试使用两种方式去修改0x4804c194这个寄存器的,方法如下:

    1.PRU方式的话,我是自己写了一小段的汇编代码,代码很简单,就是直接往0x4804c194上写0x0040000,也就是将GPIO1_22引脚拉高,查看反汇编代码也是正确的,但是灯USR1无法正常亮起;

    2.后来我尝试直接修改该寄存器的值,所以我就选中A8-Core,选择Registers->GPIO1->GPIO1_SETDATAOUT,尝试读取并修改该寄存器的值,结果提示Error:unable to read,直接修改也无法成功;

    不知道我描述清楚了没?感谢您的回复。

  • 我明白了,就是说,你现在是在纯CCS的环境下,连接了PRU和A8,去做了以上操作,PRU的代码也是通过CCS用load memory的方式load进去的对吧?运行起来反汇编也正常,程序也走到了相应的指令了。然后再尝试直接修改A8相关寄存器的值,但是失败了是吧?

    在你ARM端的程序中,有没有做GPIO1的初始化呢?如果做了,不通过PRU的程序,直接在ARM端的程序上点灯,或者是通过寄存器读写有问题吗?

  • 是的,我就是按照这个思路走的。ARM端的话我目前只运行了一个您之前给我的AM3358_StarterKit_modif_for_BBB.gel文件,GPIO1的初始化工作我应该是没做,这个初始化工作应该怎样完成?通过GEL文件还是其他方式?感谢您的回复。

  • GPIO1的初始化没做,时钟域可能都没打开,是不能正常操作GPIO的。

    因为你是在CCS中做这个测试,我推荐你用一下Starterware:http://software-dl.ti.com/dsps/dsps_public_sw/am_bu/starterware/latest/index_FDS.html

    这就是个裸机程序,比较容易上手,里面有GPIO的历程,包括了GPIO的初始化过程,不过印象中是GPIO0组的,GPIO1组需要你根据进行修改:

    AM335X_StarterWare_02_00_01_01\build\armv7a\cgt_ccs\am335x\beaglebone\gpio

    改完后,load bin文件夹下的对应out文件运行,初始化GPIO后,你再试试是不是就可以点亮你的灯了(或者直接跑这个例程,找到对应的管脚)

  • 您好,我现在用的开发板是BBB美国版,CPU是AM3358,我想把程序拷进PRU中,我查看了BBB的原理图,发现它没有把JTAG脚引出来,您是怎么使用XDS100V2连接到BBB板子上的,先谢谢您

  • 根据原理图把接插件焊上去就行了。

  • Bin Wang4 :你好,看到你的帖子说:“你在用PRU对GPIO1_SETDATAOUT寄存器操作时写不进数,但反汇编代码是对的。” 不知后来是如何解决的。我现在遇到对3558的SPI0寄存器写数或读数结果都不正确的情况,但查反汇编码是正确,且程序中对PRU的R31寄存器,shareRAM都操作正确。所以希望得到你的帮助。谢谢。

  • 谢谢您啦,问题已经解决