对jz2440上GPIO 的讲解,由于有点太基础,就只说说板子上的LED的控制:
1.JZ2440板载LED:
硬件接口/资源 | 方向 | 控制信号名称 | 描述 | 丝印 |
GPF4 | O | nLED_1 | 低电平点亮 | D10 |
GPF5 | O | nLED_2 | 低电平点亮 | D11 |
GPF6 | O | nLED_3 | 低电平点亮 | D12 |
2. 相应寄存器:
PORT F CONTROL REGISTERS (GPFCON, GPFDAT)
寄存器 | 地址 | R/W | 描述 | 复位值 |
GPFCON | 0x56000050 | R/W | Configures the pins of port F | 0x0 |
GPFDAT | 0x56000054 | R/W | The data register for port F | Undef. |
GPFUP | 0x56000058 | R/W | Pull-up disable register for port F | 0x000 |
GPFCON | Bit | Description |
GPF7 | [15:14] | 00 = Input 01 = Output 10 = EINT[7] 11 = Reserved |
GPF6 | [13:12] | 00 = Input 01 = Output 10 = EINT[6] 11 = Reserved |
GPF5 | [11:10] | 00 = Input 01 = Output 10 = EINT[5] 11 = Reserved |
GPF4 | [9:8] | 00 = Input 01 = Output 10 = EINT[4] 11 = Reserved |
GPF3 | [7:6] | 00 = Input 01 = Output 10 = EINT[3] 11 = Reserved |
GPF2 | [5:4] | 00 = Input 01 = Output 10 = EINT2] 11 = Reserved |
GPF1 | [3:2] | 00 = Input 01 = Output 10 = EINT[1] 11 = Reserved |
GPF0 | [1:0] | 00 = Input 01 = Output 10 = EINT[0] 11 = Reserved |
GPFDAT | Bit | Description |
GPF[7:0] | [7:0] | When the port is configured as an input port, the corresponding bit is the pin state. When the port is configured as an output port, the pin state is the same as the corresponding bit. When the port is configured as functional pin, the undefined value will be read. |
GPFUP | Bit | Description |
GPF[7:0] | [7:0] | 0:使能 1:禁止 |
3. 程序举例:
main.c
#define GPFCON *((volatile unsigned long*)0x56000050)
#define GPFDAT *((volatile unsigned long*)0x56000054)
#define GPFUP *((volatile unsigned long*)0x56000058)
#define LEDON GPFDAT &= ~(1 << 5);
#define LEDOFF GPFDAT |= (1 << 5);
void delay(unsigned long de20ns)
{
unsigned long j;
for (; de20ns; de20ns--);
}
int main(int argc, const char *argv[])
{
GPFCON |= 1 << 2*5; // GPF5
while (1)
{
LEDOFF;
delay(500000);
LEDON;
delay(500000);
}
return 0;
}
程序说明:上边的main.c程序只是程序的一部分,程序的其他部分,可以到git@osc 上下载。下载完之后,将新建一个main.c,将程序写完,更改一下Makefile中的目标文件TARGET指定。make生成目标文件,便能下载到板子上运行了。程序生成都会统一放到build目录下边。
在程序中我只点亮了 D11 灯,并且让他大概是1s的闪烁,至于程序中的延时,说实话,我是试出来的,延时的大概思路是这样的:
板子的 crt.S 中我设置的时钟频率是这样的:FCLK 200MHZ, HCLK 100MHZ, PCLK 50MHZ,GPIO使用的时钟是PCLK(这里的内容如果不懂,可以查看我之前的文章)。因此,单周期指令的执行周期是20ns,但由于存在流水线,所以一个指令执行时占用多少周期是不定的,因此,估算有点困难。我们可以看build目录下边的反汇编文件boot.dis文件查看,delay到底多少语句,然后,大致的估算。