我现在用的开发板是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。不知道是哪里出了问题?小白求指教。
Steven Liu1:
看你的描述,有点疑问:你是使用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的部分,这样比较容易辨识出问题在哪儿。
Steven Liu1:
回复 Steven Liu1:
原版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
user4088306:
回复 Steven Liu1:
您好,我这种做法也是参照一篇博客上去做的,它的目的就是通过PRU写GPIO1的寄存器,使得灯USR1亮,对于PRU来说,AM335x的全局地址是否都是可以配置的?还有就是通过CCS,是否可以直接设置片内寄存器的值?
Steven Liu1:
回复 user4088306:
了解你的应用了。是的,PRU是可以访问ARM的memory map中的寄存器的。
可以的,通过memory browser中输入相应的地址,就能查看到这些寄存器的值。
user4088306:
回复 Steven Liu1:
额,那就奇怪了,我想查看A8 core中的GPIO1寄存器的值,但都提示Error:unable to read,不知道是什么原因?我的BBB硬件肯定是没问题的,因为我的linux可以正常运行。
Steven Liu1:
回复 user4088306:
你怎么查看的?通过A8?还是PRU?能否提供一下具体的操作方式?(包括系统环境和命令)
PS:如果你在Linux kernel启动了后,使用CCS去连接A8,查看寄存器的地址,是有问题的,因为Linux有内存管理单元,做了地址映射。
user4088306:
回复 Steven Liu1:
您好,首先我在连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,直接修改也无法成功;
不知道我描述清楚了没?感谢您的回复。
Steven Liu1:
回复 user4088306:
我明白了,就是说,你现在是在纯CCS的环境下,连接了PRU和A8,去做了以上操作,PRU的代码也是通过CCS用load memory的方式load进去的对吧?运行起来反汇编也正常,程序也走到了相应的指令了。然后再尝试直接修改A8相关寄存器的值,但是失败了是吧?
在你ARM端的程序中,有没有做GPIO1的初始化呢?如果做了,不通过PRU的程序,直接在ARM端的程序上点灯,或者是通过寄存器读写有问题吗?
user4088306:
回复 Steven Liu1:
是的,我就是按照这个思路走的。ARM端的话我目前只运行了一个您之前给我的AM3358_StarterKit_modif_for_BBB.gel文件,GPIO1的初始化工作我应该是没做,这个初始化工作应该怎样完成?通过GEL文件还是其他方式?感谢您的回复。
Steven Liu1:
回复 user4088306:
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后,你再试试是不是就可以点亮你的灯了(或者直接跑这个例程,找到对应的管脚)