我准备用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