一、调试目的及相关知识
目的:使能GP1[1]引脚作为输出IO,输出高低电平。
相关知识:1、谁为GPIO供电? (alwon电源域)
2、谁为GPIO提供时钟?(
由两种时钟源:1、SYSCLK6提供interface clock
2、SYSCLK18 提供Debounce Functionalclock 应用消抖 )
二、硬件图
由上图可知将U2复用引脚配置成 GP1[1]功能
三、软件
基本思路:
第一步:电源、时钟
GPIO使用alwon电源域,始终供电(只要开发板上电)。而GPIO时钟在evm816x.gel文件中开启。
Setup_PRCM()
{
.......................................................
/* Enable the OCMC1RAM Clocks */
.................................
WR_MEM_32(CM_ALWON_L3_SLOW_CLKSTCTRL, 0x2); // Enable the Power Domain Transition of L3 Slow Domain Peripheral
while((RD_MEM_32(CM_ALWON_L3_SLOW_CLKSTCTRL) & 0x2) !=0x2);
while((RD_MEM_32(0x4818154c) & 0x3) !=0x2);
WR_MEM_32(0x4818155c, 0x102); // Enable GPIO0 Clock
while((RD_MEM_32(0x4818155c) & 0x3) !=0x2);
WR_MEM_32(0x48181560, 0x102); // Enable GPIO1 Clock
while((RD_MEM_32(0x48181560) & 0x3) !=0x2);
................................................................
GEL_TextOut("PRCM Setup Complete\n");
}
第二步:复用引脚配置
在evm816x.gel文件配置 或用户程序中配置。
第一种:在evm816x.gel文件中
Setup_PADCTRL( )
{
GEL_TextOut( "Configuring Pad Functions...\n" );
.................................................
*(unsigned int *)(0x48140A74) = 0x0A; //配置成GP1[1]
}
第二种:在用户程序中设置
main()
{ ............................................................................
*(volatile Uint32 *)(0x48140A78) = 0x0A; //配置成GP1[2]
}
第三步:输出、数据等设置
在用户程序中设置
void main( void )
{
..........................................................
*(volatile Uint32 *)(0x48140A78) = 0x0A;
*(volatile Uint32 *)(0x4804C134) = 0xFFF0;//配置GPIO1_OE,设置GPIO1[3:0]为输出
while(1)
{
*(volatile Uint32 *)(0x4804C13C) = 0x0F; //配置GPIO1_DATAOUT,设置GPIO1[3:0]为高电平
EVM816X_waitmsec(50);
*(volatile Uint32 *)(0x4804C13C) = 0x00;//配置GPIO1_DATAOUT,设置GPIO1[3:0]为低电平
EVM816X_waitmsec(50);
}
}
四、现象
GP1[1]引脚输出大约50ms方波,而GP1[2]引脚输出0.5V电平。why?
1、 通过JTAG调试,查看复用引脚配置寄存器PINCTRL可知:查看PINCTRL158配置GP1[1]成功,而PINCTRL159配置GP1[2]失败。
而PINCTRL寄存器定义如下:
2、导致原因及解决办法
因为DM8168工作模式导致的,默认工作在usr用户模式,而有些寄存器设置(时钟配置寄存器、引脚复用寄存器等)需要在Supervisor模式设置。所以需要修改为Supervisor模式。具体操作详见:http://www.eeskill.com/group/topic/id/1669。