我准备用PRU直接访问gpo[10],对应GPIO4_16(AD21),该管脚连接了LED。
PRU程序如下:
#include <stdint.h>
#include <pru_cfg.h>
#include "resource_table_empty.h"
volatile register uint32_t __R30;
volatile register uint32_t __R31;
void main(){
volatile uint32_t gpio;
/* Clear SYSCFG[STANDBY_INIT] to enable OCP master port */
CT_CFG.SYSCFG_bit.STANDBY_INIT = 0;
/* Toggle GPO pins TODO: Figure out which to use */
gpio = 0x0400;
/* TODO: Create stop condition, else it will toggle indefinitely */
while(1){
__R30 ^= gpio;
__delay_cycles(100000000);
}
/* Halt the PRU core */
__halt();
}
编译后得到PRO_XX.hex的array数组,将其拷贝A9程序中生成PRU_LED_Bin.h,在A9中使用如下代码装载:
PRUICSS_Config *pruIcssCfg;
int32_t ret = PRUICSS_socGetInitCfg(&pruIcssCfg);
if (ret == PRUICSS_RETURN_SUCCESS)
{
pruIcss0Handle = PRUICSS_create((PRUICSS_Config*)pruIcssCfg,1);
PRUICSS_pruDisable(pruIcss0Handle,0);
PRUICSS_pruDisable(pruIcss0Handle,1);
ret = PRUICSS_setPRUBuffer(pruIcss0Handle, 0, (Uint32*)PRU_LED_Firmware, sizeof(PRU_LED_Firmware));
ret = PRUICSS_setPRUBuffer(pruIcss0Handle, 1, (Uint32*)PRU_LED_Firmware, sizeof(PRU_LED_Firmware));
if (ret==0)
{
ret = PRUICSS_pruExecProgram(pruIcss0Handle, 0);
ret = PRUICSS_pruExecProgram(pruIcss0Handle, 1);
}
PRUICSS_pruEnable(pruIcss0Handle,0);
PRUICSS_pruEnable(pruIcss0Handle,1);
}
执行后,对应的LED没有反应,如果直接在A9程序中对GPIO操作则LED正常闪烁。请问有可能是哪个环节的问题?如何进行调试?
user5885945:
看到另外一个帖子里面说需要将GPIO对应的pinmux配置成PRUSS gpo模式,是否修改文件夹C:\ti\pdk_am437x_1_0_4\packages\ti\starterware\board\am43xx里面的pinmux_data.c文件,然后重新编译starterware就可以了?
我试了,还是没有效果。
user5885945:
回复 Nancy Wang:
请问上述步骤(PRU编程、array十六进制数组生成以及在ARM中的代码操作)有问题吗?还是说仅仅是gpo模式没有设置对呢?
如果是,除了通过修改pinmux_data.c设置PinMux,有没有在线通过代码修改PinMux的方法呢?
user5885945:
回复 Nancy Wang:
问题已解决,的确是GPO模式设置的问题。
我先通过Board_Init使能BOARD_INIT_ICSS_PINMUX进行初始化,不过并没有效果。
最后我通过直接对寄存器赋值搞定了。*((unsigned int*) 0x44E109F0) = 4; //PIN_CAM1_DATA2–>Mode 4*((unsigned int*) 0x44E109F4) = 4; //PIN_CAM1_DATA2–>Mode 4*((unsigned int*) 0x44E109F8) = 4; //PIN_CAM1_DATA2–>Mode 4
TI中文支持网
