s3c2440之IO口--流水灯(转载)

1:S3C2440A的多功能引脚概叙

S3C2440A有130个多功能输入/输出管脚,8个端口组,如下所示:

    Port A(GPA):25个输出端口

    Port B(GPB):11个输入/输出端口

    Port C(GPC):16个输入/输出端口

    Port D(GPD):16个输入/输出端口

    Port E(GPE):16个输入/输出端口

    Port F(GPF):8个输入/输出端口

    Port G(GPG):16个输入/输出端口

    Port H(GPH):9个输入/输出端口

    Port J(GPJ):13个输入/输出端口

每个端口都能由软件轻松地配置以适应不同的系统结构和设计要求。开始运行主程序之前你必须定义每个用到了的管脚的功能。如果一个管脚不用来做复合功能管脚,那这个管脚就能配置成I/O端口。

2:端口寄存器

端口配置寄存器GPACON~GPJCON:用来决定复合引脚使用哪个功能。

端口数据寄存器GPADAT~GPJDAT:若端口被配置成输出口,数据能写入PnDAT相应的位,若被配置成输入口,数据能从PnDAT相应位读出。

端口上拉寄存器GPBUP~GPJUP:控制上拉电阻的使能。当相应位为‘0’此引脚的上拉电阻允许,为‘1’则禁止相应引脚的上拉电阻。若上拉寄存器使能则上拉电阻工作而不管引脚功能。

混合控制寄存器:控制数据端口在睡眠模式,USB pad,CLKOUT选择的上拉电阻。

外部中断控制寄存器EXTIN:选择外部中断请求的信号模式,如高电平,抵电平,下降沿,上升沿等。因为每个中断引脚都有一个数字滤波器,所以中断控制器能辨认出长于3 clocks的请求信号。EINT[15:0]被用作唤醒源。

3:2440的初始化代码

   该段代码主要用来初始化2440处理器,并跳转到C函数处。

.text         @ 声明代码段                           
.global _start            @ 作用类似于extern
_start:             
   ldr     r0, =0x53000000     @ WATCHDOG寄存器地址@
   mov     r1, #0x0                           
   str     r1, [r0]            @ 写入0,禁止WATCHDOG,否则CPU会不断重启 这里采用读-写-修改@

   ldr     r0, = 0x4C000014    @ CLKDINV
   mov     r1, #0
   str     r1,[r0]

   ldr     sp, = 4096          @ 设置堆栈,注意:不能大于4k, 因为现在可用的内存只有4K@
   bl      main                @ 调用C程序中的main函数
halt_loop:
   b       halt_loop

4:LED点灯C部分

硬件部分:mini2440的GPB5~8引脚分别连接着LED1~4。

#define GPBCON (*(volatile unsigned long *)0x56000010) /* GPB端口控制寄存器地址*/

#define GPBDAT (*(volatile unsigned long *)0x56000014) /* GPB端口数据寄存器地址*/

#define LOCKTIME       (*(volatile unsigned long *)0x4C000000)

#define MPLLCON        (*(volatile unsigned long *)0x4C000004) /* MPLLCON寄存器地址 */

#define UPLLCON        (*(volatile unsigned long *)0x4C000008)


#define GPB5_out (1<<(5*2)) /* GPB5是由GPBCON的bit[11:10]两位来控制 */

#define GPB6_out (1<<(6*2)) /* 00-input 01-output */

#define GPB7_out (1<<(7*2)) /* 明确由输出高电平还是由低电平来点亮 */

#define GPB8_out (1<<(8*2)) /* 故要将GPB5678四个IO口设置为输出      */


/* FCLK = 271.5M */

#define M_MDIV 0xad

#define M_PDIV 2

#define M_SDIV 2

#define U_MDIV 0x38

#define U_PDIV 2

#define U_SDIV 2


/*** 延时函数*/

void wait(unsigned long time)

{

    int i;

    for (i = 0; i < time; i++);

}


int main(void) /* 主函数 */

{

unsigned long j,i = 0;


    GPBCON = GPB5_out|GPB6_out|GPB7_out|GPB8_out; /* 将LED对应的GPB5678四个引脚设为输出*/

    LOCKTIME = 0xFFFFFF;

    UPLLCON = ((U_MDIV << 12) + (U_PDIV << 4) + U_SDIV);

    delay(0xffff);

    delay(0xffff);

    MPLLCON = ((M_MDIV << 12) + (M_PDIV << 4) + M_SDIV);

    delay(0xffff);

delay(0xffff);


while(1)

{       

    for (j = 0; j < 10; j++){

    delay(0xffff);

    }

    GPBDAT = (~(i<<5));

    if(++i == 16)

    i = 0;     

    }

    return 0;

}

/**说明**/

S3c2440在时钟设置时,需要先设置UPLLCON寄存器,后设置MPLLCON寄存器,而且之间还需要有一定的延时。

5:编译,下载调试。

你可能感兴趣的:(c,工作,IO,delay)